一、实现的功能
1.实现对STM32Fxxx的片内FLASH的擦除和烧写,并读出后进行检验。
2.用串口打印出检验FLASH内容是否正确的变量值。
二、实验操作及现象
1.双击FLASH.eww打开工程文件,然后进行编译。
2.用Flash Loader将程序下载到ARM内,或者利用JLINK等仿真器进行仿真。
3.在程序运行前,用串口线将开发板的串口1和PC机的串口1连接,并打开“串
口调试助手”,设置波特率为115200,将会看到每0.5秒显示一次“Flash Status=1”,
则说明FLASH操作成功,否则说明FLASH操作失败。
三、片内FLASH学习
大家可能会疑惑,既然我们可以利用工具将代码下载芯片内部,为什么还要讲解Flash编程呢?目的是让大家掌握后可以编写自己的BootLoader,例如用CAN总线接口来更新产品中的升级代码,不需要将产品拆卸即可完成。另外一个很重要的问题就是我们要保护好自己编写的代码,否则被破_解后,就成别人的产品了。
1.解除Flash锁
复位后,闪存擦写控制器模块是被保护的,不能写入FLASH_CR寄存器,
通过写入两个关键字(KEY1,KEY2)到FLASH_KEYR寄存器打开闪存擦写控
制器,才可以进行其他闪存操作。其中KEY1为0x45670123,KEY2为0xCDEF89AB。
编程如下:
FLASH->KEYR = FLASH_KEY1;
FLASH->KEYR = FLASH_KEY2;
2.页擦除
在FLASH操作中,每次擦除只能擦除一页,不能一个字节一个字节的擦除,其实所谓的擦出就是将指定的页全部填写成0XFF,下面是页擦除的过程:
-检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的闪存操作;
-用FLASH_AR寄存器选择要擦除的页;
-设置FLASH_CR寄存器的PER位为1;
-设置FLASH_CR寄存器的STRT位为1;
-等待BSY位变为0;
-读出被擦除的页并做验证。
编程如下:
//等待前次操作完毕(检查FLASH_SR寄存器的BSY位)status = FLASH_WaitForLastOperation(EraseTimeout);
if(status == FLASH_COMPLETE)//如果FLASH处于可以操作状态,开始进行页擦除操作
{
FLASH->CR|= CR_PER_Set;//设置FLASH_CR寄存器的PER位为1
FLASH->AR = Page_Address;//用FLASH_AR寄存器选择要擦除的页
FLASH->CR|= CR_STRT_Set;//设置FLASH_CR寄存器的STRT位为1
//等待擦除操作完毕(等待BSY位变为0)
status = FLASH_WaitForLastOperation(EraseTimeout);
if(status != FLASH_BUSY)//如果SR的BSY为0
{
//如果擦除操作完成,禁止CR的PER位
FLASH->CR &= CR_PER_Reset;
}
}
|