一.Flash闪存基本信息
STM32系列的Flash包含程序储存器、系统储存器和选项字节,通过闪存存储器接口(外设)可以对
存储器映像
ROM 起始地址 存储器
0x0800 0000 程序储存器Flash
0x1FFF F000 系统储存器
0x1FFF F800 选项字节
RAM 起始地址 存储器
0x2000 0000 运行内存SRAM
0x4000 0000 外设寄存器
0xE000 0000 内核外设寄存器
使用*((__IO uint32_t *) Address);//读取Flash32位
使用*((__IO uint16_t *) Address);//读取Falsh16位
使用*((__IO uint8_t *) Address);//读取Flash8位
FLASH_ErasePage();;//清除地址页编码
FLASH_EraseAllPages();//全擦除函数
二.代码实现
1.读取内部Flash
main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "Store.h"
#include "Key.h"
uint32_t KeyNum;
int main(void)
{
OLED_Init ();
Key_Init();
Store_Init ();
OLED_ShowString (1,1,"Flag:");
OLED_ShowString (2,1,"Data:");
while(1)
{
KeyNum = Key_GetNum ();
if(KeyNum == 1)
{
Store_Data[1] ++;
Store_Data[2] += 2;
Store_Data[3] += 3;
Store_Data[4] += 4;
Store_Save();
}
if(KeyNum == 2)
{
Store_Clear();
}
OLED_ShowHexNum (1,6,Store_Data[0],4);
OLED_ShowHexNum (3,1,Store_Data[1],4);
OLED_ShowHexNum (3,6,Store_Data[2],4);
OLED_ShowHexNum (4,1,Store_Data[3],4);
OLED_ShowHexNum (4,6,Store_Data[4],4);
}
}
MyFLASH.c
#include "stm32f10x.h" // Device header
uint32_t MyFLASH_ReadWord(uint32_t Address)
{
return *((__IO uint32_t *) Address);//读取flash中32位地址的数据
}
uint16_t MyFLASH_ReadHalfWord(uint32_t Address)
{
return *((__IO uint16_t *) Address);//读取flash中16位地址的数据
}
uint8_t MyFLASH_ReadByte(uint32_t Address)
{
return *((__IO uint8_t *) Address);//读取flash中16位地址的数据
}
void MyFLASH_EraseAllPage(void)
{
FLASH_Unlock();//开锁
FLASH_EraseAllPages();//全擦除函数
FLASH_Lock();//上锁
}
void MyFLASH_ErasePage(uint32_t PageAddress)
{
FLASH_Unlock();//开锁
FLASH_ErasePage(PageAddress);//页擦除
FLASH_Lock();//上锁
}
void MyFLASH_ProgramWord(uint32_t Address,uint32_t Data)
{
FLASH_Unlock();//开锁
FLASH_ProgramWord(Address,Data);//32位字节编程
FLASH_Lock();//上锁
}
void MyFLASH_ProgramHalfWord(uint32_t Address,uint16_t Data)
{
FLASH_Unlock();//开锁
FLASH_ProgramHalfWord(Address,Data);
FLASH_Lock();//上锁
}
MyFLASH.h
#ifndef _MYFLASH_H
#define _MYFLASH_H
void MyFLASH_EraseAllPage(void);
void MyFLASH_ErasePage(uint32_t PageAddress);
uint32_t MyFLASH_ReadWord(uint32_t Address);
uint16_t MyFLASH_ReadHalfWord(uint32_t Address);
uint8_t MyFLASH_ReadByte(uint32_t Address);
void MyFLASH_ProgramWord(uint32_t Address,uint32_t Data);
void MyFLASH_ProgramHalfWord(uint32_t Address,uint16_t Data);
#endif
Store.c
#include "stm32f10x.h" // Device header
#include "MyFLASH.h"
#define STORE_START_ADDRESS 0X0800FC00
#define STORE_COUNT 512
uint16_t i;
uint16_t Store_Data[STORE_COUNT];
void Store_Init(void)
{
if(MyFLASH_ReadHalfWord(STORE_START_ADDRESS) != 0xA5A5)//判断第一位数据是不是0XA5A5
{
MyFLASH_ErasePage(STORE_START_ADDRESS);//清除地址页编码
MyFLASH_ProgramHalfWord(STORE_START_ADDRESS,0xA5A5);//把第一位数据改为0XA5A5
//除了第一位以外地址内所有数据都修改为0
for( i = 1;i < STORE_COUNT;i++)
{
MyFLASH_ProgramHalfWord(STORE_START_ADDRESS + i*2,0x0000);
}
}
//将数据存入SARM中
for(uint16_t i = 1;i < STORE_COUNT;i++)
{
Store_Data[i] = MyFLASH_ReadHalfWord(STORE_START_ADDRESS + i*2);
}
}
void Store_Save(void)
{
MyFLASH_ErasePage(STORE_START_ADDRESS);//清除地址页编码
for(uint16_t i = 0;i < STORE_COUNT;i++)
{
MyFLASH_ProgramHalfWord(STORE_START_ADDRESS + i*2,Store_Data[i]);//将ARSM数据转入FLASH
}
}
void Store_Clear(void)
{
for(uint16_t i = 1;i < STORE_COUNT;i++)
{
Store_Data[i] = 0x0000;//将SARM数据改为0x0000
}
Store_Save();//将数据存入Flash
}
Store.h
#ifndef _STORE_H
#define _STORE_H
extern uint16_t Store_Data[];
void Store_Init(void);
void Store_Save(void);
void Store_Clear(void);
#endif
2.读取芯片ID
main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
int main(void)
{
OLED_Init ();
OLED_ShowString (1,1,"F_SIZE:");
OLED_ShowHexNum(1,8,*((__IO uint16_t *)(0x1FFFF7E0)),4);//使用指针读取指定地址下闪存容量寄存器
OLED_ShowString (2,1,"U_IO:");
OLED_ShowHexNum(2,6,*((__IO uint16_t *)(0x1FFFF7E8)),4);//使用指针读取指定地址下产品唯一标志寄存器
OLED_ShowHexNum(2,11,*((__IO uint16_t *)(0x1FFFF7E8 + 0x02)),4);
OLED_ShowHexNum(3,6,*((__IO uint32_t *)(0x1FFFF7E8 + 0x04)),4);
OLED_ShowHexNum(3,11,*((__IO uint32_t *)(0x1FFFF7E8 + 0x08)),4);
while(1)
{
}
}