STM32F103系列内部Flash写入数据以后进入硬件错误中断问题分析

“静心理解一下程序存储到了哪些区域,就能知道哪些区域可以进行写入。”

目录

内部 FLASH 的构成

        主存储

        系统存储区

        选项字节

程序存储到了哪些区域?

ROM 空间分布表分析

 STM32 芯片的命名规则

以STM32F103ZET6为例,首先我们先来了解一下内部FLASH

内部 FLASH 的构成

        STM32 的内部 FLASH 包含主存储器、系统存储器以及选项字节区域。

        主存储

        一般我们说 STM32 内部 FLASH 的时候,都是指这个主存储器区域,它是存储用户应用程序的空间,芯片型号说明中的 256K FLASH、512K FLASH 都是指这个区域的大小。

        主存储器分为 256 页,每页大小为 2KB,共 512KB。这个分页的概念,实质就是 FLASH 存储器的扇区,与其它 FLASH 一样,在写入数据前,要先按页(扇区)擦除。

        系统存储区

        系统存储区是用户不能访问的区域,它在芯片出厂时已经固化了启动代码,它负责实现串口、USB以及 CAN 等 ISP 烧录功能。

        选项字节

        选项字节用于配置 FLASH 的读写保护、待机/停机复位、软件/硬件看门狗等功能,这部分共 16字节。可以通过修改 FLASH 的选项控制寄存器修改。

程序存储到了哪些区域?

        由于内部 FLASH 本身存储有程序数据,若不是有意删除某段程序代码,一般不应修改程序空间的内容,所以在使用内部 FLASH 存储其它数据前需要了解哪一些空间已经写入了程序代码,存储了程序代码的扇区都不应作任何修改。通过查询应用程序编译时产生的“*.map”后缀文件,可以了解程序存储到了哪些区域

        打开 map 文件后,查看文件最后部分的区域,可以看到一段以“Memory Map of the image”开头的记录 (若找不到可用查找功能定位)

        上述说明中有两段分别以“Load Region LR_ROM1”及“Execution Region ER_IROM1”开头的内容,它们分别描述程序的加载及执行空间。在芯片刚上电运行时,会加载程序及数据,例如它会从程序的存储区域加载到程序的执行区域,还把一些已初始化的全局变量从 ROM 复制到 RAM空间,以便程序运行时可以修改变量的内容。加载完成后,程序开始从执行区域开始执行。在上面 map 文件的描述中,我们了解到加载及执行空间的基地址 (Base) 都是 0x08000000,它正好是 STM32 内部 FLASH 的首地址,即 STM32 的程序存储空间就直接是执行空间;它们的大小(Size) 分别为 0x0000190c 及 0x000018c8,执行空间的 ROM 比较小的原因就是因为部分 RW-data类型的变量被拷贝到 RAM 空间了;

在keil中查看内部FLASH中的值进行上述验证,如下图所示

总结:在计算程序占用的空间时,需要使用加载区域的大小进行计算,本例子中应用程序使用的内部FLASH 是从 0x08000000 至 (0x08000000+0x0000190c) 地址的空间区域。所以在此空间区域内是不允许再次写入数据的,在次写入数据就会产生硬件错误中断。

