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


















