自学内容网 自学内容网

STM32F103 hal 读写内部Flash实例第二章


前言


一、STM32 Flash是什么?

STM32 Flash是STM32微控制器内部的一种非易失性存储器,主要用于存储用户程序代码以及必要的配置信息。结合了ROM和RAM的长处,不仅具备电子可擦除可编程的性能,而且数据在断电后不会丢失,同时可以快速读取数据

二 、确保读写Flash地址不会与代码空间冲突

STM32的Flash存储器通常从地址0x08000000开始,结束地址是0x08000000加上芯片实际的Flash大小。这个区域主要用于存储程序代码和常量数据。因此,在读写Flash时,需要避开这个代码区域。
计算代码占用空间

方法一:查看.map文件:

在使用Keil或其他IDE编译STM32项目时,会生成一个.map文件。这个文件详细列出了程序的内存布局,包括代码段(Code)、只读数据段(RO-data)、读写数据段(RW-data)和零初始化数据段(ZI-data)的大小和地址。
通过查看.map文件,你可以了解代码占用了多少Flash空间,以及这些空间的具体地址范围。

方法二:计算程序占用的Flash空间:

程序占用的Flash空间通常等于Code段加上RO-data段加上RW-data段的大小。
确保你的读写地址不会落在这个计算出的地址范围内。

三、代码示例,读写 uint32_t 型数据

1.驱动部分

#include <string.h>

#define STM32FLASH_PAGE_SIZE 1024 // 每页大小为1024字节
#define STM32FLASH_BASE 0x08000000 // FLASH基地址

static uint32_t FlashBuffer[STM32FLASH_PAGE_SIZE >> 2]; // 缓冲区大小调整为32位对齐

/// 初始化FLASH
void FLASH_Init(void)
{
   
    HAL_FLASH_Unlock();
    __HAL_FLASH_CLEAR_FLAG(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPERR);
    HAL_FLASH_Lock();
}

void FLASH_Read(uint32_t Address, uint32_t* Buffer, uint32_t NumToRead)
{
   
    while(NumToRead != 0)
    {
   
        *Buffer = (*(volatile uint32_t *)Address);
        Buffer++;
        NumToRead--;
        Address += 4; // 地址增量为4
    }
}

void FLASH_WriteNotCheck(uint32_t Address, const uint32_t *Buffer, uint32_t NumToWrite)
{
   
    while (NumToWrite != 0)
    {
   
        if(HAL_FLASH_Program(FLASH_TYPEPRO

原文地址:https://blog.csdn.net/weixin_46039185/article/details/143648972

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!