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)!