新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32--簡單的IAP操作

        STM32--簡單的IAP操作

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

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

        本文引用地址:http://www.104case.com/article/201611/315436.htm

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

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

        流程圖如下:

        當然,這只是一種最簡單的方式,它還可以是當APP代碼在執行時,將PC指針跳轉到IAP來更新自已。

        實現的大致原理都是一致的,只是方式不同罷了。

        值得注意的是:

        IAP跳轉的地址必須APP的起始地址一致,相應的中斷向量表也要修改,否則APP將不能正確的運行。

        在附件我整理的代碼中,串口方式的IAP跳轉的地址為0x8002000,因此應用程序的起始地址也應為0x8002000,在KEIL設置下如下圖:

        還有中斷向量表的起始地址也應改為0x8002000:

        /*SettheVectorTablebaseaddressat0x08002000*/

        NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x2000);//NVIC_VectTab_FLASH=0x08000000

        只有以上兩處設置正確才能確保APP能正確的運行。

        USB方式的IAP跳轉的地址為0x8004000,設置方法同上。

        升級文件傳輸方式

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

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

        總的來說,IAP帶給我的體驗還是非常愉快的!

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

        在stm32f10x_conf.h中開放#include"stm32f10x_flash.h"

        #include"STM32Lib\stm32f10x.h"
        #include"hal.h"

        #defineFLASH_ADR0x08008000//要寫入數據的地址
        #defineFLASH_DATA0x8a8a8a8a//要寫入的數據

        intmain(void)
        {
        u32tmp;
        ChipHalInit();//片內硬件初始化
        ChipOutHalInit();//片外硬件初始化
        //判斷此FLASH是否為空白
        tmp=*(vu32*)(FLASH_ADR);

        /*將地址(FLASH_ADR)強制轉化為(vu32*)型指針求內容*然后再將值賦給tmp。還是比較考練C語言的,老師上課可從沒這么講過。*/
        if(tmp==0xffffffff)
        {
        FLASH_Unlock();
        FLASH_ProgramWord(FLASH_ADR,FLASH_DATA);
        FLASH_Lock();
        USART1_Puts("要寫入的地址為空,已經寫入認證數據rn");//在指定地址編寫一個字
        }
        elseif(tmp==FLASH_DATA)
        {
        USART1_Puts("地址數據與認證數據符合rn");
        FLASH_Unlock();
        FLASH_ErasePage(FLASH_ADR);

        /*和眾多FLASH存儲器的特性類似,STM32內的FLASH數據只能由1變成0,如果要由0
        變成1,則需要調用刷除函數,把一個頁都刷除掉.如果不擦也能寫但是只能寫上0*/
        FLASH_ProgramWord(FLASH_ADR,0x11223344);
        FLASH_Lock();
        USART1_Puts("寫入了0x11223344rn");
        }
        else
        {
        USART1_Puts("地址上的數據與認證的數據不符合,有可能是寫入失敗或者是要寫入的地址非空rn");
        FLASH_Unlock();
        FLASH_ErasePage(FLASH_ADR);
        FLASH_Lock();
        USART1_Puts("已經刷除了要寫入的地址rn");
        }
        while(1);
        }

        系統通過串口輸出寫FLASH的狀情況,在第一次運行的時候,一般情況,0x08008000處的
        FLASH為空,于是系統就往空的FLASH上寫入一個數據0x8a8a8a8a.并提示已經寫入.此時用
        戶只要再次復位一下系統,則由于之前已經寫入并為系統所讀取,則這次串口就會輸出已經寫
        入了數據的信息.
        注意寫FLASH之前需要調用解鎖函數,寫入后應調用鎖定函數.

        閃存的指令和數據訪問是通過AHB總線完成的。預取模塊是用于通過ICode總線讀取指令的。仲裁是作用在閃存接口,并且DCode總線上的數據訪問優先。

        讀訪問可以有以下配置選項:

        ●等待時間:可以隨時更改的用于讀取操作的等待狀態的數量。

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

        ●半周期:用于功耗優化。

        注:1.這些選項應與閃存存儲器的訪問時間一起使用。等待周期體現了系統時鐘(SYSCLK)頻率與閃存訪問時間的關系:0等待周期,當0

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

        3.當AHB預分頻系數不為1時,必須置預取緩沖區處于開啟狀態。

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

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

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


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

        移植歷程到自己的開發板上

        主要修改main.c中的串口初始化函數IAP_Init(),根據需要再添加一個開發板端口初始化的函數,修改int main()函數里進入IAP的條件

        應用程序的修改主要是四點

        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,注意地址要正確,主要目的是調用keil自帶的hex轉工具將keil編譯程序后生成的release.axf轉成bin文件

        4、 在程序中重定向向量表NVIC_SetVectorTable(NVIC_VectTab_FLASH+0x2000, 0x2000);

        下載程序方法:

        1、 現在IAP的引導程序,也就是移植官網的那個程序。

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




        關鍵詞: STM32IAP操

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 宜黄县| 竹北市| 海丰县| 沅江市| 镇沅| 德州市| 河北省| 靖宇县| 孝感市| 沙坪坝区| 石景山区| 鸡泽县| 道真| 景谷| 乌苏市| 大理市| 青龙| 尼玛县| 岢岚县| 三江| 遵义县| 新乡市| 元氏县| 长寿区| 南通市| 黄陵县| 明光市| 拜城县| 安义县| 仲巴县| 铁岭县| 冷水江市| 秦皇岛市| 方山县| 确山县| 石渠县| 南木林县| 时尚| 赣榆县| 朝阳县| 寿阳县|