<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>
"); //-->

博客專(zhuān)欄

EEPW首頁(yè) > 博客 > 如何智能設置中斷向量表?| 簡(jiǎn)單實(shí)用技能

如何智能設置中斷向量表?| 簡(jiǎn)單實(shí)用技能

發(fā)布人:魚(yú)鷹談單片機 時(shí)間:2021-08-21 來(lái)源:工程師 發(fā)布文章

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

NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x9000);

這條語(yǔ)句本身并沒(méi)有問(wèn)題,問(wèn)題在于它不夠方便,不夠智能!

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

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

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

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

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

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

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

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

MDK 里面內置的特殊變量有很多,以前魚(yú)鷹也介紹過(guò)一些,今天繼續介紹一個(gè)特殊變量:

extern int Image$$ER_IROM1$$Base;

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

1.png

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

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

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

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

2.png

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

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

3.png

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

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

*博客內容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權請聯(lián)系工作人員刪除。



關(guān)鍵詞: 單片機

相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>