【STM32 HAL库的基本flash操作】文章部分内容来源网络,有问题请留言,谢谢。
读操作 读flash,直接用指针操作即可,但注意这里stm32是32位系统,所以读一次是半个字,也就是2个字节,写也是一样的;
uint16_t FLASH_ReadHalfWord(uint32_t faddr)
{
return *(__IO uint16_t*)faddr;
}
//从指定地址开始读出指定长度的数据
//ReadAddr:起始地址
//pBuffer:数据指针
//NumToWrite:半字(16位)数
void Flash_ReadData(uint32_t ReadAddr,uint16_t *pBuffer,uint16_t NumToRead)
{
uint16_t i;
for(i=0;
i
写操作 直接上代码,跟读一样,长度如果是字节数,一定要除以2;
void Flash_WriteData(uint32_t addr,uint16_t *data,uint16_t Size)
{
//1、解锁FLASH
HAL_FLASH_Unlock();
//2、擦除FLASH
//初始化FLASH_EraseInitTypeDef
FLASH_EraseInitTypeDef f;
f.TypeErase = FLASH_TYPEERASE_PAGES;
f.PageAddress = addr;
f.NbPages = 1;
//设置PageError
uint32_t PageError = 0;
//调用擦除函数
HAL_FLASHEx_Erase(&f, &PageError);
//3、对FLASH烧写
uint16_t TempBuf = 0;
for(uint16_t i = 0;
i< Size ;
i++)
{
TempBuf = *(data+i);
HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD , addr + i * 2, TempBuf);
}//4、锁住FLASH
HAL_FLASH_Lock();
}
测试
//实际应用中我们一般会使用一个结构体来保存参数,注意,数据长度要为偶数,所以我加了个NC在最后面
typedef struct
{
uint8_t test1
uint8_t test2
uint16_t test3;
uint8_t test4;
uint8_t NC;
}Tag_Para;
Tag_Para para;
#define PARA_ADDR 0x0800 0E00
void main()
{
//写flash
Flash_WriteData(PARA_ADDR, (uint16_t *)¶, (sizeof(Tag_Para))/2);
//读flash
Flash_ReadData(PARA_ADDR, (uint16_t *)¶, (sizeof(Tag_Para))/2);
}
推荐阅读
- stm32|基于STM32和freeRTOS智能门锁设计方案
- 日常分享|共享充电宝方案原理,具体部件组成以及主控MUC参数
- #|ARM裸机开发(汇编LED灯实验(I.MX6UL芯片))
- STM32|STM32的四种IO输出模式
- STM32 远程升级(ISP / IAP)
- stm32|stm32f103can总线过滤器配置
- STM32CubeMX配置SDIO模式(非DMA方式)
- STM32|如何建一个STM32F030标准库工程模板
- STM32 时钟RCC相关配置参考stm32f10x_rcc.h
- STM32 NVIC