你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32L073 的Flash Half-Page 编程

[复制链接]
seawwh 提问时间:2016-4-16 10:59 /
求助: STM32L073 的Flash Half-Page 编程

  最近使用NUCLEO-L073RZ 开发板试验一下Flash的烧写,Copy Flash区域的数据到另一个Flash区域。按Word烧写没有问题,但是按Half-Page烧写总是不成功。按Word烧写的效率太低。在L0的库函数中未见Half-Page的例子,
  
  试验代码在RAM中运行,关闭了Flash 预取;仍然不成功。
  试验中发现:
    如果 pBu 指向RAM空间则可以写成功,指向Flash 则不会成功。

代码如下:

u32 xBu[16]={0x11111111,0x22222222,0x33333333,0x44444444};

__ramfunc  void  IAP_Flash_CopyPage(u32 DstAdr, u32 *pBu, s32 Count) {
u16 i,k;

  if((FLASH->PECR & FLASH_PECR_PRGLOCK) != RESET)  {
    if((FLASH->PECR & FLASH_PECR_PELOCK) != RESET) {  
      FLASH->PEKEYR = FLASH_PEKEY1;
      FLASH->PEKEYR = FLASH_PEKEY2;
    }
    FLASH->PRGKEYR = FLASH_PRGKEY1;
    FLASH->PRGKEYR = FLASH_PRGKEY2;  
  }  
  while (Count>0) {
    // Erase One Page;
    while (FLASH->SR & FLASH_FLAG_BSY);
    FLASH->PECR |=  (FLASH_PECR_ERASE | FLASH_PECR_PROG);  
    *(vu32 *)DstAdr = 0x00000000;
    while (FLASH->SR & FLASH_FLAG_BSY);
    FLASH->PECR &= ~(FLASH_PECR_ERASE | FLASH_PECR_PROG);  
    FLASH->SR   |= FLASH_SR_EOP;
   
    // Prog 2 Half Pages
    for (k=0; k<2; k++) {
      if (Count>0) {
        FLASH->PECR |=  (FLASH_PECR_FPRG  | FLASH_PECR_PROG);
        for (i=0; i<16; i++) {
          *(vu32 *)DstAdr =(u32)*pBu;
          DstAdr+=4; pBu++;
        }  
        Count-=64;
        while (FLASH->SR & FLASH_FLAG_BSY);
        FLASH->SR   |= FLASH_SR_EOP;
        FLASH->PECR &= ~(FLASH_PECR_FPRG  | FLASH_PECR_PROG);
      }
    }
  }  
  FLASH->SR   |= FLASH_SR_EOP;
  FLASH->PECR &=~ (FLASH_PECR_FPRG  | FLASH_PECR_PROG);  
  FLASH->PECR |= FLASH_PECR_PELOCK;
}

收藏 评论1 发布时间:2016-4-16 10:59

举报

1个回答
xmshao 回答时间:2016-4-18 23:53:34
你确定支持HALF PAGE??

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版