STM32--簡單的IAP操作
在線升級(jí)的原理簡介如下:
本文引用地址:http://m.butianyuan.cn/article/201611/315436.htm在單片機(jī)的FLASH中有兩段代碼,一段是IAP代碼,另一段就是用戶的應(yīng)用程序即APP代碼,IAP代碼放在單片機(jī)復(fù)位時(shí)的起始地址,而APP代碼則放在IAP后面的地址,上電時(shí)CPU首先執(zhí)行IAP代碼,再通過IAP代碼跳轉(zhuǎn)到APP代碼開始執(zhí)行。
在IAP代碼執(zhí)行期間,通過檢測(cè)某一個(gè)事件(如IO電平)來判斷是否對(duì)APP代碼進(jìn)行更新,如果該事件無效,則不更新,直接跳轉(zhuǎn)到APP代碼執(zhí)行;如果該事件有效,則更新APP代碼,而更新的文件則從外部磁盤通過串口或USB寫入FALSH應(yīng)用程序空間。
流程圖如下:
當(dāng)然,這只是一種最簡單的方式,它還可以是當(dāng)APP代碼在執(zhí)行時(shí),將PC指針跳轉(zhuǎn)到IAP來更新自已。
實(shí)現(xiàn)的大致原理都是一致的,只是方式不同罷了。
值得注意的是:
IAP跳轉(zhuǎn)的地址必須APP的起始地址一致,相應(yīng)的中斷向量表也要修改,否則APP將不能正確的運(yùn)行。
在附件我整理的代碼中,串口方式的IAP跳轉(zhuǎn)的地址為0x8002000,因此應(yīng)用程序的起始地址也應(yīng)為0x8002000,在KEIL設(shè)置下如下圖:
還有中斷向量表的起始地址也應(yīng)改為0x8002000:
/*SettheVectorTablebaseaddressat0x08002000*/
NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x2000);//NVIC_VectTab_FLASH=0x08000000
只有以上兩處設(shè)置正確才能確保APP能正確的運(yùn)行。
USB方式的IAP跳轉(zhuǎn)的地址為0x8004000,設(shè)置方法同上。
升級(jí)文件傳輸方式
串口方式的IAP在超級(jí)終端下用Ymode協(xié)議,波特率115200;文件為.BIN格式。
USB方式的IAP用DfuSeUSBDeviceFirmwareUpgrade軟件傳送,文件為dfu格式。
總的來說,IAP帶給我的體驗(yàn)還是非常愉快的!
所謂IAP,就是在系統(tǒng)編程,也就是說,CPU在運(yùn)行的
過程中,可以對(duì)FLASH進(jìn)行刷寫.基本的應(yīng)用可用于寫入加密字或者一些存儲(chǔ)信息等,高級(jí)點(diǎn)
的應(yīng)用則是用于某些使用的設(shè)備上,系統(tǒng)查入SD卡后自動(dòng)更新程序等.
在stm32f10x_conf.h中開放#include"stm32f10x_flash.h"
#include"STM32Lib\stm32f10x.h"
#include"hal.h"
#defineFLASH_ADR0x08008000//要寫入數(shù)據(jù)的地址
#defineFLASH_DATA0x8a8a8a8a//要寫入的數(shù)據(jù)
intmain(void)
{
u32tmp;
ChipHalInit();//片內(nèi)硬件初始化
ChipOutHalInit();//片外硬件初始化
//判斷此FLASH是否為空白
tmp=*(vu32*)(FLASH_ADR);
/*將地址(FLASH_ADR)強(qiáng)制轉(zhuǎn)化為(vu32*)型指針求內(nèi)容*然后再將值賦給tmp。還是比較考練C語言的,老師上課可從沒這么講過。*/
if(tmp==0xffffffff)
{
FLASH_Unlock();
FLASH_ProgramWord(FLASH_ADR,FLASH_DATA);
FLASH_Lock();
USART1_Puts("要寫入的地址為空,已經(jīng)寫入認(rèn)證數(shù)據(jù)rn");//在指定地址編寫一個(gè)字
}
elseif(tmp==FLASH_DATA)
{
USART1_Puts("地址數(shù)據(jù)與認(rèn)證數(shù)據(jù)符合rn");
FLASH_Unlock();
FLASH_ErasePage(FLASH_ADR);
/*和眾多FLASH存儲(chǔ)器的特性類似,STM32內(nèi)的FLASH數(shù)據(jù)只能由1變成0,如果要由0
變成1,則需要調(diào)用刷除函數(shù),把一個(gè)頁都刷除掉.如果不擦也能寫但是只能寫上0*/
FLASH_ProgramWord(FLASH_ADR,0x11223344);
FLASH_Lock();
USART1_Puts("寫入了0x11223344rn");
}
else
{
USART1_Puts("地址上的數(shù)據(jù)與認(rèn)證的數(shù)據(jù)不符合,有可能是寫入失敗或者是要寫入的地址非空rn");
FLASH_Unlock();
FLASH_ErasePage(FLASH_ADR);
FLASH_Lock();
USART1_Puts("已經(jīng)刷除了要寫入的地址rn");
}
while(1);
}
系統(tǒng)通過串口輸出寫FLASH的狀情況,在第一次運(yùn)行的時(shí)候,一般情況,0x08008000處的
FLASH為空,于是系統(tǒng)就往空的FLASH上寫入一個(gè)數(shù)據(jù)0x8a8a8a8a.并提示已經(jīng)寫入.此時(shí)用
戶只要再次復(fù)位一下系統(tǒng),則由于之前已經(jīng)寫入并為系統(tǒng)所讀取,則這次串口就會(huì)輸出已經(jīng)寫
入了數(shù)據(jù)的信息.
注意寫FLASH之前需要調(diào)用解鎖函數(shù),寫入后應(yīng)調(diào)用鎖定函數(shù).
閃存的指令和數(shù)據(jù)訪問是通過AHB總線完成的。預(yù)取模塊是用于通過ICode總線讀取指令的。仲裁是作用在閃存接口,并且DCode總線上的數(shù)據(jù)訪問優(yōu)先。
讀訪問可以有以下配置選項(xiàng):
●等待時(shí)間:可以隨時(shí)更改的用于讀取操作的等待狀態(tài)的數(shù)量。
●預(yù)取緩沖區(qū)(2個(gè)64位):在每一次復(fù)位以后被自動(dòng)打開,由于每個(gè)緩沖區(qū)的大小(64位)與閃存的帶寬相同,因此只通過需一次讀閃存的操作即可更新整個(gè)緩沖區(qū)的內(nèi)容。由于預(yù)取緩沖區(qū)的存在,CPU可以工作在更高的主頻。CPU每次取指最多為32位的字,取一條指令時(shí),下一條指令已經(jīng)在緩沖區(qū)中等待。
●半周期:用于功耗優(yōu)化。
注:1.這些選項(xiàng)應(yīng)與閃存存儲(chǔ)器的訪問時(shí)間一起使用。等待周期體現(xiàn)了系統(tǒng)時(shí)鐘(SYSCLK)頻率與閃存訪問時(shí)間的關(guān)系:0等待周期,當(dāng)0 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ū)處于開啟狀態(tài)。 4.只有在系統(tǒng)時(shí)鐘(SYSCLK)小于24MHz并且沒有打開AHB的預(yù)分頻器(即HCLK必須等于SYSHCLK)時(shí),才能執(zhí)行預(yù)取緩沖器的打開和關(guān)閉操作。一般而言,在初始化過程中執(zhí)行預(yù)取緩沖器的打開和關(guān)閉操作,這時(shí)微控制器的時(shí)鐘由8MHz的內(nèi)部RC振蕩器(HSI)提供。 5.使用DMA:DMA在DCode總線上訪問閃存存儲(chǔ)器,它的優(yōu)先級(jí)比ICode上的取指高。DMA在每次傳送完成后具有一個(gè)空余的周期。有些指令可以和DMA傳輸一起執(zhí)行。 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 在ST官網(wǎng)下載IAP歷程,鏈接http://www.st.com/stonline/products/support/micro/files/an2557.zip 移植歷程到自己的開發(fā)板上 主要修改main.c中的串口初始化函數(shù)IAP_Init(),根據(jù)需要再添加一個(gè)開發(fā)板端口初始化的函數(shù),修改int main()函數(shù)里進(jìn)入IAP的條件 應(yīng)用程序的修改主要是四點(diǎn) 1、 options for target-->將ROM1修改成0x8002000 2、 option for target-->linker-->勾選use memory layout from target dialog 3、 options for target -->user 在run user programs after build/rebuild下給run#1和run#2打勾,并分別填上I:embeddedKeil MdkARMBIN40fromelf.exe --bin -o my.bin outputrelease.axf和I:embeddedKeil MdkARMBIN40fromelf.exe -z outputrelease.axf,注意地址要正確,主要目的是調(diào)用keil自帶的hex轉(zhuǎn)工具將keil編譯程序后生成的release.axf轉(zhuǎn)成bin文件 4、 在程序中重定向向量表NVIC_SetVectorTable(NVIC_VectTab_FLASH+0x2000, 0x2000); 下載程序方法: 1、 現(xiàn)在IAP的引導(dǎo)程序,也就是移植官網(wǎng)的那個(gè)程序。 2、 使用開始—所有程序--附件—通信—超級(jí)終端進(jìn)行下載,超級(jí)終端配置為無數(shù)據(jù)流控制,另外波特率、數(shù)據(jù)位等要與例程的串口配置要對(duì)應(yīng),輸入1使開發(fā)板進(jìn)入等待下載的模式,點(diǎn)擊超級(jí)終端的傳送à傳送文件,選擇文件,協(xié)議使用例程的Ymodern,下載完后輸入2即可運(yùn)行應(yīng)用程序
評(píng)論