使用STM32进行Flash地址空间的数据读取

Flash地址空间的数据读取。stm32f103c8t6只有20KB 内存(RAM)供程序代码和数组变量存放,因此,针对内部Flash的总计64KB存储空间(地址从0x08000000开始),运行一次写入8KB数据,总计复位运行代码4次,将32KB数据写入Flash。并验证写入数据的正确性和读写速率。

一、STM32的内存映射

在了解flash之前,我们先来看一下STM32的内存映射。
在这里插入图片描述
首先,需要区分的就是RAM和Flash

  • stm32的flash地址起始于0x0800 0000,结束地址是0x0800
    0000加上芯片实际的flash大小,不同的芯片flash大小不同。
  • RAM起始地址是0x2000 0000,结束地址是0x2000 0000加上芯片的RAM大小。不同的芯片RAM也不同。
  • Flash中的内容一般用来存储代码和一些定义为const的数据,断电不丢失,
  • RAM可以理解为内存,用来存储代码运行时的数据,变量等等。掉电数据丢失。

一般情况下,程序文件是从 0x0800 0000 地址写入,这个是STM32开始执行的地方,0x0800 0004是STM32的中断向量表的起始地址。
程序的写入地址从0x08000000开始的,其大小为0x80000也就是512K的空间,换句话说就是告诉编译器flash的空间是从0x08000000-0x08080000,RAM的地址从0x20000000开始,大小为0x10000也就是64K的RAM。这与STM32的内存地址映射关系是对应的。

二、内部Flash的构成

不同型号的 STM32,其 FLASH 容量也有所不同,最小的只有 16K 字节,最大的则达到了 1024K 字节。
在这里插入图片描述
查看Flash容量的分类,可以发现:
STM32F103C8T6是属于中等容量的设备,

  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一份使用STM32HAL库中的Flash API存储数据的详细例程: 首先,需要在程序中包含以下头文件: ```c #include "stm32f4xx_hal.h" #include "stm32f4xx_hal_flash.h" ``` 接下来定义一个变量来存储数据,以及一个地址来指向Flash中的存储空间: ```c uint32_t data = 0x12345678; uint32_t flash_address = 0x080E0000; // 这是一个STM32F407的Flash地址,具体地址需要根据芯片型号进行调整 ``` 然后,需要使能Flash的写入操作: ```c FLASH_EraseInitTypeDef erase_init; erase_init.TypeErase = TYPEERASE_SECTORS; erase_init.Sector = FLASH_SECTOR_11; // 这是一个STM32F407的Flash扇区,具体扇区需要根据芯片型号进行调整 erase_init.NbSectors = 1; erase_init.VoltageRange = VOLTAGE_RANGE_3; uint32_t page_error = 0; HAL_FLASH_Unlock(); HAL_FLASHEx_Erase(&erase_init, &page_error); HAL_FLASH_Lock(); ``` 上述代码将Flash扇区11擦除,以便写入新数据。需要注意的是,Flash擦除操作会删除整个扇区中的数据,因此在实际应用中需要谨慎使用。 接下来,可以使用以下代码将数据写入Flash: ```c HAL_FLASH_Unlock(); HAL_FLASH_Program(TYPEPROGRAM_WORD, flash_address, data); HAL_FLASH_Lock(); ``` 上述代码将数据写入Flash地址`flash_address`指向的位置。需要注意的是,Flash写入操作需要先解锁Flash,写入完成后再锁定Flash。 最后,可以使用以下代码从Flash读取数据: ```c uint32_t read_data = *(__IO uint32_t*)flash_address; ``` 上述代码将Flash地址`flash_address`指向的位置中的数据读取到`read_data`变量中。需要注意的是,这里使用了C语言中的指针操作,将Flash地址强制转换为指向`uint32_t`类型的指针,以便读取其中的数据。 完整的例程代码如下: ```c #include "stm32f4xx_hal.h" #include "stm32f4xx_hal_flash.h" uint32_t data = 0x12345678; uint32_t flash_address = 0x080E0000; int main(void) { HAL_Init(); __HAL_RCC_FLASH_CLK_ENABLE(); FLASH_EraseInitTypeDef erase_init; erase_init.TypeErase = TYPEERASE_SECTORS; erase_init.Sector = FLASH_SECTOR_11; erase_init.NbSectors = 1; erase_init.VoltageRange = VOLTAGE_RANGE_3; uint32_t page_error = 0; HAL_FLASH_Unlock(); HAL_FLASHEx_Erase(&erase_init, &page_error); HAL_FLASH_Lock(); HAL_FLASH_Unlock(); HAL_FLASH_Program(TYPEPROGRAM_WORD, flash_address, data); HAL_FLASH_Lock(); uint32_t read_data = *(__IO uint32_t*)flash_address; while (1) { // do something } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值