目录
一、题目内容
stm32f103c8t6只有20KB 内存(RAM)供程序代码和数组变量存放,因此,针对内部Flash的总计64KB存储空间(地址从0x08000000开始),运行一次写入8KB数据,总计复位运行代码8次,将64KB数据写入Flash,并验证写入数据的正确性和读写速率。此外,继续往后续地址写入数据,检验stm32f103c8t6 实际FlashROM是否超过64KB。
二、Flash地址空间的数据读取
1、实验原理
(1)STM32 的 Flash 存储器概述
STM32 芯片内部集成了 Flash 存储器,用于存储程序代码、常量数据等。Flash 存储器具有非易失性,即在掉电后数据不会丢失。它的地址空间是线性的,并且有特定的范围。例如,在一些 STM32 系列中,Flash 起始地址可能是 0x08000000,其大小根据芯片型号不同而不同,像 STM32F103 系列的 Flash 大小有多种可选,如 64KB、128KB 等。
Flash 存储器的存储单元是以字节为单位进行组织的,在读取数据时,可以按字节、半字(16 位)或者字(32 位)进行读取操作。
(2)实验原理中的地址映射
STM32 的存储系统采用了地址映射机制。当我们要读取 Flash 地址空间中的数据时,CPU 通过内部的地址总线发出要访问的 Flash 地址。这个地址会经过地址译码电路,找到对应的 Flash 存储单元。例如,如果我们想要读取地址为 0x08001000 处的数据,系统会将这个地址信号发送到 Flash 控制器,Flash 控制器根据这个地址定位到物理存储位置。
(3)数据读取过程
指令操作:在程序中,我们通过特定的指令来读取 Flash 中的数据。对于按字节读取,一般使用类似uint8_t data = *(volatile uint8_t*)address;这样的操作。这里的address是要读取的 Flash 地址,*(volatile uint8_t*)是一个强制类型转换操作,将地址转换为指向无符号 8 位数据类型(字节)的指针,然后通过解引用操作获取该地址处的数据并存储到data变量中。
Flash 读取接口:STM32 的硬件提供了相应的读取接口来确保数据的正确读取。Flash 读取操作通常是在 CPU 的控制下进行的,当读取指令发出后,Flash 控制器会负责将存储单元中的数据取出并送到数据总线上。这个过程中,Flash 控制器会根据 Flash 的编程特性,比如读取延迟等,来确保数据的完整性和正确性。
数据总线传输:读取到的数据通过数据总线从 Flash 存储单元传输到 CPU 或者其他存储区域(如寄存器)。数据总线的宽度一般是 32 位,这意味着一次可以传输 32 位的数据。如果是按字节或半字读取,数据会在总线上按照适当的方式进行对齐传输。例如,按字节读取的数据会根据其在 32 位数据总线上的位置进行传输,可能会填充高位或者低位为 0,具体取决于字节在字中的位置。
(4)数据读取的保护机制和注意事项
STM32 的 Flash 存储器可能会有一些保护机制。例如,有些芯片可能会有读保护功能,以防止未经授权的访问。在进行实验读取数据时,需要确保芯片没有设置这种会影响正常读取的保护。
另外,由于 Flash 存储器的擦除和写入操作有一定的寿命限制(一般称为闪存的写入 / 擦除寿命,即 P/E Cycles),在实验过程中,只进行读取操作不会影响这个寿命,但要注意不要误触发写入或擦除操作,以免减少 Flash 的使用寿命。同时,在读取操作时,也要注意访问的地址范围是否在有效的 Flash 地址空间内,避免访问到无效地址导致程序出错。