【STM32】最后一刷-江科大Flash闪存-学习笔记
FLASH简介
- STM32F1系列的FLASH包含程序存储器、系统存储器和选项字节三个部分,通过闪存存储器接口(外设)可以对程序存储器和选项字节进行擦除和编程,(系统存储器用于存储原厂写入的BootLoader程序,用于串口下载,不允许我们修改)
- 读写FLASH的用途:
- 利用程序存储器的剩余空间来保存掉电不丢失的用户数据
- 通过在程序中编程(IAP),实现程序的自我更新
在线编程(In-Circuit Programming – ICP)用于更新程序存储器的全部内容,它通过JTAG、SWD协议或系统加载程序(Bootloader)下载程序
在程序中编程(In-Application Programming – IAP)可以使用微控制器支持的任一种通信接口下载程序
存储器映像参考这篇:【江协科技STM32】DMA直接存储器存储-学习笔记_江科 stm32 dma-CSDN博客

闪存模块组织

对应主存储器,进行了分页,分页是为了更好地管理闪存,擦除和写保护都是以页为单位的,这一点和之前的W25Q64的闪存一样,写入前必须擦除等等。具体参考Flash操作注意事项:【STM32】SPI通信协议&W25Q64Flash存储器芯片(学习笔记)_spi存储芯片-CSDN博客
FLASH基本结构

FLASH解锁(解除闪存锁)
FPEC共有三个键值:
- RDPRT键 = 0x000000A5(解除读保护密钥)
- KEY1 = 0x45670123
- KEY2 = 0xCDEF89AB
- 解锁:
- 复位后,FPEC被保护,不能写入FLASH_CR
- 在FLASH_KEYR先写入KEY1,再写入KEY2,解锁
- 错误的操作序列会在下次复位前锁死FPEC和FLASH_CR
加锁:
- 置FLASH_CR中的LOCK位锁住FPEC和FLASH_CR

使用指针访问存储器

uint16_t Data = *((__IO uint16_t *)(0x08000000));
这行代码是在 C 语言中用于从特定内存地址读取数据,并将其赋值给变量Data。解释如下:
uint16_t是一种无符号 16 位整数类型,定义在<stdint.h>头文件中,确保了数据类型的宽度为 16 位,可表示的范围是 0 到 65535。Data是定义的一个uint16_t类型的变量,用于存储从特定内存地址读取的数据。(__IO uint16_t *)(0x08000000):这部分是一个强制类型转换。(__IO uint16_t *)将0x08000000这个地址值转换为指向__IO uint16_t类型的指针。其中__IO通常是由编译器定义的宏,可能表示该内存地址是可读写(volatile)的,防止编译器对该地址的访问进行优化,确保每次访问都是真实地从该内存地址读写数据。0x08000000是一个十六进制表示的内存地址。*((__IO uint16_t *)(0x08000000)):这部分通过指针解引用操作,从0x08000000这个内存地址读取一个uint16_t类型的数据。- 最后,将从指定内存地址读取的数据赋值给
Data变量。
*((__IO uint16_t *)(0x08000000)) = 0x1234;
- 指针类型强制转换
(__IO uint16_t *)(0x08000000)这部分代码将地址值0x08000000强制转换为一个指向__IO uint16_t类型的指针。其中__IO可能是一个特定的修饰符,通常用于表示该内存位置具有特殊的读写属性(例如可能是与外设寄存器相关,允许读写操作),uint16_t表示无符号 16 位整数类型。通过这种强制类型转换,告诉编译器把0x08000000这个地址当作是一个__IO uint16_t类型数据的起始地址。 - 赋值操作
在完成指针类型强制转换后,使用*运算符对这个指针进行解引用,然后将值0x1234赋给该指针所指向的内存位置。也就是将0x1234这个 16 位无符号整数值写入到了内存地址0x08000000开始的两个字节(因为uint16_t是 16 位,占两个字节)。
实例
指定地址下读:
/*** 函 数:FLASH读取一个32位的字* 参 数:Address 要读取数据的字地址* 返 回 值:指定地址下的数据*/
uint32_t HerFlash_ReadWord(uint32_t Address)
{return *((__IO uint32_t *)(Address)); //使用指针访问指定地址下的数据并返回
}/*** 函 数:FLASH读取一个16位的半字* 参 数:Address 要读取数据的半字地址* 返 回 值:指定地址下的数据*/
uint16_t HerFlash_ReadHalfWord(uint32_t Address)
{return *((__IO uint16_t *)(Address)); //使用指针访问指定地址下的数据并返回
}/*** 函 数:FLASH读取一个8位的字节* 参 数:Address 要读取数据的字节地址* 返 回 值:指定地址下的数据*/
uint8_t HerFlash_ReadByte(uint32_t Address)
{return *((__IO uint8_t *)(Address));//使用指针访问指定地址下的数据并返回
}
程序存储器全擦除

