有些人用STM32L476芯片来开发产品。他想在内部闪存空间的特定位置写入一些数据,但总是发现失败,并补充说以前使用STM32F1系列和STM32L1系列时没有类似的问题。
事实上,STM32L4的内部闪存编程不同于STM32L 1/L1系列。STM32L1的内部闪存编程仅支持半字编程,而STM 32L 1的内部闪存编程主要支持字编程或半页编程。STM32L4系列的内部闪存编程支持64位双字编程或以32个双字为单位的快速线编程。
对于少量零星的数据编程,自然会选择64位双字编程模式,即闪存内容的每次重写都必须以64位为单位。硬件还为64位数据制作了8位ECC,这是我们用户看不到的。以下是对64位双字编程过程的简要介绍。
基于64位双字编程时,如果只编程字节或半字,就会出现错误。或者,即使使用双字编程,它也不遵循双字地址对齐[8字节对齐]。
在这里,我使用ARM MDK 2.9开发环境,演示了通过STM32L476_NUCELO开发板[将几个64位数据写入内部闪存的某个位置的实现过程,相关区域在写入之前已经被擦除]。
我保留了内部闪存的最后一个0x1000的地址空间,用于通过IDE填充一些数据,也就是说,我将内部闪存分成两个块,并抽出最后一个0x1000的闪存空间。如下图所示:[这里的芯片是STM32L476RGT6,下面只显示三个64位数据。】
我定义了一个内部闪存空间0x80ff000开始的特定数据区。
#定义地址常数(0x80FF000)
此外,还定义了64位地址指针和64位数据数组。
相关执行参考代码如下:
代码基于STM32Cube库组织,三个64位数据被连续写入指定的闪存空间。它主要涉及一个闪存编程功能HAL_FLASH_Program(),它有三个变量,即编程模式、要编程的闪存地址和用于编程的数据。
代码相对简单。检查并确认要编程的地址,然后通过闪存编程将其解锁,清除可能存在的各种未决状态标记,进行双字编程,然后锁定闪存寄存器的访问。
现在看看基于上述代码的结果:
我们可以看到三个64位数据被写入指定的闪存地址空间。
当介绍上面的64位双字编程规则时,有人可能会问,如果我遵循8字节地址对齐,要写入的数据不是字节或半字,而是一个字?然后,在完成一个写操作之前,你必须添加最多2个单词来写。
例如,基于上述测试代码,只有每次要写入的数据被改变为32位字,并且最终结果是高位字被填充为0。就像这样:
好了,这里介绍的是STM32L4系列内部闪存双字编程模式。整个过程应该说并不难,只要你注意所有的细节。
我想提醒你,有许多STM32系列。每个系列的内部闪存编程模式以及页面或扇区的容量规划和地址安排通常是不同的。编程时请不要跟随惯性或感觉。此外,不同的编程模式通常对芯片的电源电压有不同的要求,这也需要特别注意。
防控疫情的需求激发之下,代替人类送药、送餐送菜、消毒巡逻的无人车成了疫情期间的特殊尖兵。疫情过后,无人车配送是否...
2020-03-23 17:12市场分调研机构Omdia的最新数据分析显示,全球智能城市人工智能(AI)软件市场将从6 738亿美元(2019年),在2025年将增长到4...
2020-04-07 17:55现代电测技术日趋成熟,由于具有精度高、便于微机相连实现自动实时处理等优点,已经广泛应用在电气量和非电气量的测量中。
2020-04-07 17:56微软经常在游戏领域开辟路径,扮演开拓者的角色,这一点体现在很多方面,包括微软的尖端技术(DX12终极版 DX光追),硬件(X...
2020-04-07 17:57去年 12 月,波音为美国宇航局发射了未载人的 Starliner 航天器。然而由于技术问题,任务并没有按计划进行。作为 NASA ...
2020-04-07 17:58