STM32实现内部Flash的读写(HAL库版)
  Flash 中⽂名字叫闪存,是⼀种长寿命的⾮易失性(断电数据不丢失)的存储器。可以对称为块的存储器单元块进⾏擦写和再编程,在进⾏写⼊操作之前必须先执⾏擦除。⼀个Nand Flash由多个块(Block)组成,每个块⾥⾯⼜包含很多页(page)。每个页对应⼀个空闲区域/冗余区域(spare area),这个区域不是⽤来存储数据的,⽤于放置数据的校验值检测和纠错的。块,是Nand Flash的擦除操作的基本/最⼩单位。页,是Nand Flash的写⼊操作的基本/最⼩的单位。
  ⾸先简要写⼀下FLASH的读写流程:
    对FLASH写⼊数据
    解锁FLASH
    擦除FLASH
    写⼊数据到FLASH
    锁住FLASH 
  FLASH读取数据(直接读取相应的FLASH地址即可)
  操作MCU⾥的Flash,还有⼏个注意事项:
  1、往Flash写⼊数据的时候,要先对要写⼊的页进⾏擦除,如果要写的页⾥有数据,要先读出来在缓存区,再把页擦除,再写⼊数据;在擦除页之后,只要这次你写的数据⼤⼩不够⼀页,可以连续写⼊。
  2、要计算好程序的内存,因为你的程序也是保存在MCU的Flash⾥的,如果你操作到保存着程序的内存,程序就会死掉,⾄于程序内存怎么看,你可以⽣成bin⽂件,bin⽂件的⼤⼩就是你程序所占内存的⼤⼩了,⽣成bin⽂件可以参考博客:;程序内存基本都是从Flash内存⼀开始存起的,这⾥以STM32Fo72c8t6举例,如下图。
  看图可以看出,这个芯⽚的Flash内存范围是0x0800 0000 ~ 0x0802 0000 ,假设我要烧录进去的bin⽂件为10K,那我们操作Flash的时候,地址就要从0x0800 0000 +  (0x400*11) 开始,避开程序的存储位置,Flash地址偏移1位就是1个字节。
  3、要注意MCU⼀页的⼤⼩,⼀些MCU⼀页是1KB,⼀些MCU⼀页是2KB
  下⾯举个例⼦写⼊数据0x0001到Flash中uint16_t my_add = 0x0001;
     uint32_t Robot_Num_Flash_Add = 0x08005000;
FLASH_EraseInitTypeDef My_Flash;  //声明 FLASH_EraseInitTypeDef 结构体为 My_Flash
HAL_FLASH_Unlock();//解锁Flash
My_Flash.TypeErase = FLASH_TYPEERASE_PAGES;  //标明Flash执⾏页⾯只做擦除操作
My_Flash.PageAddress = Robot_Num_Flash_Add;  //声明要擦除的地址
My_Flash.NbPages = 1;                        //说明要擦除的页数,此参数必须是Min_Data = 1和Max_Data =(最⼤页数-初始页的值)之间的值
uint32_t PageError = 0;                    //设置PageError,如果出现错误这个变量会被设置为出错的FLASH地址printf怎么读的
HAL_FLASHEx_Erase(&My_Flash, &PageError);  //调⽤擦除函数擦除
uint16_t Write_Flash_Data = my_add;
  //对Flash进⾏烧写,FLASH_TYPEPROGRAM_HALFWORD 声明操作的Flash地址的16位的,此外还有32位跟64位的操作,⾃⾏翻查HAL库的定义即可
      HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, Robot_Num_Flash_Add, Write_Flash_Data);
HAL_FLASH_Lock(); //锁住Flash
  写完之后,接着就到读了,Flash写有次数限制,写的次数在1W次还是10W次(忘了)就不可写⼊了,⽽读是没有次数限制的,读多少次都可以,下⾯就把写⼊到Flash⾥的数据0x0001读出来
uint32_t Robot_Num_Flash_Add = 0x08005000;
   ID_Num = *(__IO uint16_t*)( Robot_Num_Flash_Add ); //*(__IO uint16_t *)是读取该地址的参数值,其值为16位数据,⼀次读取两个字节,*(__IO uint32_t *)就⼀次读4个字节    printf("ID_num:0x%x\r\n", ID_Num);
  经过上⾯的程序就可以实现 STM32 中 Flash 数据的读写了,具体怎么读写,每个案⼦不同,各位就可以根据需求去修改,只要注意好注意
事项即可,代码已经实测可⽤。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。