-
第一步:读 FLASH_CR 的 LOCK 位
- 理由:LOCK 位用于锁定闪存控制寄存器(FLASH_CR),在对闪存进行擦除等操作前,需要先了解其锁定状态。如果 LOCK 位 = 1,表示闪存处于锁定状态,不能直接进行后续的擦除操作,需要先执行解锁过程;若 LOCK 位 = 0,则可跳过解锁过程直接进行擦除设置。
- 操作及结果:读取该位,得到 LOCK 位 = 1,说明闪存处于锁定状态。
-
第二步:执行解锁过程
- 理由:因为第一步检测到 LOCK 位为 1,闪存锁定,所以必须执行解锁过程才能对闪存控制寄存器进行操作,以实现擦除等功能。
- 操作及结果:执行解锁过程后,将 LOCK 位置为 0,此时闪存解锁,可以对相关寄存器进行设置。
-
第三步:置 FLASH_CR 的 MER = 1
- 理由:MER(Mass Erase)位用于选择是否进行全擦除操作。将 MER 位置 1,表示要进行闪存全擦除操作。
- 操作及结果:将 MER 位置 1,准备执行全擦除。
-
第四步:置 FLASH_CR 的 STRT = 1
- 理由:STRT(Start)位用于启动闪存擦除操作。当 MER 位已置 1 准备好全擦除,再将 STRT 位置 1,就可以正式启动全擦除过程。
- 操作及结果:将 STRT 位置 1,闪存全擦除操作开始执行。
-
第五步:关注 FLASH_SR 的 BSY 位
- 理由:BSY(Busy)位用于指示闪存操作是否正在进行。在全擦除操作启动后,需要监测该位来判断擦除操作是否完成。当 BSY = 1 时,表示闪存操作正在进行中;当 BSY = 0 时,表示闪存操作已完成。
- 操作及结果:在全擦除操作执行过程中,BSY 位会变为 1,表示操作正在进行。等待一段时间后,当 BSY 位变为 0,说明全擦除操作完成。
-
第六步:读出并验证所有页的数据
- 理由:全擦除操作完成后,需要验证是否所有页的数据都已被正确擦除。通过读出所有页的数据,并与预期的擦除后数据(一般为全 1 或特定的擦除后状态)进行比较,来验证擦除操作的正确性。
- 操作及结果:读出所有页的数据,与预期的擦除后数据进行对比,若完全一致,则说明全擦除操作成功;若有不一致的地方,则说明擦除操作可能存在问题。
实例
/*** 函 数:FLASH全擦除* 参 数:无* 返 回 值:无* 说 明:调用此函数后,FLASH的所有页都会被擦除,包括程序文件本身,擦除后,程序将不复存在*/
void HerFlash_EraseAllPages(void)
{FLASH_Unlock(); //解锁FLASH_EraseAllPages(); //全擦除FLASH_Lock(); //加锁
}
void FLASH_Unlock(void)//解锁FLASH程序擦除控制器(解锁)
void FLASH_Lock(void)//锁定FLASH程序擦除控制器
FLASH_Status FLASH_EraseAllPages(void)//擦除所有FLASH页面
注意:以上功能可用于所有STM32F10x器件
程序存储器页擦除

