我是靠谱客的博主 调皮红酒,最近开发中收集的这篇文章主要介绍STM32 读写Flash (HAL),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

单片机: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..............rn");
FlashData=readFlashTest(Flashaddr);
while(1)
{
    writeFlashTest(Flashaddr,FlashData); //往 Flashaddr 地址里写 FlashData
	readFlashTest(Flashaddr);//读Flashaddr 地址里的数据 readFlashData
	printf("addr:0x%x, data:0x%xrn", Flashaddr, readFlashTest(Flashaddr));
	FlashData++;
	HAL_Delay(1000);
}

​​​​​​​

 

 

最后

以上就是调皮红酒为你收集整理的STM32 读写Flash (HAL)的全部内容,希望文章能够帮你解决STM32 读写Flash (HAL)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部