標(biāo)題: STM32--簡(jiǎn)單的IAP操作 [打印本頁(yè)]

作者: hongniu    時(shí)間: 2015-6-24 18:41
標(biāo)題: STM32--簡(jiǎn)單的IAP操作
所謂IAP,就是在系統(tǒng)編程,也就是說(shuō),CPU 在運(yùn)行的
過(guò)程中,可以對(duì)FLASH 進(jìn)行刷寫(xiě).基本的應(yīng)用可用于寫(xiě)入加密字或者一些存儲(chǔ)信息等,高級(jí)點(diǎn)
的應(yīng)用則是用于某些使用的設(shè)備上,系統(tǒng)查入SD 卡后自動(dòng)更新程序等.
在stm32f10x_conf.h中開(kāi)放#include "stm32f10x_flash.h"
#include "STM32Lib\\stm32f10x.h"
#include "hal.h"
#define FLASH_ADR 0x08008000  //要寫(xiě)入數(shù)據(jù)的地址
#define FLASH_DATA 0x8a8a8a8a  //要寫(xiě)入的數(shù)據(jù)
int main(void)
{
u32 tmp;
ChipHalInit();   //片內(nèi)硬件初始化
ChipOutHalInit();  //片外硬件初始化

//判斷此FLASH是否為空白
tmp=*(vu32*)(FLASH_ADR);
/* 將地址(FLASH_ADR)強(qiáng)制轉(zhuǎn)化為(vu32*)型指針求內(nèi)容*然后再將值賦給tmp。還是比較考練C語(yǔ)言的,老師上課可從沒(méi)這么講過(guò)。*/
if(tmp==0xffffffff)
{
   FLASH_Unlock();
   FLASH_ProgramWord(FLASH_ADR,FLASH_DATA);
   FLASH_Lock();
   USART1_Puts("要寫(xiě)入的地址為空,已經(jīng)寫(xiě)入認(rèn)證數(shù)據(jù)\r\n"); //在指定地址編寫(xiě)一個(gè)字
}
else if(tmp==FLASH_DATA)
     {
       USART1_Puts("地址數(shù)據(jù)與認(rèn)證數(shù)據(jù)符合\r\n");
       FLASH_Unlock();
       FLASH_ErasePage(FLASH_ADR);
     /* 和眾多 FLASH 存儲(chǔ)器的特性類似,STM32 內(nèi)的FLASH 數(shù)據(jù)只能由1變成0,如果要由0
      變成1,則需要調(diào)用刷除函數(shù),把一個(gè)頁(yè)都刷除掉.如果不擦也能寫(xiě)但是只能寫(xiě)上0*/

       FLASH_ProgramWord(FLASH_ADR,0x11223344);
       FLASH_Lock();
       USART1_Puts("寫(xiě)入了0x11223344\r\n");
}
else
{
   USART1_Puts("地址上的數(shù)據(jù)與認(rèn)證的數(shù)據(jù)不符合,有可能是寫(xiě)入失敗或者是要寫(xiě)入的地址非空\(chéng)r\n");
   FLASH_Unlock();
   FLASH_ErasePage(FLASH_ADR);
   FLASH_Lock();
   USART1_Puts("已經(jīng)刷除了要寫(xiě)入的地址\r\n");
}

while(1);


}
系統(tǒng)通過(guò)串口輸出寫(xiě)FLASH的狀情況,在第一次運(yùn)行的時(shí)候,一般情況, 0x08008000處的
FLASH為空,于是系統(tǒng)就往空的FLASH上寫(xiě)入一個(gè)數(shù)據(jù)0x8a8a8a8a.并提示已經(jīng)寫(xiě)入.此時(shí)用
戶只要再次復(fù)位一下系統(tǒng),則由于之前已經(jīng)寫(xiě)入并為系統(tǒng)所讀取,則這次串口就會(huì)輸出已經(jīng)寫(xiě)
入了數(shù)據(jù)的信息.
注意寫(xiě)FLASH 之前需要調(diào)用解鎖函數(shù),寫(xiě)入后應(yīng)調(diào)用鎖定函數(shù).



閃存的指令和數(shù)據(jù)訪問(wèn)是通過(guò)AHB總線完成的。預(yù)取模塊是用于通過(guò)ICode總線讀取指令的。仲裁是作用在閃存接口,并且DCode總線上的數(shù)據(jù)訪問(wèn)優(yōu)先。
讀訪問(wèn)可以有以下配置選項(xiàng):
● 等待時(shí)間:可以隨時(shí)更改的用于讀取操作的等待狀態(tài)的數(shù)量。
● 預(yù)取緩沖區(qū)(2個(gè)64位):在每一次復(fù)位以后被自動(dòng)打開(kāi),由于每個(gè)緩沖區(qū)的大小(64位)與閃存的帶寬相同,因此只通過(guò)需一次讀閃存的操作即可更新整個(gè)緩沖區(qū)的內(nèi)容。由于預(yù)取緩沖區(qū)的存在,CPU可以工作在更高的主頻。CPU每次取指最多為32位的字,取一條指令時(shí),下一條指令已經(jīng)在緩沖區(qū)中等待。
● 半周期:用于功耗優(yōu)化。
注: 1. 這些選項(xiàng)應(yīng)與閃存存儲(chǔ)器的訪問(wèn)時(shí)間一起使用。等待周期體現(xiàn)了系統(tǒng)時(shí)鐘(SYSCLK)頻率與閃存訪問(wèn)時(shí)間的關(guān)系: 0等待周期,當(dāng) 0 < SYSCLK < 24MHz 1等待周期,當(dāng) 24MHz < SYSCLK ≤ 48MHz 2等待周期,當(dāng) 48MHz < SYSCLK ≤ 72MHz
2 . 半周期配置不能與使用了預(yù)分頻器的AHB一起使用,時(shí)鐘系統(tǒng)應(yīng)該等于HCLK時(shí)鐘。該特性只能用在時(shí)鐘頻率為8MHz或低于8MHz時(shí),可以直接使用的內(nèi)部RC振蕩器(HSI),或者是主振蕩器(HSE),但不能用PLL。
3. 當(dāng)AHB預(yù)分頻系數(shù)不為1時(shí),必須置預(yù)取緩沖區(qū)處于開(kāi)啟狀態(tài)。
4. 只有在系統(tǒng)時(shí)鐘(SYSCLK)小于24MHz并且沒(méi)有打開(kāi)AHB的預(yù)分頻器(即HCLK必須等于SYSHCLK)時(shí),才能執(zhí)行預(yù)取緩沖器的打開(kāi)和關(guān)閉操作。一般而言,在初始化過(guò)程中執(zhí)行預(yù)取緩沖器的打開(kāi)和關(guān)閉操作,這時(shí)微控制器的時(shí)鐘由8MHz的內(nèi)部RC振蕩器(HSI)提供。
5. 使用DMA:DMA在DCode總線上訪問(wèn)閃存存儲(chǔ)器,它的優(yōu)先級(jí)比ICode上的取指高。DMA在每次傳送完成后具有一個(gè)空余的周期。有些指令可以和DMA傳輸一起執(zhí)行。






歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1