目录
一、Flash简介
1、闪存的读取
STM32F1 可通过内部的 I-Code 指令总线或 D-Code 数据总线访问内置闪存模块,本章我们主要讲解数据读写,即通过 D-Code 数据总线来访问内部闪存模块。为了准确读取 Flash 数据,必须根据 CPU 时钟 (HCLK) 频率和器件电源电压在 Flash 存取控制寄存器 (FLASH_ACR)中正确地设置等待周期数(LATENCY)。当电源电压低于 2.1V 时,必须关闭预取缓冲器。
等待周期通过 FLASH_ACR 寄存器的 LATENCY[2:0]三个位设置。系统复位后, CPU 时钟频率为内部 16M RC 振荡器, LATENCY 默认是 0,即 1 个等待周期。供电电压,我们一般是 3.3V,所以,在我们设置 72Mhz 频率作为 CPU 时钟之前,必须先设置 LATENCY 为 3,否则 FLASH 读写可能出错,导致死机。STM23F1 的 FLASH 读取是很简单的。例如,我们要从地址 addr,读取一个字(字节为 8 位,半字为 16 位,字为 32 位),可以使用如下方法来读取:data=*(vu32*)addr;
将 addr 强制转换为 vu32 指针,然后取该指针所指向的地址的值,即得到了 addr 地址内的值。类似的,将上面的 vu32 改为 vu16,即可读取指定地址的一个半字。
2、闪存的编程和擦除
STM32 的闪存编程是由 FPEC(闪存编程和擦除控制器)模块处理的,这个模块包含 7 个 32 位寄存器,
STM32 复位后, FPEC 模块是被保护的,不能写入 FLASH_CR 寄存器;通过写入特定的序列到 FLASH_KEYR 寄存器可以打开 FPEC 模块(即写入 KEY1 和KEY2),只有在写保护被解除后,我们才能操作相关寄存器。
STM32 闪存的编程每次必须写入 16 位(不能单纯的写入 8 位数据),当FLASH_CR 寄存器的 PG 位为’1’时,在一个闪存地址写入一个半字将启动一次编程;写入任何非半字的数据, FPEC 都会产生总线错误。在编程过程中(BSY 位为’1’ ),任何读写闪存的操作都会使 CPU 暂停,直到此次闪存编程结束。
同样,STM32 的 FLASH 在编程的时候,也必须要求其写入地址的 FLASH 是被擦除了的(也就是其值必须是 0XFFFF),否则无法写入,在 FLASH_SR 寄存器的 PGERR 位将得到一个警告。
二、创建工程文件
1、CUBEMX工程建立
定时器设置
引脚配置
GPIO配置
中断设置