- 读取锁定状态:首先读取闪存控制寄存器(
FLASH_CR)的LOCK位,判断闪存是否处于锁定状态。 - 解锁操作(若需):若
LOCK位为1(锁定状态),执行解锁过程;若为0,跳过解锁。 - 配置擦除参数:
- 置
FLASH_CR的PER(Page Erase,页擦除使能)位为1; - 在
FLASH_AR(地址寄存器)中选择要擦除的闪存页; - 置
FLASH_CR的STRT(Start,启动)位为1,启动页擦除操作。
- 置
- 等待擦除完成:监测闪存状态寄存器(
FLASH_SR)的BSY(Busy,忙)位。若BSY=1,表示擦除仍在进行,需持续等待;若BSY=0,表示擦除完成。 - 验证擦除结果:擦除完成后,读出并验证被擦除页的数据,确保擦除操作成功。
实例
/*** 函 数:FLASH页擦除* 参 数:PageAddress 要擦除页的页地址* 返 回 值:无*/
void HerFlash_ErasePage(uint32_t PageAddress)
{FLASH_Unlock();FLASH_ErasePage(PageAddress);FLASH_Lock();
}
FLASH_Status FLASH_ErasePage(uint32_t Page_Address)//擦除指定的FLASH页面
注意:此功能可用于所有STM32F10x器件
程序存储器编程

注意:这种模式下CPU以标准的写半字的方式烧写闪存, FLASH_CR寄存器的PG位必须置’1’。 FPEC先读出指定地址的内容并检查它是否被擦除,如未被擦除则不执行编程并在FLASH_SR寄存器的PGERR位提出警告(唯一的例外是当要烧写的数值是0x0000时, 0x0000可被正确烧入且PGERR位不被置位);如果指定的地址在FLASH_WRPR中设定为写保护,则不执行编程并在FLASH_SR寄存器的WRPRTERR位置’1’提出警告。 FLASH_SR寄存器的EOP为’1’时表示编程结束。
编程过程讲解:
- 读取锁定状态:首先读取闪存控制寄存器(
FLASH_CR)的LOCK位,判断闪存是否处于锁定状态。 - 解锁操作(若需):若
LOCK位为1(锁定状态),执行解锁序列;若为0,直接进入下一步。 - 使能编程模式:将
FLASH_CR寄存器的PG位(Program,编程使能)置为1,开启编程功能。 - 写入数据:在指定的闪存地址中写入半字(16 位)数据。用到这句代码 *((__IO uint16_t *)(0x08000000)) = 0x1234;
- 等待操作完成:监测闪存状态寄存器(
FLASH_SR)的BSY(Busy,忙)位。若BSY=1,表示编程操作仍在进行,需持续等待;若BSY=0,表示编程操作完成。 - 验证数据:读取编程地址中的数据,检查写入的数据是否正确,确保编程操作成功。
实例
/*** 函 数:FLASH编程字* 参 数:Address 要写入数据的字地址* 参 数:Data 要写入的32位数据* 返 回 值:无*/
void HerFLASH_ProgramWord(uint32_t Address, uint32_t Data)
{FLASH_Unlock();FLASH_ProgramWord(Address, Data);FLASH_Lock();
}/*** 函 数:FLASH编程字* 参 数:Address 要写入数据的半字地址* 参 数:Data 要写入的16位数据* 返 回 值:无*/
void HerFLASH_ProgramHalfWord(uint32_t Address, uint16_t Data)
{FLASH_Unlock();FLASH_ProgramHalfWord(Address, Data);FLASH_Lock();
}
FLASH_Status FLASH_ProgramWord(uint32_t Address, uint32_t Data)//在指定地址编程一个字
注意:以上功能可用于所有STM32F10x器件
| 参数 | 说明 |
| Address | 指定要编程的地址 |
| Data | 指定要编程的数据 |
FLASH_Status FLASH_ProgramHalfWord(uint32_t Address, uint16_t Data)//在指定地址上编程半个字
| 参数 | 说明 |
| Address | 指定要编程的地址 |
| Data | 指定要编程的数据 |
注意:以上功能可用于所有STM32F10x器件
选择字节说明

- RDP:写入RDPRT键(0x000000A5)后解除读保护
- USER:配置硬件看门狗和进入停机/待机模式是否产生复位
- Data0/1:用户可自定义使用
- WRP0/1/2/3:配置写保护,每一个位对应保护4个存储页(中容量)

选项字节擦除
- 检查FLASH_SR的BSY位,以确认没有其他正在进行的闪存操作
- 解锁FLASH_CR的OPTWRE位
- 设置FLASH_CR的OPTER位为1
- 设置FLASH_CR的STRT位为1
- 等待BSY位变为0
- 读出被擦除的选择字节并做验证

选项字节编程

