1、内部Flash
STM32内部Flash分为三部分,主存储器,信息块,Flash接口寄存器。
内部Flash | 作用 |
---|---|
主存储器 | 代码、数据常量 |
信息块 | 启动程序、用户选择字节 |
Flash接口寄存器 | 控制Flash读写操作的寄存器 |
2、读取内部Flash
对于内部Flash,可以在通用地址空间直接寻址,即通过指针直接取地址的内容。
读取 8位,*(uv8 *)ADDR
;
读取16位,*(uv16 *)ADDR
;
读取32位,*(uv32 *)ADDR
;
要注意地址对齐的问题,16位的话地址要是2的倍数,32位的话地址要是4的倍数,否则可能导致HardFault。
2.1、Flash等待周期
STM32的系统时钟用的是72MHz,内部Flash的速度没有那么快,为了两者速度的配合需要设置Flash的等待周期。
通过闪存访问控制寄存器来设置对应的等待周期,72MHz的话LATENCY设为010.
这个操作不需要我写,例程已经做了,在system_stm32f10x.c
文件的SystemInit()
函数里的SetSysClock()
函数里的SetSysClockTo72()
函数。(突然搞笑…)
SetSysClockTo72函数中有对Flash_ACR寄存器的LATENCY操作,将其设为010,即两个等待状态。
/* Flash 2 wait state */
FLASH->ACR &= (uint32_t)((uint32_t)~FLASH_ACR_LATENCY);
FLASH->ACR |= (uint32_t)FLASH_ACR_LATENCY_2;