找回密码
 注册
搜索
查看: 6515|回复: 14

[综合资料] STM32教程系列之FLASH

[复制链接]
发表于 2010-12-12 18:52:51 | 显示全部楼层 |阅读模式
一、实现的功能
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;
    }
  }
3. 全部擦除
        全部擦除就是将全部FLASH都填写成0xFF,其过程如下:
   -检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的闪存操作;
   -设置FLASH_CR寄存器的MER位为1;
   -设置FLASH_CR寄存器的STRT位为1;
   -等待BSY位变为0;
   -读出所有页并做验证。
编程如下:
        //等待前次操作完毕(检查FLASH_SR寄存器的BSY位)
  status = FLASH_WaitForLastOperation(EraseTimeout);
  
  if(status == FLASH_COMPLETE)//如果FLASH出于可以操作状态,开始进行全部页擦除操作
  {
     FLASH->CR |= CR_MER_Set;//设置FLASH_CR寄存器的MER位为1
     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_MER_Reset;
    }
  }          
4. 编程
   编程就是将数据写入指定的FLASH地址,STM32的FLASH每次编程都是16位(在32位系统中,我们叫做半字),过程如下:
-检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的编程操作;
   -设置FLASH_CR寄存器的PG位为1;
   -写入要编程的半字到指定的地址;
   -等待BSY位变为0;
   -读出写入的地址并验证数据。
编程如下:
        //检查参数是否正确
  assert_param(IS_FLASH_ADDRESS(Address));

  //等待前次操作完毕(检查FLASH_SR寄存器的BSY位)
  status = FLASH_WaitForLastOperation(ProgramTimeout);
  
  if(status == FLASH_COMPLETE)//如果FLASH处于可以操作状态,开始进行编程操作
  {
   
    FLASH->CR |= CR_PG_Set;//设置FLASH_CR寄存器的PG位为1
  
    *(vu16*)Address = Data;//写入要编程的半字到指定的地址
    //等待半字编程操作完毕(等待BSY位变为0)
    status = FLASH_WaitForLastOperation(ProgramTimeout);

    if(status != FLASH_BUSY)
    {
      //如果半字编程完毕,禁止PG位
      FLASH->CR &= CR_PG_Reset;
    }
  }
5. 信息块擦除
   信息块的擦除主要是指对选择字节的擦除,选择字节组织如下:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
发表于 2011-1-3 10:33:40 | 显示全部楼层
不错,帮顶![em01]
点评回复

使用道具 举报

发表于 2011-3-4 18:40:17 | 显示全部楼层
很好很详细~
点评回复

使用道具 举报

发表于 2011-6-26 23:24:01 | 显示全部楼层
很详细,不错!
点评回复

使用道具 举报

发表于 2011-6-28 09:30:42 | 显示全部楼层
可以看看吗, l路过就看看[em02]
点评回复

使用道具 举报

发表于 2011-7-14 18:48:30 | 显示全部楼层
非常感谢你的分享!
点评回复

使用道具 举报

发表于 2011-7-13 22:47:25 | 显示全部楼层
很不错的资料,谢谢楼主分享!
点评回复

使用道具 举报

发表于 2011-7-9 17:57:51 | 显示全部楼层
非常感谢你的分享!
点评回复

使用道具 举报

发表于 2011-7-9 16:30:42 | 显示全部楼层
[em02]12333333333333333
点评回复

使用道具 举报

发表于 2011-9-15 22:05:48 | 显示全部楼层
xie xie fen xiang
点评回复

使用道具 举报

发表于 2014-7-3 11:05:52 | 显示全部楼层
很不错的资料,谢谢楼主分享!
点评回复

使用道具 举报

发表于 2014-7-14 20:17:12 | 显示全部楼层
正在学习
点评回复

使用道具 举报

发表于 2014-7-20 00:05:58 来自手机 | 显示全部楼层
bucuo
点评回复

使用道具 举报

52RD网友  发表于 2015-4-29 09:28:32
[em09]
回复

使用道具

52RD网友  发表于 2015-4-29 09:28:49

正在学习
回复

使用道具

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2024-11-26 13:29 , Processed in 0.049054 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表