Stm32 HAL库 访问内部flash空间
- 代码的部分
- 串口
- 配置申明文件
- main函数
在一些时候,需要存储一些数据,但是又不想接外部的flash,那我们可以知道,其实还有内部的flash可以使用,
需要注意的是内部flash,读写次数有限,所以需要控制擦写次数
首先使用cubmx生成代码,
就是配置时钟和debug口,还有串口信息
代码的部分
串口
/* USER CODE BEGIN PV */
#include "stdio.h"
int fputc(int ch,FILE *f)
{
HAL_UART_Transmit (&huart1 ,(uint8_t *)&ch,1,HAL_MAX_DELAY );
return ch;
}
/* USER CODE END PV */
配置申明文件
这里配置了地址的申明文件,和flash操作的结构体
需要注意的是,每个芯片都有最大的flash空间,以及代码空间,所以建议在配置地址的时候尽量到地址空间的后面,这样可以防止擦写到代码的空间。
/* USER CODE BEGIN 0 */
//debug 查看对应地址,是否正确,如果显示的是问号,则无此位置
//C6T6 32k 最大地址 0x08007FF0
//C8T6 64k 最大地址 0x0800FFE0
#define FLASH_SAVE_ADDR 0x08007000
static FLASH_EraseInitTypeDef EraseInitStruct = {
.TypeErase = FLASH_TYPEERASE_PAGES, //页擦除
.PageAddress = FLASH_SAVE_ADDR, //擦除地址
.NbPages = 1 //擦除页数
};
/* USER CODE END 0 */
main函数
下面就是main函数的配置,
流程就是 擦除->写入数据->读出数据
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_USART1_UART_Init();
while (1)
{
HAL_FLASH_Unlock();
uint32_t PageError = 0;
__disable_irq(); //擦除前关闭中断
if (HAL_FLASHEx_Erase(&EraseInitStruct,&PageError) == HAL_OK)
{
printf("擦除 成功\r\n");
}
__enable_irq(); //擦除后打开中断
uint32_t writeFlashData = 0x55555555; //待写入的值
uint32_t addr = FLASH_SAVE_ADDR; //写入的地址
HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD,addr, writeFlashData);
printf("at address:0x%x, read value:0x%x\r\n", addr, *(__IO uint32_t*)addr);
HAL_FLASH_Lock();
while(1);
}
/* USER CODE END 3 */
}