STM32 + CubeMX + Flash读写数据

  记录一下利用HAL库读写STM32F103C8内部Flash的实验,本实验在STM32初始化时往Flash的0x8010000地址写入一个数据,然后读取并通过串口打印出来。

目录

  • 一、Flash基本知识
  • 二、STM32CubeMx配置
  • 三、代码编写
  • 四、硬件连接
  • 五、运行效果
  • 一、Flash基本知识

      Flash是一种掉电数据不会丢失的存储器,像我们使用Keil烧录程序时就烧录到Flash的0x8000000地址(默认是0x8000000,可以在Keil上配置),STM32上电以后会由STM32内部的Bootloader引导至0x8000000地址开始运行。
      那什么情况下要我们去读写Flash呢?答:当我们的外设资源有限无法再挂存储介质,却又要保存配置数据的时候。比如说设备ID、设备工作模式等,利用内部Flash可以减少外设资源的消耗。
      这里截一张STM32 Flash的图吧,可以结合下面的程序进行理解。

    有一些读写Flash的注意事项在这里列一下:

  • f103c8擦除最小单位为页,如果只想修改某1页里的某一个数据,需要在擦除前将这页的数据读出来再写入,防止数据丢失
  • flash擦除数据后(或未写入数据时),内容全为1
  • 写数据时注意当前程序占用的地址,不要将程序覆盖掉了
  • 二、STM32CubeMx配置

    1、RCC开启外部高速时钟(略)
    2、配置STLink调试口(略)
    3、配置串口方便调试输出(略)
    4、配置工程名、生成路径,之后生成工程(略)
    (1-4步的基础配置可以参考前面的文章《STM32基础工程模板创建》)

    三、代码编写

    在main.c中添加代码

    #include <stdio.h>
    #include "stm32f1xx_hal_flash.h"
    #include "stm32f1xx_hal_flash_ex.h"
    
    /**
      * @brief  往指定Flash地址写入数据
      * @param  Data  待写入数据
      *			Addr  待写入数据地址
      * @retval 成功返回0,失败返回-1
      */
    int8_t FLASH_Write(uint32_t Data, uint32_t Addr)
    {
    	uint32_t PageError = 0;
    	FLASH_EraseInitTypeDef EraseInitStruct;
    	
    	EraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;		//擦除类型:page擦除,即擦除整页。也可以选择擦除整片flash
    	EraseInitStruct.PageAddress = Addr;		                //擦除起始地址
    	EraseInitStruct.Banks = FLASH_BANK_1;					//擦除页数的Banks区域
    	EraseInitStruct.NbPages = 1;			     			//擦除页数
    	
    	HAL_FLASH_Unlock();     							    //解锁
    	
    	if(HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) == HAL_OK) 	    //擦除页
    	{
    		HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, Addr, Data); 			//向FLASH中写入数据
    		HAL_FLASH_Lock();
    		return 0;
    	}
    	return -1;
    }
    
    /**
      * @brief  从指定Flash地址读数据
      * @param  Data  待写入数据
      *			Addr  待写入数据地址
      * @retval 无
      */
    void FLASH_Read(uint32_t* Data, uint32_t Addr)
    {
    	HAL_FLASH_Unlock();
    	*Data=*(__IO uint32_t*)Addr;
    	HAL_FLASH_Lock();
    }
    
    int main(void)
    {
    	HAL_Init();
    	SystemClock_Config();
    	MX_GPIO_Init();
    	MX_USART1_UART_Init();
    	
    	uint32_t Read = 0;								//存放从Flash读出来的数据
    	FLASH_Write(100, 0x8010000);					//写数据
    	FLASH_Read(&Read, 0x08010000);					//读数据
    	printf("Read:%d\r\n",Read);
    	
    	while (1)
    	{
    		printf("----------AAAAAAAA \r\n");
    		HAL_Delay(1000);
    	}
    }
    

    四、硬件连接

    STM32 STLINK
    VCC 3.3V
    GND GND
    SWDIO SWDIO
    SWCLK SWCLK
    STM32 CH340
    GND GND
    PA10 TX
    PA9 RX

    五、运行效果

      打开串口助手,可以看到初始化时打印了从Flash读取到的数据,符合预期。

    作者:Lin201230

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32 + CubeMX + Flash读写数据

    发表回复