在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            STM32--簡(jiǎn)單的IAP操作

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

            在線升級(jí)的原理簡(jiǎn)介如下:

            本文引用地址:http://www.biyoush.com/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電平)來(lái)判斷是否對(duì)APP代碼進(jìn)行更新,如果該事件無(wú)效,則不更新,直接跳轉(zhuǎn)到APP代碼執(zhí)行;如果該事件有效,則更新APP代碼,而更新的文件則從外部磁盤通過串口或USB寫入FALSH應(yīng)用程序空間。

            流程圖如下:

            當(dāng)然,這只是一種最簡(jiǎn)單的方式,它還可以是當(dāng)APP代碼在執(zhí)行時(shí),將PC指針跳轉(zhuǎn)到IAP來(lái)更新自已。

            實(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格式。

            總的來(lái)說,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語(yǔ)言的,老師上課可從沒這么講過。*/
            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è)頁(yè)都刷除掉.如果不擦也能寫但是只能寫上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í)終端配置為無(wú)數(shù)據(jù)流控制,另外波特率、數(shù)據(jù)位等要與例程的串口配置要對(duì)應(yīng),輸入1使開發(fā)板進(jìn)入等待下載的模式,點(diǎn)擊超級(jí)終端的傳送à傳送文件,選擇文件,協(xié)議使用例程的Ymodern,下載完后輸入2即可運(yùn)行應(yīng)用程序




            關(guān)鍵詞: STM32IAP操

            評(píng)論


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

            關(guān)閉