由于Flash具有擦写速度快,读取方便,掉电不丢失等优点,在工程项目中,常常开辟一块儿数据来存放各个传感器的数据!
在stm32中,无需对于flash进行特别的初始化,但是还是先要去掉写保护,在写这个程序遇到的最大问题是无法进行debug,因为根本就看不到数据,最后只能使用串口发送数据来进行调试
需要注意的是
stm32只能一字(u32)或者半字(u16)输入,且利用flash写入时,其实地址必须为偶数,为奇数无法继续执行
擦除只能是全擦除或者单页擦除
用的是stm32F103VE,下面是调试过的代码
bsp_storge.h
#ifndef _BSP_STORAGE_H
#define _BSP_STORAGE_H
#include "stm32f10x_flash.h"
#include"stdint.h"
#include "bsp_usart.h"
#define Sector_DataSize 256
uint32_t MonthData_TempAddr=(uint32_t)0x0807f700; // 地址计数指针
uint32_t MonthDataStaAddr=(uint32_t)0x08032000; //当前月扇区起始地址
uint32_t MonthDataEndAddr=(uint32_t)0x0807f800; // 当前月扇区终止地址
static FLASH_Status PutDataIntoFlash(uint32_t Address1,uint8_t *buf,uint32_t len);
void ReadFromFlash(uint32_t Addr,uint8_t *buf,uint32_t len);
FLASH_Status WriteToFlash(uint32_t TempAddr,uint8_t *RomData,uint32_t len,uint32_t DataStaAddr,uint32_t DataEndAddr);
void flashtext(void) ;
#endif /*_BSP_STORAGE_H */
bsp_storage.c
#include "bsp_storage.h"
#define PageSize 2048
//#define MonthDataStaAddr ((uint32_t)0x08032000) //sector:100
//#define MonthDataEndAddr ((uint32_t)0x08039FFF) //sector:115 end
//#define LastMonthDataStaAddr ((uint32_t)0x0803A000) //sector:116
//#define LastMonthDataEndAddr ((uint32_t)0x08041FFF) //sector:131 end
//
//#define BeforeLastMonthDataStaAddr ((uint32_t)0x08042000) //sector:132
//#define BeforeLastMonthDataStaAddr ((uint32_t)0x0804AFFF) //sector:149 end
/***************************************************************************************************
*\Function PutDataIntoFlash(uint32_t Address1,uint8_t *buf,uint8_t len)
*\Description 将数据放入到flash中
*\Parameter uint32_t Address1
*\Parameter uint8_t *buf
*\Parameter uint8_t len
*\Return void
*\Note 2014年7月19日 地址只能是偶数
*\Log PutDataIntoFlash(0x0807F800,aaa,5);
*
***************************************************************************************************/
static FLASH_Status PutDataIntoFlash(uint32_t Address1,uint8_t *buf,uint32_t len)
{
uint32_t i;
uint16_t TempData16;// 十六位临时数据变量
FLASH_Status status = FLASH_COMPLETE;
if(len%2==0) // 数据长度奇偶判断
{
for(i=0;i=DataEndAddr) // DataEndAddr,DataStaAddr即使开始的时候定为全局变量,但仍旧无法传值,估计是因为写flash的原因,对于地址的传入还是用参数传入
{
MonthData_TempAddr=DataStaAddr;
}
FLASH_Lock();
return status;
}
/***************************************************************************************************
*\Function flashtext(void)
*\Description flash测试函数
*\Return void
*\Note 2014年7月21日
*\Log
***************************************************************************************************/
void flashtext(void)
{
// uint32_t temp3;
// uint32_t Addr;
// uint8_t aaa[5]={0x01,0x02,0x03,0x04,0x05};
// uint8_t buf[7]={0};
uint8_t buf[256]={0x01,0x02,0x03,0x04,0x05};
// FlagStatus status=RESET;
// status=FLASH_GetReadOutProtectionStatus();
// Usart_Sendchar(USART2,0x12);
// WriteToFlash(0x08032000,buf,256);
// WriteToFlash(0x08032100,buf,256);
// WriteToFlash(0x08032200,buf,256);
WriteToFlash(MonthData_TempAddr,buf,256,MonthDataStaAddr,MonthDataEndAddr);
WriteToFlash(MonthData_TempAddr,buf,256,MonthDataStaAddr,MonthDataEndAddr);
WriteToFlash(MonthData_TempAddr,buf,256,MonthDataStaAddr,MonthDataEndAddr);
// WriteToFlash(MonthData_TempAddr,buf,256);
//WriteToFlash(MonthData_TempAddr,buf,256);
//FLASH_ErasePage(0x0807F800);
/// PutDataIntoFlash(0x0807F800,aaa,5);
// ReadFromFlash(0x0807F800,buf,5);
// NumDisplayOnLCD(buf,5);
// FLASH_ProgramHalfWord(0x0807F800,0x0123);
while(1);
//
// Addr=*(__IO uint16_t *) (((uint32_t)0x0807F801));
// Usart_Sendchar(USART2,(uint8_t)Addr);
//Addr=(uint32_t)0x0801FC00;
// temp3=*(__IO uint32_t*)Addr;
}