时间记录: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)头文件文章来源:https://www.toymoban.com/news/detail-833717.html
#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)源文件文章来源地址https://www.toymoban.com/news/detail-833717.html
#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));
}
}
到了这里,关于STM32的FLASH操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!