结合固件库探讨STM32读写FLASH步骤、HardFault问题

来源:互联网 发布:算法与数据结构英文 编辑:程序博客网 时间:2024/05/29 18:35

               在单片机系统中,程序的存储一般放在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.csdn.net/beep_

   

1 0
原创粉丝点击