里飞网

 找回密码
 立即注册
查看: 7695|回复: 0
打印 上一主题 下一主题

STM32的HAL写FLASH函数HAL_FLASH_Program死机问题解决

[复制链接]

45

主题

311

帖子

2814

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2814
跳转到指定楼层
楼主
发表于 2020-5-30 16:08:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 阿里兄 于 2020-6-1 12:00 编辑

出问题前使用的方法如下:仿真看半天也没看出问题在哪里,最后发现*pBuffer的地址是非4字节对齐,最后通过一个32位的中间变量解决了,也就是说HAL_FLASH_Program必需与写入的类型要对齐,即如果是
FLASH_TYPEPROGRAM_HALFWORD,表示写入的数的地址要2字节对齐,
FLASH_TYPEPROGRAM_WORD,表示写入的数的地址要4字节对齐,
FLASH_TYPEPROGRAM_DOUBLEWORD,表示写入的数的地址要8字节对齐。

  1. //pBuffer:数据存储区
  2. //WriteAddr:开始写入的地址(24bit)
  3. //NumByteToWrite:要写入的字节数(最大256),该数不应该超过该页的剩余字节数!!!         
  4. void FLASH_Write_Page(uint8_t *pBuffer,uint32_t WriteAddr,uint16_t NumByteToWrite)
  5. {
  6.         if ( (WriteAddr%FLASH_SECT_SIZE) == 0 )//如果写入地址为扇区地址
  7.         {
  8.             FLASH_Erase_Sector(WriteAddr);//需要先擦除扇区
  9.         }

  10.         HAL_FLASH_Unlock();
  11.         __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR);
  12.         for (int i = 0; i<NumByteToWrite; i+=4)
  13.         {
  14.             HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, WriteAddr, *(uint32_t*)(pBuffer+i));
  15.             WriteAddr+=4;
  16.         }
  17.         HAL_FLASH_Lock();
  18. }
复制代码


修改后的使用方法如下:


  1. //pBuffer:数据存储区
  2. //WriteAddr:开始写入的地址(24bit)
  3. //NumByteToWrite:要写入的字节数(最大256),该数不应该超过该页的剩余字节数!!!         
  4. void FLASH_Write_Page(uint8_t *pBuffer,uint32_t WriteAddr,uint16_t NumByteToWrite)
  5. {
  6.         if ( (WriteAddr%FLASH_SECT_SIZE) == 0 )//如果写入地址为扇区地址
  7.         {
  8.             FLASH_Erase_Sector(WriteAddr);//需要先擦除扇区
  9.         }

  10.         HAL_FLASH_Unlock();
  11.         __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_WRPERR);
  12.         for (int i = 0; i<NumByteToWrite; i+=4)
  13.         {
  14.             uint32_t data_tem;
  15.             memcpy(&data_tem, pBuffer+i, 4);
  16.             HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, WriteAddr, data_tem);
  17.             WriteAddr+=4;
  18.         }
  19.         HAL_FLASH_Lock();
  20. }
复制代码




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|里飞网  

GMT+8, 2024-11-23 15:41 , Processed in 0.063540 second(s), 5 queries , File On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

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