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 0x08007000static 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 */
}