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

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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版