STM32 HAL 库读写内部 FLASH
1. 前期准备
安装好STM32CubeMX
安装好Clion
2. 创建项目
STM32内部FLASH主要作用存储用户程序代码,多余的可以用来存储用户数据了。例如FLASH总大小为128K,程序代码只用了100K,剩下的28K可用来存储我们自己的数据了。内部FLASH的读写比较繁琐,需要特定的指令才能完成,本章讲解如何利用HAL库函数实现内部FLASH的读写。
3. 编辑代码
组合以下四个HAL库函数实现内部FLASH的读写:
HAL_FLASH_Lock();//解锁内部FLASH,允许读写
HAL_FLASH_Unlock();//锁定内部FLASH,禁止非授权的操作
HAL_FLASHEx_Erase();//擦除内部FLASH
HAL_FLASH_Program();//内部FLASH编程
- 编写内部
FLASH写函数FLASH_Inside_Wr()
/**
* @brief 往内部FLASH写入数据
* @param addr 写入地址
* @param pdata 存储待写数据
* @retval None
*/
void FLASH_Inside_Wr(uint32_t addr,uint32_t Pdata)
{
//定义局部变量
uint32_t PageError = 0;
HAL_StatusTypeDef HAL_Status;
//擦除配置信息结构体,包括擦除地址、方式、页数等
FLASH_EraseInitTypeDef pEraseInit;
pEraseInit.TypeErase = FLASH_TYPEERASE_PAGES;//按页擦除
pEraseInit.PageAddress = addr;//擦除地址
pEraseInit.NbPages = 1;//擦除页数量
//step1 解锁内部FLASH,允许读写功能
HAL_FLASH_Unlock();
//step2 开始擦除addr对应页
HAL_Status = HAL_FLASHEx_Erase(&pEraseInit,&PageError);//擦除
if(HAL_Status != HAL_OK) printf("内部FlASH擦除失败!\r\n");
//step3 写入数据
HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,addr,Pdata);
//step4 锁定FLASH
HAL_FLASH_Lock();
}
写入数据前,需解锁并擦除,如上代码所示。
- 编写内部
FLASH读函数FLASH_Inside_Rd()
/**
* @brief 读取内部FLASH数据
* @param addr 读取地址
* @retval 读出的数据
*/
uint32_t FLASH_Inside_Rd(uint32_t addr)
{
//定义局部变量
uint32_t RdData = 0;
//step1 解锁内部FLASH,允许读写功能
HAL_FLASH_Unlock();
RdData = *(__IO uint32_t *)addr;
//step2 锁定FLASH
HAL_FLASH_Lock();
return RdData;
}
直接从内部地址读出数据即可。
4. 内部FLASH读写示例
在main.c中调用如下测试函数:
/**
* @brief 内部FLASH读写测试
*/
void FLASH_Inside_Test(void)
{
printf("\r\n\r\n------------------内部FLASH读写测试------------------\r\n\r\n");
uint32_t addr = 0x08010000;//确保该地址内部FLASH是空余的!
uint32_t WrData = 0x01234567;//待写入数据
uint32_t RdData = 0;//存储读取数据
printf("地址0x%x写入数据:0x%x\r\n",addr,WrData);
FLASH_Inside_Wr(addr,WrData);//写入数据
RdData = FLASH_Inside_Rd(addr);//读取数据
printf("地址0x%x读出数据:0x%x\r\n",addr,RdData);
}
5. 编译下载
将程序编译下载至开发板,并将开发板连接至PC,打开串口调试助手RYCOM,并设置为:115200+8+N+1,接收结果如下。
6. 小结
本章学习了使用HAL库函数读写内部FLASH。