有人使用stm32l476芯片开发产品,他想在内部flash空间特定位置写些数据,发现总是失败,并补充说之前使用stm32f1系列、stm32l1系列却没有类似问题。
其实,针对stm32l4的内部flash编程,跟stm32f1/l1系列是不同的,其中stm32f1的内部flash编程仅支持半字编程,stm32l1的内部flash编程主要支持字编程或半页编程。而stm32l4系列的内部flash编程所支持的则是64位双字编程或以32个双字为单位的快速行编程。
对于少量的零星数据编程自然会选择64位双字编程模式,即每次改写flash内容必须以64位为单位。硬件还针对这64位数据做了8位的ecc,我们用户看不到而已。下面简单介绍下64位双字编程过程。
在基于64位双字编程时,如果只是就字节或半字进行编程则会产生错误;或者尽管使用双字编程却没有遵循双字地址对齐【8字节对齐】时也会产生错误。
这里我使用arm mdk v2.9开发环境,借助于stm32l476_nucelo开发板演示一下对内部flash某个位置写几个64位数据的实现过程【写之前相关区域已经被擦除过了】。
我通过ide将内部flash最后的0x1000地址空间预留出来用于填写些数据,即我将内部flash分成2块,将最后的0x1000的flash空间划了出来。如下图所示:【这里的芯片是stm32l476rgt6,下面只演示写三个64位数据。】
我将特定数据区定义在内部flash空间0x80ff000开始的地方。
#define address_const (0x80ff000)
另外还定义了一个64位地址指针和一个64位数据数组。
相关执行参考代码如下:
代码是基于stm32cube库来组织的,连续写了三个64位的数据到指定的flash空间。其中主要涉及到一个flash编程函数hal_flash_program(),它有三个变量,分别是编程模式,待编程的flash地址以及用于编程的数据。
代码比较简单,对欲编程的地址做检查确认,然后进行flash编程开锁,清除可能存在的各种挂起状态标志,进行双字编程,之后对flash寄存器访问进行上锁。
现在基于上面的代码看看运行结果:
我们可以看到在指定的flash地址空间写三个64位数据。
在上面介绍64位双字编程规则时,可能有人会问,如果我遵循了8字节地址对齐,待写的数据也不是字节或半字,而是一个字会怎么样呢?那你也得凑成2个字来写,方能完成一次写操作。
比方基于上面测试代码,仅仅将每次待写的数据改为32位字,最后结果便是高位字被填0了。就像下面这样:
好,关于stm32l4系列内部flash双字编程模式就介绍到这里。整个过程应该说不难,只要注意到各个细节就好。
趁此再抛砖引玉似地做些提醒:stm32系列众多,各个系列的内部flash编程模式以及页或扇区的容量规划、地址安排往往各有差异,在flash编程时千万别跟着惯性或感觉走。还有,不同的编程模式往往对芯片的电源电压有不同的要求,这点也要特别特别特别注意。
电蜂优选新能源汽车连接器领域发展新趋势
电动汽车动力总成噪声分析与优化
屏占比之后,手机屏幕的突破将走向何方?
加密货币交易所CoinAll上线 Lambda 160万LAMB大放送
智能音箱如此火爆,它到底有哪些智能之处
STM32L4系列内部FLASH双字编程示例
电感有什么样的作用应该如何进行分类
airpods怎么看电量_airpods一只没有声音
氮化镓技术是谁突破的技术
当贝c1这款投影仪是否适合于家庭使用
新一代TSN通讯协议推动工业以太网迈向Gbit/s时代
服务机器人问题凸显,技术还有待发展
3800亿元,将“喂”出几个国产传感器巨头?
高频RFID射频电子电路设计原理分析
AI还在这两方面有着你想不到的能力!
小米能够拿手的生态王牌颠覆电动汽车行业吗?
电容笔的笔头怎样换_电容笔的寿命
京东物流与湖北联通合作将共同在武汉打造5G智能物流示范园区
固态硬盘和机械硬盘区别在哪
NetSet–自动化网络流量安全增强工具