在此声明——本文摘自这里:
【码神岛】STM32F0x HAL库学习笔记(5)片内FLASH的读写操作
本文开发环境
- MCU型号:STM32F103C8T6
- IDE环境: MDK 5.25
- 代码生成工具:STM32CubeMx 5.0.1
- HAL库版本:v1.9.0
本文内容
- MCU片内Flash(闪存)的擦除与读写
- 一个Flash读写例子
/*main.c中的代码*/
void FLASH_EEPROM_Write(uint32_t n);
uint32_t FLASH_EEPROM_Read(void);
int main(void)
{
uint32_t Read;
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init(); //USART1串口的波特率为115200
KEY_Init();
printf("**************888888******************\r\n");//表示串口没有问题
Read=FLASH_EEPROM_Read();
printf("Read:%d\r\n",Read);//每次上电读取FLASH中的内容
while (1)
{
FLASH_EEPROM_Write(4000);
}
}
/**
* @brief 在FLASH中存储变量值,目前并不清楚这个程序有多大,能写到多少页,先定义在第127页中
* @param 用STM32中FLASH存储空间模拟EEPROM的读写
* @retval 参数:写入要存储的值
*/
void FLASH_EEPROM_Write(uint32_t n)
{
HAL_FLASH_Unlock(); //解锁
uint32_t PageError = 0;
if (HAL_FLASHEx_Erase(&EraseInitStruct,&PageError) == HAL_OK) //如果结构体中的起始地址0x0801FC00,这一页的数据擦除成功,返回OK
{
printf("擦除 成功\r\n");
}
uint32_t writeFlashData = n; //代写入的值
uint32_t addr = 0x0801FC00; //写入的地址
HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,addr, writeFlashData); //向FLASH中写入
printf("at address:0x%x, read value:%d\r\n", addr, *(__IO uint32_t*)addr);
HAL_FLASH_Lock();
while(1);
}
/**
* @brief 读出存储地址中的内容
* @param 用STM32中FLASH存储空间模拟EEPROM的读写
* @retval 返回值:从FLASH中读出数据
*/
uint32_t FLASH_EEPROM_Read(void)
{
HAL_FLASH_Unlock();
uint32_t Page = 0;
uint32_t addr = 0x0801FC00; //写入的地址
Page=*(__IO uint32_t*)addr;
return Page;
}
最后在调试助手上查看结果:
结束