新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > STM32啟動模式及API

        STM32啟動模式及API

        作者: 時間:2016-11-09 來源:網(wǎng)絡 收藏
        我們玩ARM9,一般都是在內(nèi)存里調(diào)試程序,速度飛快。STM32下也可以這樣,雖說現(xiàn)在的flash壽命已經(jīng)很長了,但flash中調(diào)試燒錄程序還是一個很慢的過程,有時候程序上一個小小的改動要花上幾倍的時間下載代碼,這確實是不能忍受的。

          我們也可以在開發(fā)STM32時,在內(nèi)存中調(diào)試程序。
          {
        STM32這顆Cortex-M3控制器,與其他許多ARM一樣,提供了BOOT0和BOOT1兩個管腳用于啟動選擇。
        BOOT1=x BOOT0=0 從用戶閃存啟動,這是正常的工作模式。
        BOOT1=0 BOOT0=1 從系統(tǒng)存儲器啟動,這種模式啟動的程序功能由廠家設置。(用于串口ISP)
        BOOT1=1 BOOT0=1 從內(nèi)置SRAM啟動,這種模式可以用于調(diào)試。
          在芯片上電復位時,BOOT0和BOOT1兩個管腳的狀態(tài)將決定芯片從何處啟動。

        1.當BOOT0和BOOT1均設置為邏輯1時,系統(tǒng)將從內(nèi)置SRAM中啟動,這是代碼內(nèi)存調(diào)試的第一個條件。
        }
        經(jīng)多次確認,BOOT0和BOOT1狀態(tài)與內(nèi)存中調(diào)試無直接聯(lián)系

        2.然后,我們需要在代碼中設置正確的中斷向量表位置。中斷向量表通常被放置在用戶程序的開始,所以flash中運行時,向量表位于0x08000000處,而當代碼被放置在SRAM中運行時,他的位置就成了0x20000000。在初始化NVIC時,我們可以放置如下代碼,定義向量表的位置

        NVIC_SetVectorTable(0x20000000 , 0x0);

        NVIC_SetVectorTable(0x08000000 , 0x0);

        3. 在編譯器中,要進行正確的設置。這里以IAR 5.4為例說明。
        3.1. 工程選項中Linker項,Config選項卡中,指定Linker Configuration File為stm32f10x_ram.icf, 該文件在FWLIB安裝包中可以獲得,IAR4和5分別有不同的配置文件。
        3.2. 同樣是工程選項中Debug項,Download選項卡中,去掉所有鉤子,不下載代碼到flash

          經(jīng)過以上步驟,代碼就可以在內(nèi)存中調(diào)試,下載速度飛快,調(diào)試速度也比flash中快了不少!

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

        IAP在線升級

        1.boot程序

        (1)IROM1 起始地址:0x8000000

        (2)關鍵代碼

        #define ApplicationAddress0x8003000

        if (((*(__IO uint32_t*)ApplicationAddress) & 0x2FFE0000 ) == 0x20000000)
        {
        /* Jump to user application */
        JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);
        Jump_To_Application = (pFunction) JumpAddress;
        /* Initialize user applications Stack Pointer */
        __set_MSP(*(__IO uint32_t*) ApplicationAddress);
        Jump_To_Application();
        }


        1,JumpAddress=*(vu32*)(ApplicationAddress+4);是把用戶代碼的復位地址賦值給JumpAddress。

        2,__MSR_MSP(*(vu32*)ApplicationAddress);是把用戶代碼的堆棧地址寫入堆棧指針

        3,Jump_To_Application()是把用戶代碼的復位地址付給PC指針

        if(((*(vu32*)ApplicationAddress)&0x2FFE0000)==0x20000000)
        這句話的意思是把用戶代碼的首地址里面的數(shù)據(jù)拿出來,看看是不是以0x20000000開頭。

        (X & 0x2FFE0000 ) == 0x20000000 意思是說X是不是在0x20000000與0x2001FFFF之間,即棧頂是不是在以0x20000000開始的128K
        前面說了用戶代碼的首地址放的是堆棧指針,而堆棧應該指向RAM,而RAM的首地址是0x20000000,所以這句話用來判斷是不是已經(jīng)有一個正確的堆棧指針地址寫在了用戶代碼的首地址,進一步可以推測是不是有一個正確的用戶代碼寫在了用戶代碼區(qū),如果已經(jīng)寫入了,就可以跳過去運行,如果沒有寫入,就不跳過去。這是DEMO程序的判斷邏輯,可以這樣用,也可以不這樣用。

        2.APP程序

        (1)IROM1 起始地址:0x8003000

        (2)關鍵代碼

        #define VECT_TAB_OFFSET 0x3000 (修改地方) //NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x3000); //中斷向量表映射



        關鍵詞: STM32啟動模式AP

        評論


        技術專區(qū)

        關閉
        主站蜘蛛池模板: 桃园县| 湖北省| 淳安县| 墨脱县| 眉山市| 海宁市| 共和县| 广饶县| 从江县| 阜新市| 涟水县| 南汇区| 安远县| 青州市| 沅江市| 于都县| 光泽县| 呼和浩特市| 乐东| 和田市| 岳池县| 临沂市| 铁岭县| 延川县| 八宿县| 苏州市| 大理市| 兰溪市| 玛曲县| 龙川县| 伊金霍洛旗| 额敏县| 永泰县| 仁布县| 肥乡县| 铁岭县| 永定县| 玉环县| 宁乡县| 永靖县| 丽江市|