stm32f103zet6怎么保存flash參數(shù)
STM32的閃存模塊由:主存儲(chǔ)器、信息塊和閃存存儲(chǔ)器接口寄存器等 3 部分組成。
主存儲(chǔ)器,該部分用來存放代碼和數(shù)據(jù)常數(shù)(如 const 類型的數(shù)據(jù))。對(duì)于大容量產(chǎn)品,其被劃分為 256 頁,每頁 2K 字節(jié)。注意,小容量和中容量產(chǎn)品則每頁只有 1K 字節(jié)。從上圖可以看出主存儲(chǔ)器的起始地址就是0X08000000, B0、B1 都接 GND 的時(shí)候,就是從 0X08000000開始運(yùn)行代碼的。
信息塊,該部分分為 2 個(gè)小部分,其中啟動(dòng)程序代碼,是用來存儲(chǔ) ST 自帶的啟動(dòng)程序,用于串口下載代碼,當(dāng) B0 接 V3.3,B1 接 GND 的時(shí)候,運(yùn)行的就是這部分代碼。用戶選擇字節(jié),則一般用于配置寫保護(hù)、讀保護(hù)等功能,本章不作介紹。
閃存存儲(chǔ)器接口寄存器,該部分用于控制閃存讀寫等,是整個(gè)閃存模塊的控制機(jī)構(gòu)。對(duì)主存儲(chǔ)器和信息塊的寫入由內(nèi)嵌的閃存編程/擦除控制器(FPEC)管理;編程與擦除的高電壓由內(nèi)部產(chǎn)生。
在執(zhí)行閃存寫操作時(shí),任何對(duì)閃存的讀操作都會(huì)鎖住總線,在寫操作完成后讀操作才能正確地進(jìn)行;既在進(jìn)行寫或擦除操作時(shí),不能進(jìn)行代碼或數(shù)據(jù)的讀取操作。
flash大小64K。本例子0x0800 0000~0x800 3000作為bootloader使用,0x0800 3000~0x0800 C000作為程序存放地址,0x0800 C000~0x0800 FFFF作為本例子的數(shù)據(jù)存放區(qū)域。
程序:
#include “stm32f10x_flash.h”
#define PageSize 1024
u32 data[10] = {1,2,3,4,5,6,7,8,9,10};
u32 data_temp[10] = {0};
u8 flash_write(u32 StartAddr,u32 *p_data,u32 size);
int flash_read(u32 StartAddr,u32 *p_data,u32 size);
/******************************************************************************
* flash的寫函數(shù):輸入:
u32 StartAddr flash起始地址
u32 *p_data 待寫入數(shù)據(jù)指針u32 size寫入數(shù)據(jù)的數(shù)量
輸出:0:正確執(zhí)行
非0:出錯(cuò)
注意:輸入數(shù)據(jù)一定是u32 的指針,即數(shù)據(jù)一定是按照4字節(jié)對(duì)齊寫入的。
所以:size也是u32的個(gè)數(shù)(字節(jié)數(shù)的4分之一)
*******************************************************************************/
u8 flash_write(u32 StartAddr,u32 *p_data,u32 size)
{
volatile FLASH_Status FLASHStatus;
u32 EndAddr=StartAddr+size*4;
vu32 NbrOfPage = 0;
u32 EraseCounter = 0x0, Address = 0x0;
int i;
//為一是通過
FLASH_Unlock(); //解鎖函數(shù)
NbrOfPage=((EndAddr-StartAddr)》》10)+1;//有多少個(gè)頁被擦除//清除所有已有標(biāo)志
FLASH_ClearFlag(FLASH_FLAG_BSY | FLASH_FLAG_EOP | FLASH_FLAG_PGERR | FLASH_FLAG_WRPRTERR);
//擦頁
FLASHStatus=FLASH_COMPLETE;
for(EraseCounter=0;(EraseCounter《NbrOfPage)&&(FLASHStatus==FLASH_COMPLETE);EraseCounter++)
{
FLASHStatus=FLASH_ErasePage(StartAddr+(PageSize*EraseCounter));
}
//開始寫數(shù)據(jù)
Address = StartAddr;
i=0;
while((Address《EndAddr)&&(FLASHStatus==FLASH_COMPLETE))
{ FLASHStatus=FLASH_ProgramWord(Address,p_data[i++]);
Address=Address+4;
}
//檢驗(yàn)數(shù)據(jù)是否出錯(cuò)
Address = StartAddr;
i=0;
while((Address 《 EndAddr) && (MemoryProgramStatus != 0))
{
if((*(vu32*) Address) != p_data[i++])
{ MemoryProgramStatus = 0;
return 1;
}
Address += 4;
}
return 0;
}
int flash_read(u32 StartAddr,u32 *p_data,u32 size)
{
u32 EndAddr=StartAddr+size*4;
int MemoryProgramStatus=1;
u32 Address = 0x0;
int i=0;
Address = StartAddr;
while((Address 《 EndAddr) && (MemoryProgramStatus != 0))
{
p_data[i++]=(*(vu32*) Address);
Address += 4;
}
return 0;
}
調(diào)用例子:
flash_write(0x0800C000,&data[0],10);
flash_read(0x0800C000,&data_temp[0],10);
注意:#define PageSize 1024 根據(jù)不同型號(hào)有1K與2K的不同
STM32根據(jù)FLASH主存儲(chǔ)塊容量、頁面的不同,系統(tǒng)存儲(chǔ)器的不同,分為小容量、中容量、大容量、互聯(lián)型,共四類產(chǎn)品。
小容量產(chǎn)品主存儲(chǔ)塊1-32KB,每頁1KB。系統(tǒng)存儲(chǔ)器2KB。
中容量產(chǎn)品主存儲(chǔ)塊64-128KB,每頁1KB。系統(tǒng)存儲(chǔ)器2KB。
大容量產(chǎn)品主存儲(chǔ)塊256KB以上,每頁2KB。系統(tǒng)存儲(chǔ)器2KB。
互聯(lián)型產(chǎn)品主存儲(chǔ)塊256KB以上,每頁2KB。系統(tǒng)存儲(chǔ)器18KB。
評(píng)論
查看更多