首先是Flash.c文件
/****************************************************************
*Function: STM32F103系列内部Flash读写操作
*Author: NanYongBing
*Date: 2016/04/09
****************************************************************/
#include "Flash.h"
#define STARTADDR 0x0800f000 //Flash的起始地址
volatile FLASH_Status FLASHStatus = FLASH_COMPLETE; //
/****************************************************************
*Name: ReadFlashNBtye
*Function: 从Flash内读取N个字节
*Input: ReadAddress:Flash和结构体共同的偏移地址 ReadBuf:数据地址
****************************************************************/
void ReadFlashNBtye(uint32_t ReadAddress, uint32_t *ReadBuf)
{
ReadAddress = (uint32_t)STARTADDR + ReadAddress;
*(ReadBuf) = *(__IO uint32_t*) ReadAddress;
return;
}
/****************************************************************
*Name: WriteFlashOneWord
*Function: 向内部Flash写入32位数据
*Input: WriteAddress:数据地址(偏移地址)WriteData:写入数据
*Output: NULL
****************************************************************/
void WriteFlashOneWord(uint32_t WriteAddress,uint32_t WriteData)
{
FLASH_UnlockBank1();
FLASH_ClearFlag(FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
//FLASHStatus = FLASH_ErasePage(STARTADDR);
//if(FLASHStatus == FLASH_COMPLETE)
{
FLASHStatus = FLASH_ProgramWord(STARTADDR + WriteAddress, WriteData); //flash.c 中API函数
//FLASHStatus = FLASH_ProgramWord(StartAddress+4, 0x56780000); //需要写入更多数据时开启
//FLASHStatus = FLASH_ProgramWord(StartAddress+8, 0x87650000); //需要写入更多数据时开启
}
FLASH_LockBank1();
}
/****************************************************************
*Function: 存储结构体中的数据
*Input: NULL
*Output: NULL
****************************************************************/
void save_cal(uint32_t * sptr,s32 size)
{
// s32 size;
u8 page=0,i=0;
u32 offset=0;//偏移地址
//uint32_t *sptr = (uint32_t *)&cal2;
//size=sizeof(cal2);
size+=4;//多读一个字节
page=(size+1024)/1024;
// printf("sizeof cal = %d, page = %d", size, page);
FLASH_Unlock();
for(i=0;i<page;i++)
{
FLASH_ErasePage(STARTADDR+i*1024); //擦除一个Flash页面
}
while(size>0)
{
WriteFlashOneWord( offset, *sptr);
offset+=4;//Flash地址的偏移
size-=4;//
sptr+=1;//结构体地址的偏移
}
FLASH_Lock() ;
}
/****************************************************************
*Function: 读出结构体中的数据
*Input: NULL
*Output: NULL
****************************************************************/
void restore_cal (uint32_t *ptr,s32 size)
{
// s32 size=sizeof(cal2);
u32 offset=0;//偏移地址
//uint32_t *ptr=(uint32_t *)&cal2;
size+=4;
while(size>0)
{
ReadFlashNBtye( offset, ptr );
size-=4;
offset+=4;
ptr+=1;
}
}
Flash.h文件
#ifndef __FLASH_H__
#define __FLASH_H__
#include "stm32f10x.h"
#include "stm32f10x_flash.h"
#include "vna.h"
void WriteFlashOneWord(uint32_t WriteAddress,uint32_t WriteData);
void ReadFlashNBtye(uint32_t ReadAddress, uint32_t *ReadBuf);
void save_cal(uint32_t * sptr,s32 size);
void restore_cal(uint32_t *ptr,s32 size);
#endif
在主函数中定义一个结构体 用于存储自己要存储的数据
struct CAL
{
int cksum; // used to determine of config is valid
int refclk; // 150mhz clk
int contrast; // displaycontrast adjustment 0..1023
int samplerate; // a sample rate index
int spare1;
int spare2;
int spare3;
char spare4[16];
int f_num, f_start, f_step; // freq in hz of calibration points
};
主函数只要调用下面两个函数就能够 用于向Flash中存储数据和读取数据
save_cal((uint32_t*)&cal,sizeof(cal)); // write cal to EEPROM
restore_cal((uint32_t*)&cal,sizeof(cal)); // make sure getting it back works
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>