1、目录
2、主函数
#include "MyFlash.h"
#include "MyUsart.h"
#include "delay.h"
#include "MyLed.h"
int main(void)
{
char data[]="abcde"; //要写入的数据
char data2[5]; //读存放
int i;
u8 STATUS=0;
init__uart1(); //串口1配置
GPIO_Config(); //GPIO配置,用于点亮led
STATUS=Flash_Write(data,5);
printf("写入状态:%d \r\n",STATUS);
if(STATUS)
{
printf("正在读取flash内容\r\n");
Flash_Read(data2,5);
printf("\r\n flash数据如下 : \r\n");
for(i=0;i<5;i++)
{
printf("%c",data2[i]);
}
}
while(1);
}
3、flash.c
#include "MyFlash.h"
#include "stm32f10x_it.h"
#define WriteFlashAddress 0x08001000 //读写起始地址(内部flash的主存储块地址从0x08000000开始)
/*******************************************************************************
* 函 数 名 : Flash_Write
* 函数功能 : buff:读出数据缓冲区,len:读出数据长度
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
uint8_t Flash_Write(char *buff, uint8_t len)
{
volatile FLASH_Status FLASHStatus;
uint8_t i=0;
uint32_t Address;
Address = WriteFlashAddress;
FLASHStatus = FLASH_COMPLETE; //操作完成
FLASH_Unlock(); //解锁
FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);//清除所有标志
//扇区页擦除
if(FLASHStatus == FLASH_COMPLETE)
{
for(i=0;i<len;i++)
{
FLASHStatus = FLASH_ProgramWord(Address, buff[i]); //写入一个字(32位)的数据入指定地址
Address = Address + 4; //地址偏移4个字节,变量是uint_t,所以偏移32位
}
FLASH_Lock(); //重新上锁,防止误写入
}
else
{
return 0;
}
if(FLASHStatus == FLASH_COMPLETE)
{
return 1;
}
return 0;
}
/*******************************************************************************
* 函 数 名 : Flash_Write
* 函数功能 : 数据读出函数入口
* 输 入 : buff:读出数据缓冲区,len:读出数据长度
* 输 出 : 无
*******************************************************************************/
void Flash_Read(char *buff, uint8_t len)
{
uint8_t i;
uint32_t Address;
Address = WriteFlashAddress;
for(i=0;i<len;i++)
{
buff[i] = (*(vu32*) Address); //读指定地址的一个字的数据
Address += 4; //地址偏移4个字节
}
}