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

基于STM32 OTA的读写FLASH

[复制链接]
攻城狮Melo 发布时间:2023-3-21 16:51
读写FLASH
1. 简述

STM32的写FLASH相对简单,直接读即可,写FLASH相对复杂。首先看STM32的内存大小和分配。

用到的HAL库函数:
  1. HAL_StatusTypeDef HAL_FLASH_Unlock(void);
  2. HAL_StatusTypeDef HAL_FLASHEx_Erase(FLASH_EraseInitTypeDef *pEraseInit, uint32_t *SectorError);
  3. HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout);
  4. HAL_StatusTypeDef HAL_FLASH_Program(uint32_t TypeProgram, uint32_t Address, uint64_t Data);
  5. HAL_StatusTypeDef HAL_FLASH_Lock(void);
复制代码

2. 读写FLASH代码
  1. #define STM32_FLASH_BASE 0x08000000

  2. /* 获取扇区号 */
  3. static uint8_t bsp_flash_get_sector(uint32_t addr)
  4. {
  5.         if (addr < ADDR_FLASH_SECTOR_1)       return FLASH_SECTOR_0;
  6.         else if (addr < ADDR_FLASH_SECTOR_2)  return FLASH_SECTOR_1;
  7.         else if (addr < ADDR_FLASH_SECTOR_3)  return FLASH_SECTOR_2;
  8.         else if (addr < ADDR_FLASH_SECTOR_4)  return FLASH_SECTOR_3;
  9.         else if (addr < ADDR_FLASH_SECTOR_5)  return FLASH_SECTOR_4;
  10.         else if (addr < ADDR_FLASH_SECTOR_6)  return FLASH_SECTOR_5;
  11.         else if (addr < ADDR_FLASH_SECTOR_7)  return FLASH_SECTOR_6;
  12.         else if (addr < ADDR_FLASH_SECTOR_8)  return FLASH_SECTOR_7;
  13.         else if (addr < ADDR_FLASH_SECTOR_9)  return FLASH_SECTOR_8;
  14.         else if (addr < ADDR_FLASH_SECTOR_10) return FLASH_SECTOR_9;
  15.         else if (addr < ADDR_FLASH_SECTOR_11) return FLASH_SECTOR_10;   
  16.         return FLASH_SECTOR_11;       
  17. }

  18. /* 读FLASH */
  19. uint32_t bsp_flash_read(uint32_t addr)
  20. {
  21.         return *(__IO uint32_t*)(addr);
  22. }

  23. /* 写FLASH */
  24. void bsp_flash_write(uint32_t addr)
  25. {
  26.         FLASH_EraseInitTypeDef f;
  27.         uint32_t sector_error=0;
  28.         uint32_t start_addr = addr;
  29.         uint32_t end_addr = start_addr + (size * 4);
  30.        
  31.         /* 1. 判断地址合法 */
  32.         if ((start_addr < STM32_FLASH_BASE) || (addr % 4)) return;
  33.        
  34.         /* 2. 解锁 */
  35.         HAL_FLASH_Unlock();
  36.        
  37.         /* 3. 擦除 */
  38.         if (addr < 0x1FFF0000)
  39.         {
  40.                 while (addr < end_addr)
  41.                 {
  42.                         if (hal_flash_read(addr) != 0XFFFFFFFF)
  43.                         {
  44.                                 f.TypeErase = FLASH_TYPEERASE_SECTORS;
  45.                                 f.Sector = hal_flash_get_sector(addr);
  46.                                 f.NbSectors = 1;
  47.                                 f.VoltageRange = FLASH_VOLTAGE_RANGE_3;
  48.                                 if (HAL_FLASHEx_Erase(&f, §or_error)!=HAL_OK) break;
  49.                         }
  50.                         else addr += 4;     
  51.                         FLASH_WaitForLastOperation(50000);
  52.                 }
  53.         }
  54.        
  55.         /* 4. 写入 */
  56.         addr = start_addr;
  57.         while (addr < end_addr)
  58.         {
  59.                 if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, addr, *data) != HAL_OK) break;       
  60.                 addr += 4;
  61.                 data++;
  62.         }
  63.        
  64.         /* 5. 上锁 */
  65.         HAL_FLASH_Lock();   
  66. }
复制代码

————————————————
版权声明:lljwork2021



收藏 评论0 发布时间:2023-3-21 16:51

举报

0个回答

所属标签

相似分享

官网相关资源

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