- 检查FLASH_SR的BSY位,以确认没有其他正在进行的编程操作
- 解锁FLASH_CR的OPTWRE位
- 设置FLASH_CR的OPTPG位为1
- 写入要编程的半字到指定的地址
- 等待BSY位变为0
- 读出写入的地址并验证数据
读取内部FLASH闪存
要实现数据掉电不丢失的存储,那就要基于底层代码,再建一个模块Store,在Store模块我们要用SRAM缓存数组来管理FLASH闪存的最后一页,实现参数的任意读写和保存。因为闪存每次都是擦除,再写入,擦除之后,还容易丢失数据,所以要想灵活管理数据,还是得靠SRAM数组,需要备份的时候,我们再统一转到闪存里。所以在Store模块里要先定义一个Store_数组,用于存放备份数据。
参数存储模块初始化
#define STORE_START_ADDRESS 0x0800FC00
#define STORE_DATA 512uint16_t Store_Data[STORE_DATA]; //定义SRAM数字,512个数据,每个数据16位,2字节,刚好对应闪存一页1024字节void Store_Init(void)
{/*判断是不是第一次使用*/if(HerFlash_ReadHalfWord(STORE_START_ADDRESS) != 0xA8A8){HerFlash_ErasePage(STORE_START_ADDRESS);HerFLASH_ProgramHalfWord(STORE_START_ADDRESS, 0xA8A8);//在第一个半字写入自己规定的标志位,用于判断是不是第一次使用for(uint16_t i =1; i < STORE_DATA; i ++) //循环STORE_COUNT次,除了第一个标志位{HerFLASH_ProgramHalfWord(STORE_START_ADDRESS + i * 2,0x0000);//除了标志位的有效数据全部清0}}/*上电时,将闪存数据加载回SRAM数组,实现SRAM数组的掉电不丢失*/for(uint16_t i =0;i < STORE_DATA; i ++){Store_Data[i] = HerFlash_ReadHalfWord(STORE_START_ADDRESS + i * 2);//将闪存的数据加载回SRAM数组}
}
参数存储模块保存数据到闪存
/*** 函 数:参数存储模块保存数据到闪存* 参 数:无* 返 回 值:无*/
void Store_Save(void)
{HerFlash_ErasePage(STORE_START_ADDRESS);for(uint16_t i = 0;i < STORE_DATA;i ++) //循环STORE_COUNT次,包括第一个标志位{HerFLASH_ProgramHalfWord(STORE_START_ADDRESS +i*2, Store_Data[i]);//将SRAM数组的数据备份保存到闪存}
}
参数存储模块将所有有效数据清0
/*** 函 数:参数存储模块将所有有效数据清0* 参 数:无* 返 回 值:无*/
void Store_Clear(void)
{for(uint16_t i = 1;i < STORE_DATA;i ++){Store_Data[i] = 0x0000; //SRAM数组有效数据清0} Store_Save(); //保存数据到闪存
}
最终梳理思路:梳理思路
其实就是,在主函数对SRAM数组Store_Data进行修改,然后在放到闪存,防止SRAM掉电丢失,然后在上电初始化的时候在把闪存的数据再读取到SRAMStore_Data数组,实现SRAM掉电不丢失
main函数
#uint8_t KeyNum; //定义用于接收按键键码的变量int main(void)
{/*模块初始化*/OLED_Init(); //OLED初始化Key_Init(); //按键初始化Store_Init(); //参数存储模块初始化,在上电的时候将闪存的数据加载回Store_Data,实现掉电不丢失/*显示静态字符串*/OLED_ShowString(1, 1, "Flag:");OLED_ShowString(2, 1, "Data:");while (1){KeyNum = Key_GetNum(); //获取按键键码if (KeyNum == 1) //按键1按下{Store_Data[1] = 0x1234; //变换测试数据,断电丢失Store_Data[2] = 0xABCD;Store_Data[3] += 3;Store_Data[4] += 4;Store_Save(); //将Store_Data的数据备份保存到闪存,实现掉电不丢失}if (KeyNum == 2) //按键2按下{Store_Clear(); //将Store_Data的数据全部清0}OLED_ShowHexNum(1, 6, Store_Data[0], 4); //显示Store_Data的第一位标志位OLED_ShowHexNum(3, 1, Store_Data[1], 4); //显示Store_Data的有效存储数据OLED_ShowHexNum(3, 6, Store_Data[2], 4);OLED_ShowHexNum(4, 1, Store_Data[3], 4);OLED_ShowHexNum(4, 6, Store_Data[4], 4);}
}
结果
注意一个问题:程序文件大小和用户数据大小的冲突

程序占用空间大小

器件电子签名&读取芯片ID
电子签名存放在闪存存储器模块的系统存储区域,包含的芯片识别信息在出厂时编写,不可更改,使用指针读指定地址下的存储器可获取电子签名
闪存容量寄存器:
- 基地址:0x1FFF F7E0
- 大小:16位
产品唯一身份标识寄存器:
- 基地址: 0x1FFF F7E8
- 大小:96位

int main(void)
{OLED_Init(); OLED_ShowString(1, 1, "F_SIZE:"); OLED_ShowHexNum(1, 8, *((__IO uint16_t *)(0x1FFFF7E0)), 4); //使用指针读取指定地址下的闪存容量寄存器OLED_ShowString(2, 1, "U_ID:"); OLED_ShowHexNum(2, 6, *((__IO uint16_t *)(0x1FFFF7E8)), 4); //使用指针读取指定地址下的产品唯一身份标识寄存器OLED_ShowHexNum(2, 11, *((__IO uint16_t *)(0x1FFFF7E8 + 0x02)), 4);OLED_ShowHexNum(3, 1, *((__IO uint32_t *)(0x1FFFF7E8 + 0x04)), 8);OLED_ShowHexNum(4, 1, *((__IO uint32_t *)(0x1FFFF7E8 + 0x08)), 8);while (1){}
}
结果

最后记得看数据手册,这东西是真的能看懂 学会 学到知识!!!!
相关文章:
【STM32】最后一刷-江科大Flash闪存-学习笔记
FLASH简介 STM32F1系列的FLASH包含程序存储器、系统存储器和选项字节三个部分,通过闪存存储器接口(外设)可以对程序存储器和选项字节进行擦除和编程,(系统存储器用于存储原厂写入的BootLoader程序,用于串口…...
JS实现动态点图酷炫效果
实现目标 分析问题 整个图主要是用canvas实现,其中难点是将线的长度控制在一定范围内、并且透明度随长度变化。 前置知识 canvas绘制点、线、三角形、弧形 // 点ctx.moveTo(this.x, this.y);ctx.arc(this.x, this.y, this.r,0, 2 * Math.PI, false);ctx.fillStyle …...
【第十三届“泰迪杯”数据挖掘挑战赛】【2025泰迪杯】【思路篇】A题解题全流程(持续更新)
【第十三届“泰迪杯”数据挖掘挑战赛】【2025泰迪杯】A题解题全流程-思路(持续更新) 写在前面: 1、A题、C题将会持续更新,陆续更新发布文章 2、赛题交流咨询Q群:1037590285 3、全家桶依旧包含: 代码、…...
爱普生晶体单元FC2012AN在5G RedCap中的应用
在 5G 技术向物联网领域深度渗透的今天,RedCap(5G 轻量化)作为衔接中高速物联网场景的关键技术,正加速推动工业、医疗、可穿戴等领域的智能化升级。爱普生 FC2012AN 低 ESR 晶体单元凭借其突破性的小尺寸、低功耗与高稳定性设计&a…...
vue 两种路由模式
一、两种模式比较 在vue.js中,路由模式分为两种:hash 模式和 history 模式。这两种模式决定了URL的结构和浏览器历史记录的管理方式。 1. hash 模式带 #,#后面的地址变化不会引起页面的刷新。换句话说,hash模式不会将#后面的地址…...
Java-servlet(十)使用过滤器,请求调度程序和Servlet线程(附带图谱表格更好对比理解)
Java-servlet(十)使用过滤器,请求调度程序和Servlet线程 前言一、Servlet 间通信(了解即可)二、Servlet 请求处理:getAttribute 和 getParameter 的区别与应用1.getAttribute 方法2.getParameter 方法 三、…...
ue5 学习笔记 FPS游戏制作35 GameMode与GameInstance
文章目录 相似GameMode介绍声明设置生效调用 GameInstance介绍声明设置生效调用 相似 两者都用来保存公共的数据和方法 数据都在内存里,关闭程序后数据消失 GameMode 介绍 生命周期跟随关卡,关卡销毁GameMode也跟随销毁 内部可以定义属性和方法 声明…...
rocky9.4 升级SSH 9.9p2
echo "##################################开始升级Openssh##################################################################################" ##ssh变量---------------------------------------- sshnumber9.9p2 sshnumber1ssh -V 2>&1 | cut -d, -f…...
基于WebSocket的金融数据实时推送系统架构设计对接多国金融数据API
基于WebSocket的金融数据实时推送系统架构设计 ——高可用、低延迟与全球化数据支持的技术实践 一、实时数据推送的技术演进 在证券交易、外汇监控、量化策略等场景中,毫秒级延迟可能带来完全不同的业务结果。早期基于HTTP轮询的方案存在三大核心问题:…...
山洪预警秒级响应-AI本地化部署在极端降雨短临预测中的技术突破。AI智能体开发与大语言模型的本地化部署、优化技术
极端降雨预测的技术痛点与边缘破局 1. 传统预警系统的三重瓶颈 延迟致命:WRF模式在1km分辨率下3小时预报耗时>45分钟,错过山洪黄金响应期 地形干扰大:复杂地形区(如横断山脉)降水预测误差超50% 数…...
矿山自动化监测解决方案
1.行业现状 为贯彻落实《中共中央国务院关于推进安全生产领域改革发展的意见》《“十四五”矿山安全生产规划》(应急〔2022〕64号)、《国务院安委会办公室关于加强矿山安全生产工作的紧急通知》(安委办〔2021〕3号)等有关工作部署…...
pytorch学习(b站小土堆学习)
1 环境配置 参考链接 2. dir 和 help函数 dir():用于查看某一模块函数的方法 help(): 用于查看某方法的使用方法 3. dataset类实战 利用Image对象打开图片,利用os模块的地址拼接组成图片路径 当我们用方括号访问元素对象时,…...
微信小程序:解决tabbar切换时,页面不刷新问题
在微信小程序中,默认情况下切换 tabBar 页面时,页面不会重新加载或刷新(而是保持之前的状态)。如果你需要在切换 tabBar 时触发数据刷新或重新执行某些逻辑,可以通过以下方法解决: 方法 1:…...
【最新】探索CFD的未来:从OpenFOAM到深度学习,全面解析计算流体力学的顶级资源与前沿技术
计算流体力学(CFD)作为现代工程与科学研究的核心工具,正以前所未有的速度迈向智能化与多物理场耦合的新时代。本文全面梳理了在线学习CFD的顶级资源,涵盖了从传统数值模拟到深度学习驱动的物理信息模型的广泛领域,旨在为研究者、工程师和学生提供一站式参考指南。内容分为…...
算法专题一:双指针算法(下)
书接上回 5.有效三角形个数 力扣: 有效三角形的个数 在做这道题前我们先讲一个数学知识:已知 a < b < c ,此时 ab>c 可以得出 有效三角形。 所以,我们做这道题时,可以不使用暴力算法。 可以优化为先排序ÿ…...
数据库部署在服务器表不存在解决方案
MySQL 数据库表不存在错误解决方案 MySqlException (0x80004005): Table store.SysLogOperate doesnt exist 服务器用的mysql5.6 用这个表syslogoperate只是全是小写 看起来你在使用 Pomelo.EntityFrameworkCore.MySql 作为 MySQL 数据库的提供程序,并且在初始化…...
咪咕MG101_晨星MSO9380芯片_安卓5.1.1_免拆卡刷固件包
咪咕MG101_晨星MSO9380芯片_安卓5.1.1_免拆卡刷固件包(内有教程) 刷机教程简单说明: 1、把下载好的刷机包,U盘里建立一个upgrade文件夹,固件放入此文件夹里,放入U盘中,注意升级包为压缩包不要对…...
cJSON类型及type值详解
cJSON的核心结构体 cJSON的核心结构体就是一个cJSON,理解了这个结构体,基本上对cJSON的使用就有了个基本概念了。该结构体具体定义如下: typedef struct cJSON { struct cJSON*next,*prev; /* 遍历数组或对象链的前向或后向链表指…...
T11 TensorFlow入门实战——优化器对比实验
🍨 本文為🔗365天深度學習訓練營 中的學習紀錄博客🍖 原作者:K同学啊 | 接輔導、項目定制 一、前期准备 1. 导入数据 # Import the required libraries import pathlib import matplotlib.pyplot as plt import tensorflow as t…...
2023年3月全国计算机等级考试真题(二级C语言)
😀 第1题 下列叙述中错误的是 A. 向量是线性结构 B. 非空线性结构中只有一个结点没有前件 C. 非空线性结构中只有一个结点没有后件 D. 只有一个根结点和一个叶子结点的结构必定是线性结构 概念澄清 首先,我们需要明确几个关键概念…...
在MFC中使用Qt(四):使用属性表(Property Sheet)实现自动化Qt编译流程
前言 首先回顾下前面文章介绍的: 在MFC中使用Qt(一):玩腻了MFC,试试在MFC中使用Qt!(手动配置编译Qt) 在MFC中使用Qt(二):实现Qt文件的自动编译流…...
Python-八股总结
目录 1 python 垃圾处理机制2 yield3 python 多继承,两个父类有同名方法怎么办?4 python 多线程/多进程/协程4.1 多线程与GIL全局解释器锁4.2 多进程4.3 协程 5 乐观锁/悲观锁6 基本数据结构**1. 列表(List)****2. 元组࿰…...
局域网数据同步软件,局域网数据备份的方法
局域网数据备份的方法: 局域网数据备份是确保数据安全性的重要措施,以下是一些常用的局域网数据备份方法: 1.使用NAS设备备份 特点:网络附加存储(NAS)设备提供了一种便捷的备份方式。 操作:…...
ngx_http_core_init_main_conf
定义在 src\http\ngx_http_core_module.c static char * ngx_http_core_init_main_conf(ngx_conf_t *cf, void *conf) {ngx_http_core_main_conf_t *cmcf conf;ngx_conf_init_uint_value(cmcf->server_names_hash_max_size, 512);ngx_conf_init_uint_value(cmcf->serv…...
座舱与智驾“双轮驱动”,芯擎科技打造智能汽车“芯”标杆
在比亚迪、吉利、奇瑞等各大主机厂打响“全民智驾”的关键时期,以芯擎科技为代表中国芯片厂商开始“放大招”。 2025年3月27日,芯擎科技在南京举办了“擎随芯动、智融万象”生态科技日,重磅发布了“星辰一号”、“星辰一号Lite”,…...
《新能源汽车 DEEA 平台开发策略》
一、引言 在新能源汽车行业加速向智能化、电动化转型的当下,电子电气架构(EEA)成为汽车技术创新的关键领域。DEEA 平台作为应对行业变革的重要举措,其开发策略对于提升汽车产品竞争力、满足市场多样化需求意义重大。本策略围绕平台…...
R语言实现轨迹分析--traj和lcmm包体会
R语言实现轨迹分析–traj和lcmm包体会 轨迹分析是对重复测量数据的一种归纳,转化为一种分类变量,比如手术后1~7天内的疼痛评分,可以形成术后急性痛轨迹。形成的轨迹作为一个分类变量,可以用于预测疾病的预后ÿ…...
Spring Boot中对同一接口定义多个切面的示例,分别通过接口方式和注解方式实现切面排序,并对比差异
以下是Spring Boot中对同一接口定义多个切面的示例,分别通过接口方式和注解方式实现切面排序,并对比差异: 一、接口方式实现切面排序 1. 定义接口 // 服务接口 public interface MyService {void methodA();void methodB(); }// 接口实现类…...
从零开始:Windows 系统中 PowerShell 配置 FFmpeg 的详细步骤
在Windows系统中不想每次都 cd 到FFmpeg目录中应用,现在可以通过PowerShell在任意目录下应用了。 PowerShell 基础概念 跨平台脚本工具 PowerShell 是微软开发的命令行外壳和脚本语言,支持 Windows、Linux 和 macOS 系统。其核心优势在于面向对象的操作…...
《新凯来 :中国半导体设备制造行业从“跟随者”向“挑战者”的角色转变》
《新凯来 :中国半导体设备制造行业从“跟随者”向“挑战者”的角色转变》 一、技术突破再升级二、生态布局加速三、市场与资本动态四、未来挑战与应对五、行业意义 新凯来作为国产半导体设备领域的领军企业,其技术突破与市场进展持续引发行业关注。结合最…...




