新聞中心

STM32--簡單的IAP操作

作者: 時間:2016-11-17 來源:網(wǎng)絡(luò) 收藏
STM32支持在應(yīng)用中編程,也就是所謂的IAP,這對產(chǎn)品的在線升級帶來了很大方便。

在線升級的原理簡介如下:

本文引用地址:http://m.butianyuan.cn/article/201611/315436.htm

單片機(jī)的FLASH中有兩段代碼,一段是IAP代碼,另一段就是用戶的應(yīng)用程序即APP代碼,IAP代碼放在單片機(jī)復(fù)位時的起始地址,而APP代碼則放在IAP后面的地址,上電時CPU首先執(zhí)行IAP代碼,再通過IAP代碼跳轉(zhuǎn)到APP代碼開始執(zhí)行。

在IAP代碼執(zhí)行期間,通過檢測某一個事件(如IO電平)來判斷是否對APP代碼進(jìn)行更新,如果該事件無效,則不更新,直接跳轉(zhuǎn)到APP代碼執(zhí)行;如果該事件有效,則更新APP代碼,而更新的文件則從外部磁盤通過串口或USB寫入FALSH應(yīng)用程序空間。

流程圖如下:

當(dāng)然,這只是一種最簡單的方式,它還可以是當(dāng)APP代碼在執(zhí)行時,將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è)置方法同上。

升級文件傳輸方式

串口方式的IAP在超級終端下用Ymode協(xié)議,波特率115200;文件為.BIN格式。

USB方式的IAP用DfuSeUSBDeviceFirmwareUpgrade軟件傳送,文件為dfu格式。

總的來說,IAP帶給我的體驗(yàn)還是非常愉快的!

所謂IAP,就是在系統(tǒng)編程,也就是說,CPU在運(yùn)行的
過程中,可以對FLASH進(jìn)行刷寫.基本的應(yīng)用可用于寫入加密字或者一些存儲信息等,高級點(diǎn)
的應(yīng)用則是用于某些使用的設(shè)備上,系統(tǒng)查入SD卡后自動更新程序等.

在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");//在指定地址編寫一個字
}
elseif(tmp==FLASH_DATA)
{
USART1_Puts("地址數(shù)據(jù)與認(rèn)證數(shù)據(jù)符合rn");
FLASH_Unlock();
FLASH_ErasePage(FLASH_ADR);

/*和眾多FLASH存儲器的特性類似,STM32內(nèi)的FLASH數(shù)據(jù)只能由1變成0,如果要由0
變成1,則需要調(diào)用刷除函數(shù),把一個頁都刷除掉.如果不擦也能寫但是只能寫上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)行的時候,一般情況,0x08008000處的
FLASH為空,于是系統(tǒng)就往空的FLASH上寫入一個數(shù)據(jù)0x8a8a8a8a.并提示已經(jīng)寫入.此時用
戶只要再次復(fù)位一下系統(tǒng),則由于之前已經(jīng)寫入并為系統(tǒng)所讀取,則這次串口就會輸出已經(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):

●等待時間:可以隨時更改的用于讀取操作的等待狀態(tài)的數(shù)量。

●預(yù)取緩沖區(qū)(2個64位):在每一次復(fù)位以后被自動打開,由于每個緩沖區(qū)的大小(64位)與閃存的帶寬相同,因此只通過需一次讀閃存的操作即可更新整個緩沖區(qū)的內(nèi)容。由于預(yù)取緩沖區(qū)的存在,CPU可以工作在更高的主頻。CPU每次取指最多為32位的字,取一條指令時,下一條指令已經(jīng)在緩沖區(qū)中等待。

●半周期:用于功耗優(yōu)化。

注:1.這些選項(xiàng)應(yīng)與閃存存儲器的訪問時間一起使用。等待周期體現(xiàn)了系統(tǒng)時鐘(SYSCLK)頻率與閃存訪問時間的關(guān)系:0等待周期,當(dāng)0

2.半周期配置不能與使用了預(yù)分頻器的AHB一起使用,時鐘系統(tǒng)應(yīng)該等于HCLK時鐘。該特性只能用在時鐘頻率為8MHz或低于8MHz時,可以直接使用的內(nèi)部RC振蕩器(HSI),或者是主振蕩器(HSE),但不能用PLL。

3.當(dāng)AHB預(yù)分頻系數(shù)不為1時,必須置預(yù)取緩沖區(qū)處于開啟狀態(tài)。

4.只有在系統(tǒng)時鐘(SYSCLK)小于24MHz并且沒有打開AHB的預(yù)分頻器(即HCLK必須等于SYSHCLK)時,才能執(zhí)行預(yù)取緩沖器的打開和關(guān)閉操作。一般而言,在初始化過程中執(zhí)行預(yù)取緩沖器的打開和關(guān)閉操作,這時微控制器的時鐘由8MHz的內(nèi)部RC振蕩器(HSI)提供。

5.使用DMA:DMA在DCode總線上訪問閃存存儲器,它的優(yōu)先級比ICode上的取指高。DMA在每次傳送完成后具有一個空余的周期。有些指令可以和DMA傳輸一起執(zhí)行。

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


在ST官網(wǎng)下載IAP歷程,鏈接http://www.st.com/stonline/products/support/micro/files/an2557.zip

移植歷程到自己的開發(fā)板上

主要修改main.c中的串口初始化函數(shù)IAP_Init(),根據(jù)需要再添加一個開發(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)的那個程序。

2、 使用開始—所有程序--附件—通信—超級終端進(jìn)行下載,超級終端配置為無數(shù)據(jù)流控制,另外波特率、數(shù)據(jù)位等要與例程的串口配置要對應(yīng),輸入1使開發(fā)板進(jìn)入等待下載的模式,點(diǎn)擊超級終端的傳送à傳送文件,選擇文件,協(xié)議使用例程的Ymodern,下載完后輸入2即可運(yùn)行應(yīng)用程序




關(guān)鍵詞: STM32IAP操

評論


技術(shù)專區(qū)

關(guān)閉