Flash闪存

一.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)
	{
      
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值