ROM 空间分布表分析

        在加载及执行空间总体描述之后,紧接着一个 ROM 详细地址分布表,它列出了工程中的各个段(如函数、常量数据) 所在的地址 BaseAddr 及占用的空间 Size,列表中的 Type 说明了该段的类型,CODE 表示代码,DATA 表示数据,而 PAD 表示段之间的填充区域,它是无效的内容,PAD 区域往往是为了解决地址对齐的问题。

        观察表中的最后一项,它的基地址是 0x080018a8,大小为 0x00000020,可知它占用的最高的地址空间为 0x080018c8,跟执行区域的最高地址 0x000018c8 一样,但它们比加载区域说明中的最高地址 0x800190c 要小,所以我们以加载区域的大小为准。对比表 STM32 大容量产品内部 FLASH的构成 的内部 FLASH 页地址分布表,可知(地址 0x800190c ) 后的存储空间都可以作其它用途,使用这些存储空间时不会篡改应用程序空间的数据

 STM32 芯片的命名规则

  • 22
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: STM32F103是意法半导体推出的一款32位单片机,内置了一块FLASH存储器,用于程序和数据读写。下面将详细介绍STM32F103内部FLASH读写操作。 首先,内部FLASH是非易失性存储器,可以长时间保存数据,即使在断电后也不会丢失。该存储器分为多个扇区,每个扇区大小为2KB或16KB,总的容量取决于具体型号。 对于写操作,首先需要擦除要写入的扇区。擦除是一个扇区级别的操作,即需要擦除整个扇区,每个扇区都有一个固定的扇区号。在擦除之前,必须保证该扇区的所有数据已经备份,因为擦除操作会将该扇区的数据全部清除。 擦除完成后,可以对扇区进行编程操作。编程是以字为单位进行的,每个单元的大小是2个字节。对于编程操作,可以选择使用不同的编程函数,例如“HAL_FLASH_Program”函数。编程时需要注意,每个单元只能由0xFF写入0x00,即从1到0的写入是不被允许的。而且,编程操作之前需要先校验该单元是否已经被编程过。 读取操作则比较简单,可以使用“HAL_FLASH_Read”函数读取指定地址的数据。为了确保读取的数据的正确性,通常会在读取之前对要读取的地址进行校验。 需要注意的是,对于内部FLASH读写操作,必须先进行相应的初始化,例如,配置FLASH读写许可、时钟使能等。 综上所述,STM32F103内部FLASH读写操作主要包括擦除、编程和读取。通过合理地使用这些操作,可以对内部FLASH进行有效的数据存储和读取。 ### 回答2: STM32F103是一种基于ARM Cortex-M3内核的32位微控制器,它具有内部Flash存储器,可以用于程序的存储和执行。下面我们将讨论STM32F103内部Flash读写操作。 STM32F103内部Flash分为多个扇区,每个扇区的大小为2KB或16KB,具体取决于芯片的型号。在进行Flash读写之前,我们需要注意以下几点: 1. Flash编程需要先解锁,然后进行擦除和编程操作。解锁可以通过设置特定的Flash解锁和编程保护位来实现。 2. 在进行Flash编程之前,应该关闭中断,以防止程序干扰Flash访问过程。 3. 写入Flash之前,必须先进行擦除操作。擦除是以扇区为单位进行的,可以选择擦除单个扇区或多个相邻扇区。 4. 写入Flash时,需要将数据按字大小写入,特别是在写入半字(16位)或字(32位)数据时,需要确保数据对齐。 5. 每次写入Flash之后,应该进行校验,以确保数据写入正确。校验可以通过读取Flash中的数据并与原始数据进行比较来实现。 总结起来,STM32F103内部Flash读写操作需要解锁、擦除、编程和校验等步骤。在进行这些操作时,应该注意保护位设置、中断关闭、数据对齐和校验等问题。这样才能确保程序正确地读取和写入内部Flash,并且保证数据的完整性和一致性。 ### 回答3: STM32F103是STMicroelectronics(意法半导体)推出的一款基于ARM Cortex-M3内核的微控制器芯片。它内置了Flash存储器,可以用于程序代码和数据的存储。 首先,STM32F103系列芯片的内部Flash存储器容量可以根据不同型号而不同,通常为64KB、128KB、256KB或512KB。通过编程将代码和数据存储在Flash中,可以实现可靠的程序执行,而且Flash可以被擦除和编程多次,使得开发者能够灵活地进行程序的更新和修改。 对于STM32F103内部Flash的读取,开发者可以通过读取指定地址的方式来访问存储在Flash中的数据。可以使用如`*(uint32_t*)address`的语法,将Flash的指定地址强制类型转换为指向32位无符号整数的指针,并通过解引用指针访问Flash中的数据。需要注意的是,Flash存储器的读取速度相对较慢,因此在程序执行过程中可能会遇到一定的延迟。 至于内部Flash写入,由于Flash存储器具有较高的可靠性要求,所以写入操作需要特定的处理来确保数据的完整性。开发者需要在编写程序时使用特定的编程算法和接口,例如ST提供的Flash等库函数,来进行数据写入。此外,为了避免写入操作对Flash的擦除,开发者还需要提前进行相关的Flash扇区擦除操作。 总的来说,STM32F103内部Flash存储器提供了方便可靠的程序代码和数据存储方式。通过正确的读取和写入操作,可以实现对Flash存储器的数据访问和更新。但需要开发者额外注意Flash的读取速度和写入算法的正确性,以确保程序的稳定性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值