历史上的今天
返回首页

历史上的今天

今天是: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步就可以了。


推荐阅读

史海拾趣

Armel Electronics Inc公司的发展小趣事

Armel Electronics Inc公司的创立,源于几位电子工程领域的先驱者对于技术创新和市场前景的敏锐洞察。在创立初期,公司面临资金紧张、市场竞争激烈等多重挑战。然而,凭借对技术的热爱和对市场趋势的准确把握,Armel团队成功研发出了一系列具有竞争力的电子产品,奠定了公司的市场地位。

AXSEM公司的发展小趣事

在电子行业中,产品质量是企业生存和发展的关键。Armel Electronics Inc公司深知此道,始终坚持品质至上的原则。公司从原材料采购到生产流程,再到产品出厂,每一个环节都严格把控,确保产品质量的稳定性和可靠性。这种对品质的执着追求,使得Armel的产品在市场上赢得了良好的口碑,并逐渐树立了公司的品牌形象。

Comair Rotron公司的发展小趣事

1987年,为了更好地适应市场变化和拓展国际业务,Comair决定进行品牌重塑,将公司名称更改为“Comair Rotron”。同时,公司还在墨西哥建立了新的制造工厂,并在圣地亚哥设立了销售和工程中心,以支持其在北美地区的业务发展。这一举措不仅提升了Comair Rotron的品牌形象,也为其在全球范围内的市场拓展奠定了坚实基础。

Einfochips公司的发展小趣事

Einfochips公司一直致力于嵌入式系统的创新与发展。在某一时期,该公司推出了Eragon600,一款基于Qualcomm Snapdragon 600处理器的全新嵌入式开发平台。这一平台的推出,标志着Einfochips在嵌入式系统开发领域取得了重要突破。Eragon600不仅具备强大的处理能力,还适用于多种行业,包括工业、安全与监控、信息、娱乐等。在多个领域的广泛应用,进一步巩固了Einfochips在嵌入式系统开发领域的领先地位。

Consolidated Wire公司的发展小趣事

面对不断变化的市场需求和技术趋势,Consolidated Wire公司始终保持创新精神。公司不断研发新产品、新技术,满足客户的多样化需求。同时,公司还注重与其他行业的合作与交流,通过跨界合作推动产品创新和技术升级。这种创新驱动的发展模式使得Consolidated Wire公司能够持续保持竞争优势,实现持续稳健的发展。

European Crystal Org公司的发展小趣事

European Crystal Org(ECO)公司诞生于欧洲一个小城市的一个旧仓库里。创始人约翰·史密斯是一位对晶体技术充满热情的电子工程师。他意识到晶体在电子领域的重要性,并决定专注于研发和生产高质量的晶体振荡器。初创时期,ECO面临着资金短缺、技术挑战和市场认可度低的困境。然而,约翰凭借对技术的执着和对市场的敏锐洞察,成功研发出了一款性能卓越的晶体振荡器,赢得了几家小型电子制造商的青睐。这些早期客户的信任为ECO奠定了坚实的市场基础。

问答坊 | AI 解惑

matlab信号处理详解

《Matlab信号处理详解》详细介绍Matlab在数字信号处理中的应用实例,各种数字滤波器的设计,包含源程序…

查看全部问答>

关于S3C2410裸机驱动LCD的问题

/************************************************************** 320×240 16Bpp TFT LCD功能模块初始化 **************************************************************/ void Lcd_Init(void) {         rLCDCON1=( ...…

查看全部问答>

vs2005 用VC++建立的基于对话框的智能设备MFC应用程序,当包含afxinet.h头文件时,出现下面的错误,是什么原因呀?高手进,在线等之

如题:我想在winCE里写一个FTP上传文件的程序,vs2005 用VC++建立的基于对话框的智能设备MFC应用程序,当包含afxinet.h头文件时,出现下面的错误,是什么原因呀?高手进,在线等之 错误        1        ...…

查看全部问答>

nand drive 问题

nand cach write/read 命令是自动连续读写nand 如果用这个命令后遇到坏blcok 怎么办?nand 自己会跳过吗? 谢谢…

查看全部问答>

wince5.0下直接读写内存

想在wince5.0下直接读写内存,往指定的空间读写数据,该怎么实现,忘达人们给点建议!!谢谢!!…

查看全部问答>

分析一个程序错误!

module delay_line(start,stop,up_out,upQ,down_out,downQ,clk,reset);input clk,start,stop,reset;reg [60:0]up_out,down_out,upQ,downQ;integer i,j,m,n;delay_unit du0(start,reset,up_out[0]);delay_unit du2(stop,reset,down_out[0]);always @ ...…

查看全部问答>

大家来说说用DSP的时候你都遇到过什么样无法解决的问题

大家来说说用DSP的时候你都遇到过什么样无法解决的问题?…

查看全部问答>

超级给力DIY钢铁侠MK3方舟反应堆

从《钢铁侠1》到《复仇者联盟》再到《钢铁侠3》,托尼胸前的反应堆,也更新了好几代。高中刚毕业,放假在家,就有了想自己做一个反应堆的想法,然后就开始实践了。 ◆ 第一步:采购原材料(具体如下)      ● 网上定制的亚 ...…

查看全部问答>

用ccr0 ccr1两个中断控制led灯 不能成功

#include                 int main(void) {     WDTCTL = WDTPW | WDTHOLD;        // Stop watchdog timer     DCOCTL=DCO0;   ...…

查看全部问答>

allegro设置底部开窗露铜时,如何能设置挖空过孔呢?

如下图,左边为原来设置好的,右边是我自己画的。怎么设置过孔挖空,也像左边的一样效果呢?求~谢谢 …

查看全部问答>