当前位置:   article > 正文

STM32F4内部Flash读写

stm32f4内部flash读写

 之前的文章中介绍过STM32F0列的内部Flash读写《STM32CubeMX之内部Flash读写》,F1系列的也是一样的。而F4系列的单片机与F0和F1略有不同,HAL库对应的函数也不同,今天来简单介绍一下。


 以TM32F429IGT6单片机为例,其内部Flash起始地址是:0x08000000,大小是0x00100000。

先看一下其内部Flash的Sector划分:

我们需要关心的只有Main memory。可以看到,每个Sector的大小不一样,前128K被分为了4个16K和1个64K,后面每个Sector都是128K。而F1系列的每个Sector大小相同都是1K或2K。

我们知道,Flash在写的时候必须先整块Sector擦除才能写入。F0/F1系列的直接调用函数擦除指定地址的Sector就行,比如我们需要擦除0x08000000起始地址的Sector,程序如下:

  1. FLASH_EraseInitTypeDef f;
  2. f.TypeErase = FLASH_TYPEERASE_PAGES;
  3. f.PageAddress = 0x08000000;
  4. f.NbPages = 1;
  5. PageError = 0;
  6. HAL_FLASH_Unlock();  
  7. HAL_FLASHEx_Erase(&f, &PageError);

而F4系列HAL库的Flash擦除函数,其形参为Sector的编号而非实际地址。比如我们需要擦除0x08000000起始地址的Sector,需要先获取Sector的编号0,作为函数的形参再调用擦除函数,程序如下:

  1. Sect = 0;
  2. FLASH_Erase_Sector(sect,FLASH_VOLTAGE_RANGE_3);

因此,我们需要编写一个函数用于获取Sector的编号,程序如下:

  1. uint32_t sectStartAddr[13]=
  2. {
  3. 0x08000000,//0
  4. 0x08004000,//1
  5. 0x08008000,//2
  6. 0x0800c000,//3
  7. 0x08010000,//4
  8. 0x08020000,//5
  9. 0x08040000,//6
  10. 0x08060000,//7
  11. 0x08080000,//8
  12. 0x080a0000,//9
  13. 0x080c0000,//10
  14. 0x080e0000,//11
  15. 0x08100000
  16. };
  17. //获取Sector的编号
  18. int GetSectorFromAddress(uint32_t address)
  19. {
  20. int sect;
  21. if( address < 0x08000000 || address > 0x080FFFFF )
  22. return -1;
  23. for( int i=0; i<12; i++ )
  24. {
  25. if( address >= sectStartAddr[i] && address < sectStartAddr[i+1] )
  26. {
  27. sect = i;
  28. break;
  29. }
  30. }
  31. return sect;
  32. }

则擦除0x08000000地址Sector的程序如下:

  1. sect = GetSectorFromAddress(0x08000000);
  2. FLASH_Erase_Sector(sect,FLASH_VOLTAGE_RANGE_3);

写入函数与F0/F1系列的一样,直接调用HAL库函数即可,函数形参的地址为绝对地址:

  1. startAddr = 0x08000000;
  2. endAddr = 0x08000020;
  3. for(i = startAddr; i < endAddr; i += 4)
  4. {
  5.     HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, i, *data++);
  6. }

    读取函数也是一样的,直接读取指定地址即可:
        

uint32_t data = *(uint32_t *)(0x08000000);

      当然,擦除写入之前不要忘了解锁和上锁的操作:

  1. HAL_FLASH_Unlock();//解锁flash
  2. __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_OPERR FLASH_FLAG_WRPERR | FLASH_FLAG_PGAERR FLASH_FLAG_PGPERR | FLASH_FLAG_PGSERR);
  3. //......擦除写入操作
  4. HAL_FLASH_Lock();


   内部Flash读写可以用于存储一些参数,也是实现IAP程序升级的关键,下一篇文章将介绍通过U盘实现单片机程序升级。

推荐阅读:

程序 | STM32使用CMSIS DSP库

教程 | 串口波形显示软件SerialChart的使用

教程 | STM32CubeMX系列教程

   欢迎关注公众号"嵌入式技术开发",大家可以后台给我留言沟通交流。如果觉得该公众号对你有所帮助,也欢迎推荐分享给其他人。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/article/detail/50687
推荐阅读
相关标签
  

闽ICP备14008679号