STM32 读写Flash (HAL)

您所在的位置:网站首页 stm32f407vet6的flash STM32 读写Flash (HAL)

STM32 读写Flash (HAL)

2023-07-17 22:57| 来源: 网络整理| 查看: 265

单片机:STM32F103C8T6

此功能每次单片机上电先读取Flash数据,然后将数据写入Flash再串口打印。

读出的数据累加再次写入Flash

这样每次关机后再上电就会继上一次的数累加,实现断电保存数据功能

flash.c

#include "flash.h" uint32_t FlashData; uint32_t Flashaddr = 0x08007000; void writeFlashTest(uint32_t writeFlashaddr,uint32_t writeFlashData)//FLASH写入数据 { HAL_FLASH_Unlock(); //解锁FLASH FLASH_EraseInitTypeDef f; //初始化FLASH_EraseInitTypeDef f.TypeErase = FLASH_TYPEERASE_PAGES;//标明Flash执行页面只做擦除操作 f.PageAddress = Flashaddr; //声明要擦除的地址 f.NbPages = 1; //说明要擦除的页数,此参数必须是Min_Data = 1和Max_Data =(最大页数-初始页的值)之间的值 //一些MCU一页是1KB,一些MCU一页是2KB uint32_t PageError = 0; //设置PageError,如果出现错误这个变量会被设置为出错的FLASH地址 HAL_FLASHEx_Erase(&f, &PageError); //调用擦除函数 HAL_FLASH_Program(TYPEPROGRAM_WORD, Flashaddr, writeFlashData);//对FLASH烧写 HAL_FLASH_Lock(); //锁住FLASH } uint32_t readFlashTest(uint32_t writeFlashaddr) //FLASH读取数据 { uint32_t readFlashData = *(__IO uint32_t*)(writeFlashaddr); //*(__IO uint16_t *)是读取该地址的参数值,其值为16位数据,一次读取两个字节,*(__IO uint32_t *)就一次读4个字节 return readFlashData; }

flash.h

#ifndef __FLASH_H__ #define __FLASH_H__ #include "main.h" extern uint32_t FlashData; extern uint32_t Flashaddr; void writeFlashTest(uint32_t writeFlashaddr,uint32_t writeFlashData);//FLASH写入数据 uint32_t readFlashTest(uint32_t writeFlashaddr); //FLASH读取数据 #endif

在main函数中先读取数据

再写入和打印 

HAL_Delay(2000); printf("The MCU powers on..............\r\n"); FlashData=readFlashTest(Flashaddr); while(1) { writeFlashTest(Flashaddr,FlashData); //往 Flashaddr 地址里写 FlashData readFlashTest(Flashaddr);//读Flashaddr 地址里的数据 readFlashData printf("addr:0x%x, data:0x%x\r\n", Flashaddr, readFlashTest(Flashaddr)); FlashData++; HAL_Delay(1000); }

​​​​​​​

 

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3