IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32 FLASH 简单读写操作【有代码】 -> 正文阅读

[嵌入式]STM32 FLASH 简单读写操作【有代码】

【举报再看养成习惯,噢 不对,点赞再看 养成习惯。感谢支持】

STM32的Flash操作分为读写:读写。

一、读操作

读取比较简单,直接指针解引用地址就可以读取。注意一下读取的单位即可

/*************************************************************
** Function name:       STMFLASH_ReadWord
** Descriptions:        读操作
** Input parameters:    要读取的地址
** Output parameters:   None
** Returned value:      None
** Remarks:             None
*************************************************************/
uint32_t STMFLASH_ReadWord(uint32_t faddr)
{
	return *(uint32_t*)faddr; 
}


/*************************************************************
** Function name:       STMFLASH_Read
** Descriptions:        连续读取操作
** Input parameters:    NumToRead 要读取的数据个数,单位为uint32
** Output parameters:   None
** Returned value:      None
** Remarks:             None
*************************************************************/
void STMFLASH_Read(uint32_t ReadAddr, uint32_t *pBuffer, uint32_t NumToRead)
{
	uint32_t i;
	for(i = 0; i < NumToRead; i++)
	{
		pBuffer[i]=STMFLASH_ReadWord(ReadAddr);	                    //读取4个字节.
		ReadAddr+=4;												//偏移4个字节.	
	}
}

二、写操作

注意事项:写操作之前需要先对扇区进行擦除,以STM32G030F6举例,打开JFlash可以看到芯片的具体分区,2K为一个扇区,一共16个扇区。

?所以之后我们擦除的时候每次就要擦除2K数据。接下来看代码

// G030F6P6 Flash共计32K  16个扇区  计划使用后后两个扇区,即4K存储数据 ,单次最小擦除2K数据?有待确定

#define FLASH_SECTOR14_START                      0x08007000
#define FLASH_SECTOR14_END                        0x080077FF
#define FLASH_SECTOR15_START                      0x08007800
#define FLASH_SECTOR15_END                        0x08007FFF

#define FLASH_DATA_ADDR_MIN                         FLASH_SECTOR14_START
#define FLASH_DATA_ADDR_MAX                         FLASH_SECTOR15_END

#define FLASH_DATA_ADDR_BASE                        FLASH_DATA_ADDR_MIN
#define CALIBRATION_L_LR_VALUE_ADDR                 FLASH_DATA_ADDR_BASE+0
#define CALIBRATION_L_UD_VALUE_ADDR                 FLASH_DATA_ADDR_BASE+12
#define CALIBRATION_R_LR_VALUE_ADDR                 FLASH_DATA_ADDR_BASE+24
#define CALIBRATION_R_UD_VALUE_ADDR                 FLASH_DATA_ADDR_BASE+36
#define FLASH_WAITETIME                             1000

// bind addr长度为5字节  实际占用2个uint32
#define BIND_MSG_BASE                       FLASH_SECTOR15_START     
#define BIND_ADDR                           BIND_MSG_BASE+0




/*************************************************************
** Function name:       STM32G0_GetFlashSector
** Descriptions:        获取G030芯片中addr所在的扇区
** Input parameters:    None
** Output parameters:   None
** Returned value:      None
** Remarks:             None
*************************************************************/
uint8_t STM32G0_GetFlashSector(uint32_t addr){
	if (addr >= FLASH_SECTOR14_START && addr <= FLASH_SECTOR14_END){
		return 14;
	}else if (addr >= FLASH_SECTOR15_START && addr <= FLASH_SECTOR15_END){
		return 15;
	}
	return 16;
}

/*************************************************************
** Function name:       STMFLASH_Write
** Descriptions:        STM32写操作
** Input parameters:    pBuffer 传入需要存储的指针、 NumToWrite 需要写入的字节数量/8(单次最少写入双字大小 8字节)
** Output parameters:   None
** Returned value:      None
** Remarks:             None
*************************************************************/
void STMFLASH_Write(uint32_t WriteAddr, uint32_t *pBuffer, uint32_t NumToWrite)	
{ 
	FLASH_EraseInitTypeDef FlashEraseInit;
	HAL_StatusTypeDef FlashStatus = HAL_OK;
	uint32_t PageError = 0;
	uint32_t addrx = 0;
	uint32_t endaddr = 0;	
	if(WriteAddr < FLASH_DATA_ADDR_MIN || WriteAddr % 4)  return;	//非法地址 禁止写入的范围
	HAL_FLASH_Unlock();                         //解锁	
	addrx = WriteAddr;				            //写入的起始地址
	endaddr = WriteAddr + NumToWrite * 8;	    //写入的结束地址
	if(addrx < FLASH_DATA_ADDR_MAX)
	{
		while(addrx < endaddr)		        //扫清一切障碍.(对非FFFFFFFF的地方,先擦除)
		{   
			if(STMFLASH_ReadWord(addrx)!=0XFFFFFFFF)	//有非0XFFFFFFFF的地方,要擦除这个扇区
			{   
				FlashEraseInit.TypeErase = FLASH_TYPEERASE_PAGES;    //擦除类型,页擦除 
				FlashEraseInit.Page = STM32G0_GetFlashSector(addrx);      //从哪页开始擦除
				FlashEraseInit.NbPages = 1;                          //一次只擦除一页
				SEGGER_RTT_printf(0,"Flash Erase page is %d\r\n",FlashEraseInit.Page);
				if(HAL_FLASHEx_Erase(&FlashEraseInit, &PageError) != HAL_OK) 
				{
					SEGGER_RTT_printf(0,"Flash Erase err\r\n");
					break;      //发生错误了	
				}
				FLASH_WaitForLastOperation(FLASH_WAITETIME);            //等待上次操作完成
			}else {
				addrx += 4;
			}
		}
	}
	FlashStatus = FLASH_WaitForLastOperation(FLASH_WAITETIME);        //等待上次操作完成
	if(FlashStatus == HAL_OK)
	{
		while(WriteAddr < endaddr)									//写数据
		{
			if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_DOUBLEWORD, WriteAddr, *(uint64_t*)pBuffer) != HAL_OK)//写入数据
			{
				break;												//写入异常
			}
			WriteAddr += 8;     //地址加8
			pBuffer += 2;       //buff传进来的是32位的,所以这里+2 便是8个字节
		}  
		SEGGER_RTT_printf(0,"Flash write ok\r\n");
	}
	FLASH_WaitForLastOperation(FLASH_WAITETIME);        //等待上次操作完成
	HAL_FLASH_Lock();           									//上锁
} 

STM32G0_GetFlashSector函数可以获取输入地址在芯片的那个扇区,需要根据具体的芯片信息来更改。

STMFLASH_Write函数主要注意存储数据大小,函数注释中写了。要根据不同的芯片的Program函数来更改。

注意这里贴出的函数只能进行一些简单的存储操作,如果往同一个扇区的不同地方写入数据,第一次会写入成功,第二次会失败。函数中下图圈起来的地方应该检测要写入的扇区所有的地址才对,这里只检测了起始地址到结束地址的数据。如果写入数据在同一个扇区,但是不在同一个位置就会出现BUG。写入失败

?

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-03-12 17:43:47  更:2022-03-12 17:44:44 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 6:30:01-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码