Flash地址空间的数据读取
一、理论知识
- STM32F103C8T6的Flash存储结构
STM32F103C8T6微控制器配备了64KB的Flash存储空间,该Flash存储空间的起始地址为0x08000000,并从该地址开始按顺序存储程序代码和数据。
Flash的地址范围:
Flash起始地址:0x08000000
Flash的大小:64KB
Flash的结束地址:0x08010000 - 1
2. Flash的擦除与写入机制
在进行Flash存储的写入操作时,STM32F103C8T6采用的是页擦除机制。即,在Flash中写入数据之前,必须先对目标地址的页进行擦除。每次擦除操作会清除一个固定大小的Flash页面,通常为1KB或2KB,具体取决于芯片型号和配置。
擦除操作: 需要先擦除对应的Flash页,才能写入数据。
写入操作: Flash存储器每次写入的数据量通常为单字节(8位),但是为了提高效率,通常在编程时会使用更大的数据块(例如:32位对齐操作)。
3. Flash的读写速率与限制
STM32F103C8T6的Flash在编程时的写入速率比较慢,通常在几微秒到几十微秒之间。具体速率与Flash存储的类型、页大小、写入的次数等因素有关。
写入次数限制: Flash的写入操作是有限次数的,通常约为1000次擦写。超过这个次数后,Flash可能会失效或出现存储错误。
数据验证: 在进行数据写入后,通常需要从Flash中读取数据并进行校验,以确保数据的正确性。
二、cubemx配置
新建工程
配置SYS
配置RCC
配置一个输出引脚,用来观察代码运行状况
配置时钟树
调整堆栈大小
三、代码完善
加入flash.c和flash.h文件
flash.c
/*
* Copyright (c) 2006-2021, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2023-12-07 Windows the first version
*/
#include "flash.h"
extern void FLASH_PageErase(uint32_t PageAddress);
extern HAL_StatusTypeDef FLASH_WaitForLastOperation(uint32_t Timeout);
//#define TYPEPROGRAM_CHAR 0x00U /*!<Program a char (8-bit) at a specified address.*/
//#define TYPEPROGRAM_HALFWORD 0x01U /*!<Program a half-word (16-bit) at a specified address.*/
//#define TYPEPROGRAM_WORD 0x02U /*!<Program a word (32-bit) at a specified address.*/
//#define TYPEPROGRAM_DOUBLEWORD 0x03U /*!<Program a double word (64-bit) at a specified address*/
void Flash_Write(uint32_t TypeProgram, uint32_t Address, uint8_t (*Data), uint32_t len)
{
HAL_FLASH_Unlock();
FLASH_PageErase(Address); //²Á³ýբ¸öɈǸ
CLEAR_BIT(FLASH->CR, FLASH_CR_PER); //ǥ³ýCR¼Ĵ憷µĐER룬´˲ٗ÷Ӧ¸ÔچLASH_PageErase()ͪ³ɣ¡
//µ«ʇHAL¿ æ²¢ûӐ£¬Ӧ¸ÊLjAL¿⢵g£¡
if (TypeProgram==TYPEPROGRAM_CHAR) {
for (int var = 0; var < len/2; var++) {
uint8_t data1=(uint8_t)*Data;
uint8_t data2=(uint8_t)*(Data+1);
uint64_t datar = data2<<8|data1;
HAL_FLASH_Program(TYPEPROGRAM_HALFWORD, Address,datar);
Address+=2;
Data+=2;
}
} else {
for (int var = 0; var < len; var++) {
HAL_FLASH_Program(TypeProgram, Address, *Data);
Address