STM32 + CubeMX + Flash读写数据

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

一、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);
	}
}

四、硬件连接

STM32STLINK
VCC3.3V
GNDGND
SWDIOSWDIO
SWCLKSWCLK
STM32CH340
GNDGND
PA10TX
PA9RX

五、运行效果

  打开串口助手,可以看到初始化时打印了从Flash读取到的数据,符合预期。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值