}
要对内部Flash某个地址写入数据时,需要确保该地址数值为0xFFFF。判断方法就是从扇区内的偏移开始,利用for循环判断读出地扇区剩余空间内,是否存在已经被写入内容的地址。for循环找到i的值,i加上在扇区内的偏移加1之后的空间,才是真正的扇区剩余空间大小。
for循环结束后,判断是否需要进行擦除
// 需要擦除
if (i < secremain)
{
FLASH_ErasePage(secpos * STM32_SECTOR_SIZE + STM32_FLASH_BASE); // 擦除这个扇区
// 复制
for (i = 0;i < secremain;i ++)
{
STM32_FLASH_BUF[i + secoff] = pBuffer[i];
}
// 写入整个扇区
Med_Flash_Write_NoCheck(secpos * STM32_SECTOR_SIZE + STM32_FLASH_BASE,STM32_FLASH_BUF,STM32_SECTOR_SIZE / 2);
}
else
{
// 写已经擦除了的,直接写入扇区剩余区间
Med_Flash_Write_NoCheck(WriteAddr,pBuffer,secremain);
}
擦除时,最小单元为一个扇区。在大容量产品中,也就是2048字节。
• 最后,将需要写入的数据,写入到对应位置。如果是需要擦除的情况,写入时是先将原来的内容提取出来,然后在后面填充上需要写入的内容,擦除整个扇区之后再一起写入。如果是不需要擦除的情况,直接写入即可。
五、注意事项
在操作Flash时,注意不要对代码区内容进行擦写。如果擦写的地址在代码区,会导致程序运行异常。那么如何确保我们操作的地址不是在代码区?这就需要我们知道我们的代码所占的内存是多少。在Keil5编译完成后,会显示下面的内容
keil5编译后提示
• Code 程序所占用的内存大小(存放在Flash中)
• RO-data 程序定义的常量所占内存大小(存放在Flash中)
• RW-data 已被初始化的全局变量所占内存大小(在程序初始化的时候,RW-data会从FLASH中拷贝到RAM中)
ZI-data 未被初始化的全局变量所占内存大小(存放在RAM中)
最后,计算程序代码所占Flash空间。flash = Code + RO-data + RW-data。
上一篇:STM32基础知识:串口通信-轮询方式
下一篇:STM32CubeMx计数器基本使用方法
推荐阅读最新更新时间:2024-11-02 15:30
设计资源 培训 开发板 精华推荐
- LT1584CT 7A 低压差稳压器的典型应用
- REF198 精密微功率、低压差堆叠电压基准的典型应用电路
- #第七届立创电赛#卡片收音机基于RDA5807FP
- LT1120、9V 至 5V 线性稳压器
- 具有 PowerPath 的 LTC4162EUFD-FSTM 1 节 USB 电力传输充电器的典型应用
- AD5306 四路电压输出、8 位数模转换器的典型应用
- 用于 Intel Pentium VRE 处理器的 LT1585CT 4.6A 低压差稳压器的典型应用
- ATF15XX-DK3-U,基于ATF15XXDK3-SAJ44的CPLD开发/编程器套件,用于DK3板的44针PLCC插座适配器板
- 使用 Analog Devices 的 LT3091IDE 的参考设计
- AM1S-4812SH30Z 1W DC-DC转换器典型应用
- 福禄克专家级热像仪震撼上市,参与问答赢精美好礼!
- 下载《ADI 任意波形发生器方案》抢楼有礼啦!
- Follow me第2期来袭,与得捷一起解锁开源硬件 Adafruit ESP32-S3 TFT Feather!
- 免费申请|中科亿海微神针系列FPGA开发板EQ6HL45 1V0
- MPS有奖活动|绿色AI“芯” 动力,探索节能低碳的AI供电方案!
- 我为TI M4开发板Hanker试用狂!
- 轻松注册TDK,尽享超值好礼!
- 调查:全新 TI E2E中文社区等你体验,等你抽奖!还可邀请好友助你一臂之力!
- 瓜分2000元新年开工红包!贸泽电子邀你元宵猜灯谜
- NI白皮书下载《如何克服复杂待测设备的生产测试挑战》