stm32页编程写入失败问题

如题,有一个项目的stm32的bootloader出现了问题,芯片使用stm32f103cbt6程序第一次可以正常升级,但一旦app文件发生改变,便无法升级。根据已知条件可知,第一次可正常升级,APP程序发生改变便无法升级。说明数据从上位机到板子这个过程的通讯是没有问题的,那就是数据在写入flash的过程中出现了问题。
在程序中将flash强制写0XFF,之后使用j-link将flash中的数据读出发现:
在这里插入图片描述
0x400位置的数据非0xff,猜测擦除flash出现问题。
通过观察擦除函数:

if(Internal_Flash_AddrPageOffset(addr)  ==  true)
  {
    if(Internal_Flash_Erase_Page(addr) ==  false)
    {
      //goto end;
      flasherr_cnt++;
    }
  }

Internal_Flash_AddrPageOffset函数原型如下:

bool Internal_Flash_AddrPageOffset(uint32 addr)
{
  if(addr < INTERNAL_FLASH_START_ADDR || addr > INTERNAL_FLASH_END_ADDR)
  {
    return false;
  }
  if((addr - INTERNAL_FLASH_START_ADDR) % PAGE_SIZE ==  0)  //整除页大小,返回true
  {
    return true;
  }
  return false;
}
bool Internal_Flash_Erase_Page(uint32 pageaddr)
{
  bool ret = false;
  __disable_irq();
  //必须关中断
  FLASH_Unlock();
  FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_OPTERR | FLASH_FLAG_WRPRTERR | 
                FLASH_FLAG_PGERR ); 
  if(FLASH_ErasePage(pageaddr)  ==  FLASH_COMPLETE)
  {  
    ret = true;
  }
  else
  {
    ret = false;
  }
  FLASH_Lock();
  __enable_irq();
  return ret;
}

程序很简单,如果能整除页大小,则执行擦除操作。
但是为什么前1K的数据能擦除,后1K数据没有擦除?
猜测cbt6页大小为1K。
修改页大小

/* 定义存储器页的个数,大小及表示页大小所需的位数 */
#define PAGE_NUMS           128
#define PAGE_SIZE           1024 //2048
#define PAGE_SIZE_BITS      11

问题的以解决,之后查询官方手册后发现。
在这里插入图片描述
在这里插入图片描述
中等容量stm32页大小为1K.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大文梅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值