在单片机系统中,程序的存储一般放在flash中,不易丢失的数据一般存放在EEROM中(比如说我们经常使用的AT24C02,、AT24C256),一般情况不建议将频繁读写的数据存放在Flash中,一方面FLASH在单片机中都是1K或2K为一页,在执行擦除指令时,一次最少要擦除一页的数据。FLASH支持单字节读写,但每次在更新数据前都必须先擦除原数据,然后才能重新写入数据,而不能在原数据基础上更新内容。另一方面,频繁读写Flash会缩短Flash的使用时间。
flash的读写一般用作两种情况,第一种是通过程序下载或仿真将程序下载到单片机Flash,另一种是在单片机运行过程中实现在线升级(IAP)。对于初学者,参照编程手册做一次编程练习以便进一步加深理解是有必要的。
flash的读写要注意两点:
1、注意读写Flash的地址是否数据对齐或者可读写,特别注意区分读写半字或字、读写的地址是否在Flash区 (0x800,0000-64K)。
2、注意当前Flash是否处于读写保护模式。
当遇到HardFault时,当然就是这两点有其一出错了。一般是Flash读写的地址错误!
这些内容都可以从相应正在使用的芯片编程手册中获得,这里也做了截图如下:
Flash的读操作非常简单,其操作与读取特殊功能寄存器完全一致,举例如下:
test_r=*(__IO uint16_t*)0x8003000;
Flash的写操作就有点复杂了,其中包括,解锁、擦除、写、上锁4步。当然编程手册中也给出了具体的步骤如图所示:
由于有了固件库的使用,实际上编程操作非常简单,当然通过分析这些固件库函数可以更加深入的理解Flash读写步骤。程序如下:
FLASH_SetLatency(FLASH_Latency_1); //设置延迟
FLASH_Unlock(); //解锁
FLASH_ErasePage(0x8003000); //擦除
FLASH_ProgramHalfWord(0x8003000,test16); //写半字
FLASH_Lock(); //上锁
test_r=*(__IO uint16_t*)0x8003000; //验证
解锁、擦除、写、上锁4步是必须的,一般频率在24MHZ以上的为了Flash读写正确需要设置延迟,当然不设置也并不会出错,将写入Flash的内容读出一般是为了验证写入的是否正确,写错了当然要重头再写一遍了,对于可靠性要求不高的话,只有解锁、擦除、写、上锁4步就可以了。
博客地址:Beep http://blog.youkuaiyun.com/beep_
本文介绍了STM32单片机在读写Flash时的步骤及注意事项,强调了地址对齐、读写保护模式的重要性。同时,针对HardFault问题,指出通常是由于Flash地址错误导致。通过固件库简化了编程操作,包括解锁、擦除、写入和上锁四个步骤,并提供了示例代码。
3938





