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的注意事项在这里列一下:
二、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