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

【经验分享】STM32F7xx —— 内部flash

[复制链接]
STMCU小助手 发布时间:2021-12-11 12:00
这个就没什么好说的了,直接上代码了,主要封装了三个函数,擦除,写flash,读flash。

  1. // STM32F767IGT6: 1M flash
  2. // STM32F767ZIT6: 2M flash
  3. #define ADDR_FLASH_SECTOR_0     ((uint32_t)0x08000000) /* Base @ of Sector 0, 32 Kbytes */
  4. #define ADDR_FLASH_SECTOR_1     ((uint32_t)0x08008000) /* Base @ of Sector 1, 32 Kbytes */
  5. #define ADDR_FLASH_SECTOR_2     ((uint32_t)0x08010000) /* Base @ of Sector 2, 32 Kbytes */
  6. #define ADDR_FLASH_SECTOR_3     ((uint32_t)0x08018000) /* Base @ of Sector 3, 32 Kbytes */
  7. #define ADDR_FLASH_SECTOR_4     ((uint32_t)0x08020000) /* Base @ of Sector 4, 128 Kbytes */
  8. #define ADDR_FLASH_SECTOR_5     ((uint32_t)0x08040000) /* Base @ of Sector 5, 256 Kbytes */
  9. #define ADDR_FLASH_SECTOR_6     ((uint32_t)0x08080000) /* Base @ of Sector 6, 256 Kbytes */
  10. #define ADDR_FLASH_SECTOR_7     ((uint32_t)0x080C0000) /* Base @ of Sector 7, 256 Kbytes */
  11. #ifdef STM32F767ZIT6
  12. #define ADDR_FLASH_SECTOR_8     ((uint32_t)0x08100000) /* Base @ of Sector 8, 256 Kbytes */
  13. #define ADDR_FLASH_SECTOR_9     ((uint32_t)0x08140000) /* Base @ of Sector 9, 256 Kbytes */
  14. #define ADDR_FLASH_SECTOR_10    ((uint32_t)0x08180000) /* Base @ of Sector 10, 256 Kbytes */
  15. #define ADDR_FLASH_SECTOR_11    ((uint32_t)0x081C0000) /* Base @ of Sector 11, 256 Kbytes */
  16. #endif
复制代码
  1. // 获取要擦除扇区编号
  2. static uint32_t flash_sector_number(uint32_t address)
  3. {
  4.   uint32_t sector = 0;

  5.   if((address < ADDR_FLASH_SECTOR_1) && (address >= ADDR_FLASH_SECTOR_0))
  6.   {
  7.     sector = FLASH_SECTOR_0;
  8.   }
  9.   else if((address < ADDR_FLASH_SECTOR_2) && (address >= ADDR_FLASH_SECTOR_1))
  10.   {
  11.     sector = FLASH_SECTOR_1;
  12.   }
  13.   else if((address < ADDR_FLASH_SECTOR_3) && (address >= ADDR_FLASH_SECTOR_2))
  14.   {
  15.     sector = FLASH_SECTOR_2;
  16.   }
  17.   else if((address < ADDR_FLASH_SECTOR_4) && (address >= ADDR_FLASH_SECTOR_3))
  18.   {
  19.     sector = FLASH_SECTOR_3;
  20.   }
  21.   else if((address < ADDR_FLASH_SECTOR_5) && (address >= ADDR_FLASH_SECTOR_4))
  22.   {
  23.     sector = FLASH_SECTOR_4;
  24.   }
  25.   else if((address < ADDR_FLASH_SECTOR_6) && (address >= ADDR_FLASH_SECTOR_5))
  26.   {
  27.     sector = FLASH_SECTOR_5;
  28.   }
  29.   else if((address < ADDR_FLASH_SECTOR_7) && (address >= ADDR_FLASH_SECTOR_6))
  30.   {
  31.     sector = FLASH_SECTOR_6;
  32.   }
  33. #ifdef STM32F767ZIT6
  34.   else if((address < ADDR_FLASH_SECTOR_8) && (address >= ADDR_FLASH_SECTOR_7))
  35.   {
  36.     sector = FLASH_SECTOR_7;
  37.   }
  38.   else if((address < ADDR_FLASH_SECTOR_9) && (address >= ADDR_FLASH_SECTOR_8))
  39.   {
  40.     sector = FLASH_SECTOR_8;
  41.   }
  42.   else if((address < ADDR_FLASH_SECTOR_10) && (address >= ADDR_FLASH_SECTOR_9))
  43.   {
  44.     sector = FLASH_SECTOR_9;
  45.   }
  46.   else if((address < ADDR_FLASH_SECTOR_11) && (address >= ADDR_FLASH_SECTOR_10))
  47.   {
  48.     sector = FLASH_SECTOR_10;
  49.   }
  50.   else if((address < 0x081C0000) && (address >= ADDR_FLASH_SECTOR_11))
  51.   {
  52.     sector = FLASH_SECTOR_11;
  53.   }
  54. #else
  55.   else if(address >= ADDR_FLASH_SECTOR_7)
  56.   {
  57.     sector = FLASH_SECTOR_6;
  58.   }
  59. #endif

  60.   return sector;
  61. }

  62. // 擦除指定扇区数据 仔细的朋友会发现count没有用到,这里可以任意更改,我是为了兼容F1的命名。
  63. void SocFlashErase(uint32_t addr, uint8_t count)
  64. {
  65.   FLASH_EraseInitTypeDef flash_erase;
  66.   uint32_t flash_error;

  67.   HAL_FLASH_Unlock();

  68.   flash_erase.TypeErase = FLASH_TYPEERASE_SECTORS;  // 擦除类型,扇区擦除
  69.   flash_erase.Sector = flash_sector_number(addr);   // 要擦除的扇区
  70.   flash_erase.NbSectors = 1;                        // 一次只擦除一个扇区 这里可以使用参数的count 为了防止错误操作这里写成1
  71.   flash_erase.VoltageRange = FLASH_VOLTAGE_RANGE_3; // 电压范围,VCC=2.7~3.6V之间!!

  72.   __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |
  73.                          FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_ERSERR | FLASH_FLAG_BSY);

  74.   HAL_FLASHEx_Erase(&flash_erase, &flash_error);

  75.   FLASH_WaitForLastOperation(50000);

  76.   HAL_FLASH_Lock();
  77. }

  78. uint8_t SocFlashWrite(uint32_t addr, uint8_t *buffer, uint32_t length)
  79. {
  80.   uint32_t i;
  81.   uint16_t data = 0;

  82.   if (length == 0)
  83.   {
  84.     return 0;
  85.   }

  86.   HAL_FLASH_Unlock();

  87.   __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR | FLASH_FLAG_WRPERR |
  88.                          FLASH_FLAG_PGAERR | FLASH_FLAG_PGPERR | FLASH_FLAG_ERSERR | FLASH_FLAG_BSY);

  89.   // 按半字编程
  90.   for (i = 0; i < length; i += 2)
  91.   {
  92.     data = (*(buffer + i + 1) << 8) + (*(buffer + i));
  93.     HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, (uint32_t)(addr + i), data);
  94.   }

  95.   HAL_FLASH_Lock();

  96.   return 0;
  97. }

  98. uint32_t SocFlashRead(uint32_t addr, uint8_t *buffer, uint32_t length)
  99. {
  100.   memcpy(buffer, (void *)addr, length);

  101.   return length;
  102. }

复制代码


收藏 评论0 发布时间:2021-12-11 12:00

举报

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