历史上的今天
今天是:2025年08月19日(星期二)
2018年08月19日 | 结合固件库探讨STM32读写FLASH步骤、HardFault问题
2018-08-19 来源:eefocus
在单片机系统中,程序的存储一般放在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步就可以了。
史海拾趣
|
/************************************************************** 320×240 16Bpp TFT LCD功能模块初始化 **************************************************************/ void Lcd_Init(void) { rLCDCON1=( ...… 查看全部问答> |
|
vs2005 用VC++建立的基于对话框的智能设备MFC应用程序,当包含afxinet.h头文件时,出现下面的错误,是什么原因呀?高手进,在线等之 如题:我想在winCE里写一个FTP上传文件的程序,vs2005 用VC++建立的基于对话框的智能设备MFC应用程序,当包含afxinet.h头文件时,出现下面的错误,是什么原因呀?高手进,在线等之 错误 1 ...… 查看全部问答> |
|
从《钢铁侠1》到《复仇者联盟》再到《钢铁侠3》,托尼胸前的反应堆,也更新了好几代。高中刚毕业,放假在家,就有了想自己做一个反应堆的想法,然后就开始实践了。 ◆ 第一步:采购原材料(具体如下) ● 网上定制的亚 ...… 查看全部问答> |
|
#include int main(void) { WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer DCOCTL=DCO0; ...… 查看全部问答> |




