如何进行STM32的FLASH操作

欢迎入群共同学习交流
时间记录:2024/2/19

一、STM32F103C8T6FLASH介绍

(1)flash大小64K,地址0x08000000-0x08010000
(2)此芯片内存大小属于中容量产品,根据数据手册可知中容量产品一个扇区的大小为1K
闪存介绍
(3)我们在这里需要知道的点就是,可以将数据保存在flash中实现掉电保存

二、读写FLASH操作步骤

(1)写数据操作(一种方法)
1.解除写保护,向KEYR寄存器写入KEY1->0x45670123和KEY2->0xCDEF89AB进行解锁,按照顺序写入,否则会锁定FLASH_CR寄存器,直到下一次复位
2.清除状态位(可选),确认未在执行任何FLASH操作
3.清除扇区
4.写入半字16位数据
5.清除状态位(可选)
6.锁定写保护
RDP_Key->0x000000A5
(2)读数据操作(一种方法)
直接读取地址数据即可

三、代码示例(基于标准库实现)

(1)头文件

#ifndef __MYFLASH_H__
#define __MYFLASH_H__
#include <stm32f10x.h>

#define SECTORSIZE              1024                //一个扇区大小定义
#define MAXADDR                 0x08010000          //最大地址
#define LASTSECTORADDR          0x0800FC00          //最后一个扇区的地址

void vFlashWriteData(u32 addr,u8 *data,int data_len);//写数据,按照半字写入,一个扇区最多写入512个数据
void vFlashReadData(u32 addr,u8 *data,int data_len);//读数据

#endif

(2)源文件

#include "my_flash.h"

void vFlashWriteData(u32 addr,u8 *data,int data_len)
{
    if(addr < 0x08000000 || addr >= MAXADDR) return;    //地址校验
    
    u32 sectorBaseAddr = addr/1024*1024;
    
    FLASH_Unlock();//解锁
    FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR|FLASH_FLAG_OPTERR);//清除标志位,可不要
    FLASH_ErasePage(sectorBaseAddr);//擦除页数据,页的首地址,最后一页
    for(int i=0;i<data_len;i++){
        FLASH_ProgramHalfWord(addr+2*i,data[i]);
    }
    FLASH_ClearFlag(FLASH_FLAG_BSY|FLASH_FLAG_EOP|FLASH_FLAG_PGERR|FLASH_FLAG_WRPRTERR|FLASH_FLAG_OPTERR);//清除标志位,可不要
    FLASH_Lock();//上锁
}

void vFlashReadData(u32 addr,u8 *data,int data_len)
{
    if(addr < 0x08000000 || addr >= MAXADDR) return;    //地址校验
    
    for(int i=0;i<data_len;i++){
        data[i]=(u8)(*(vu16*)(addr+i*2));
    }
}

作者:KINO32

物联沃分享整理
物联沃-IOTWORD物联网 » 如何进行STM32的FLASH操作

发表评论