结合固件库探讨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_
- 结合固件库探讨STM32读写FLASH步骤、HardFault问题
- STM32 uart4初始化进hardfault问题
- stm32 Flash读写[库函数]
- stm32 Flash读写[库函数]
- stm32 Flash读写[库函数]
- stm32 读写内部Flash
- STM32读写内部Flash
- STM32 读写内部Flash
- code-stm32读写FLASH
- STM32 flash读写源程序
- STM32内部flash读写
- stm32 flash读写
- STM32 flash 读写操作
- STM32 malloc HardFault
- STM32如何查找hardfault原因
- STM32如何查找hardfault原因
- HardFault定位步骤
- 实现STM32 Flash的读写
- 流操作之缓冲
- android TextView文字加粗
- Python Memory Management
- 如何对jmeter设置IP欺骗
- Cocos2dx-- 资源热更新
- 结合固件库探讨STM32读写FLASH步骤、HardFault问题
- Swift与OC语法对比
- ios Undefined symbols for architecture arm64
- [Leetcode]Remove Linked List Elements
- Java基本数据类型
- Java学习总结--json
- android 外置数据库的使用
- android Toolbar使用
- matlab矩阵分块