赞
踩
时间记录:2024/2/19
(1)flash大小64K,地址0x08000000-0x08010000
(2)此芯片内存大小属于中容量产品,根据数据手册可知中容量产品一个扇区的大小为1K
(3)我们在这里需要知道的点就是,可以将数据保存在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)); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。