片上闪存接口(embeded flash interface)
片上闪存接口用于管理I-Code和D-Code总线访问片上闪存。 它提供了擦除和烧录Flash的功能,以及读写保护机制。 此外,对I-Code总线的指令预取(instruction prefetch)功能可以提高系统的性能。当电压低于2.1V时,将不能使用prefetch功能。
F407有最多1M的Flash存储空间,可以用来烧录程序。 这1M的空间又被分成了4个16K、1个64K和7个128K字节的sector。 支持sector和mass级擦写。 128位的读数据访问,可以byte(8位), half-word(16位), word(32位), double word(64位)的写访问。
1. FLASH访问等待周期
4. Flash接口寄存器
Reference Manual 在第3.9节中列举了FLASH接口寄存器的位定义和偏移地址。参考STM32官方库函数, 这里做了一些简化,定义如下的结构体用于访问FLASH的每个寄存器:
typedef struct flash_regs {
volatile uint32 ACR; /* FLASH访问控制寄存器,开关各种访问加速功能,配置等待周期, offset: 0x00 */
volatile uint32 KEYR; /* FLASH密钥寄存器,用于对解锁对控制寄存器的访问,进而执行编程和擦写操作, offset: 0x04 */
volatile uint32 OPTKEYR; /* FLASH选项密钥寄存器,可以在用户配置扇区中进行编程和擦写操作, offset: 0x08 */
volatile uint32 SR; /* FLASH状态寄存器, 提供正在执行的编程和擦写操作的执行信息, offset: 0x0C */
volatile uint32 CR; /* FLASH控制寄存器, 配置和启动Flash操作, offset: 0x10 */
volatile uint32 OPTCR; /* FLASH选项控制寄存器, 修改用户选项字节, offset: 0x14 */
} flash_regs_t;
根据DataSheet的内存映射, FLASH寄存器被映射到了0x4002 3C00 - 0x4002 3FFF地址空间中,挂载在AHB1总线上。 因此,我们可以通过如下两个宏定义来访问RCC的各个寄存器。
#define FLASH_BASE 0x40023C00
#define FLASH ((flash_regs_t *)FLASH_BASE)
那么我们就可以通过如下的形式来访问FLASH的寄存器:
FLASH->ACR
FLASH->CR