博客專欄

        EEPW首頁 > 博客 > 如何智能設置中斷向量表?| 簡單實用技能

        如何智能設置中斷向量表?| 簡單實用技能

        發布人:魚鷹談單片機 時間:2021-08-21 來源:工程師 發布文章

        在有 boot 的情況下,一般需要重新設置 app 的中斷向量表,使得中斷向量表從 boot 切換到 APP 部分,大部分的工程師會使用類似下面這種方式設置中斷向量表的地址 0x0800 9000。

        NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x9000);

        這條語句本身并沒有問題,問題在于它不夠方便,不夠智能!

        單片機工程師不僅僅要完成基本功能,還要能讓你的代碼更好維護!

        正常設置中斷向量表時,我們需要完成以下兩個步驟:

        1、MDK 中設置 FLASH 起始地址(其實最終修改的 sct 文件內容);

        2、代碼中設置中斷向量表位置(上面類似代碼)。

        第一次設置時,我們很容易就可以設置正確,也不容易遺忘。但是當你有一天,需求改了,不想從 0x9000 地址開始設置,希望從 0x8000 開始,那么你很可能只記得修改第一個,而忘記了第二個修改。

        魚鷹就曾多次忘記,也多次在此處踩坑,浪費了不少時間,所以才想給各位道友分享魚鷹當前的設置方法。

        既然會忘記第二條,那么是否可以將兩個操作整合在一起,讓你的代碼自動根據第一步操作完成中斷向量表的設置呢?

        當然可以,這里我們需要借助 MDK 的特殊變量進行設置。

        MDK 里面內置的特殊變量有很多,以前魚鷹也介紹過一些,今天繼續介紹一個特殊變量:

        extern int Image$$ER_IROM1$$Base;

        這個變量代表了 ER_IROM1 的起始地址,即 MDK 中的起始地址:

        1.png

        而這也是我們第一步要完成的操作。所以我們可以通過這個變量得到設置的 FLASH 起始地址,從而完成中斷向量表的自動化設置:

        extern int Image$$ER_IROM1$$Base; NVIC_SetVectorTable(NVIC_VectTab_FLASH, (uint32_t)&Image$$ER_IROM1$$Base - FLASH_BASE);
        FLASH_BASE 宏一般在芯片頭文件內有,比如 stm32f10x.h。

        而 

         Image$$ER_IROM1$$Base

        是編譯器自動生成的內置變量(變量所在地址就是 FLASH 起始地址,而變量值本身沒有意義),通過強制轉化的方式就可以獲取這個地址。

        這個變量我們可以從 map 文件中可以看到,它本身并不占用內存空間(Size 為 0),只有這個變量的地址才是有用的(這就是上面為啥需要取地址后再強制轉化的原因)。

        2.png

        另外這個特殊變量必須提前聲明,不然不可以使用。

        這樣,通過這條代碼,我們只要設置好 FLASH 的起始地址就可以智能的設置中斷向量表啦。

        3.png

        只要修改這里即可(事實上,最好設置一下 Size 大小,這樣 MDK 能幫助判斷是否 FLASH 不夠用的情況)

        另外,如果中斷向量表設置在 RAM,也可以想辦法設置成這樣智能的哦,這個就由各位道友發揮了。

        *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。



        關鍵詞: 單片機

        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 高台县| 东阿县| 科技| 德昌县| 华阴市| 连江县| 武安市| 芜湖市| 瑞昌市| 广汉市| 华阴市| 白沙| 南陵县| 海盐县| 和林格尔县| 儋州市| 夏邑县| 苍山县| 盐城市| 杨浦区| 玛沁县| 资源县| 五河县| 通渭县| 屯昌县| 商河县| 永济市| 东安县| 长海县| 洛川县| 永修县| 永善县| 固阳县| 西林县| 鹤庆县| 精河县| 繁峙县| 鄂托克旗| 普兰店市| 高青县| 奉贤区|