Flash地址空间的数据读取

Flash地址空间的数据读取

一、理论知识

  1. 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值