0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

STM32四行【跳轉(zhuǎn)程序】 引申出來的幾條重要知識點

黃工的嵌入式技術(shù)圈 ? 來源:黃工的嵌入式技術(shù)圈 ? 2020-03-08 11:37 ? 次閱讀

本文分享以下幾點(引申出來的)重要知識點:

1.STM32是如何實現(xiàn)程序跳轉(zhuǎn)的?

2.復位向量表

3.理解__set_MSP語句

關(guān)鍵字幫助

堆棧指針SP

控制寄存器CONTROL

1寫在前面

上一篇文章《STM32 IAP應用編程幾個要點》講述的內(nèi)容很多朋友都了解過,也都使用過ST官網(wǎng)提供的代碼。但使用過的人有許多都沒有深入了解,僅僅只是把代碼下載到板卡中跑了一下而已(因為代碼完全可以使用)。所以,很少有人研究其中細節(jié)的問題。

o4YBAF4WkDiAaA_DAAE1AZgFFc4227.png

先看一下上圖中四行跳轉(zhuǎn)代碼,接下來將圍繞這四行代碼拓展相關(guān)的內(nèi)容。

2STM32是如何實現(xiàn)程序跳轉(zhuǎn)的?

上圖四行代碼中有幾個定義沒有貼出來,下面一并貼出來:

#defineApplicationAddress0x8003000typedefvoid(*pFunction)(void);pFunction Jump_To_Application;uint32_t JumpAddress;

ApplicationAddress為0x8003000,代表應用程序起始地址為0x8003000。

1.JumpAddress = *(__IO uint32_t*) (ApplicationAddress + 4);

JumpAddress代表跳轉(zhuǎn)地址,基于應用程序起始地址偏移4(這個偏移4下面章節(jié)講述)。這個地址就是應用程序的復位地址,你可以理解為程序跳轉(zhuǎn)到了應用程序復位的地址。

2.Jump_To_Application = (pFunction) JumpAddress;

將跳轉(zhuǎn)地址JumpAddress強制轉(zhuǎn)換pFunction類型,你可以理解為編譯器將其編譯成一個函數(shù)。

3.__set_MSP(*(__IO uint32_t*) ApplicationAddress);

這里是將把應用程序起始地址設(shè)為棧頂指針(__set_MSP下面章節(jié)講述)。

4.Jump_To_Application();

設(shè)置PC指針為復位地址,你可以理解為跳轉(zhuǎn)到應用程序的函數(shù)。

這里是講述的大概內(nèi)容,細節(jié)內(nèi)容請往下看,看完下面細節(jié)再回來看本節(jié)內(nèi)容。

3復位向量表

上面講述了ApplicationAddress + 4“偏移4”這個問題,其實這個“偏移4”就是向量表的偏移地址:復位向量(PC 初始值)。

拿Cortex-M3(STM32F1)為例(其它M0、M4類似),Cortex-M3權(quán)威手冊(中文)表 7.6 上電后的向量表:

o4YBAF4WkDmACHqZAAE_3S5e0cY723.jpg

是什么意思呢?就是相對應用程序存儲起始地址的一張向量表,而這張向量表就是按照這樣的約定:偏移4的地址為復位向量(PC 初始值),也就是我們應用程序復位的地方。

同樣,可以參看啟動代碼(以STM32F1為例):

pIYBAF4WkDmAHS4pAADfgf_H53c301.jpg

這里代碼和Cortex-M3技術(shù)參考手冊數(shù)據(jù)一一對應的關(guān)系。相信看了這兩個地方的內(nèi)容,大家能明白為什么會是ApplicationAddress + 4了。

4理解__set_MSP語句

1.拓展:MDK-ARM新功能

點看下圖,放大,自己看截圖代碼(標記處):

pIYBAF4WkDqAOtLqAAC8YKTDrs0130.jpg

用MDK-ARM V5.25及以上版本打開工程,可以看到在__set_MSP下面有一行下劃線,什么意思呢?

這是MDK-ARM V5.25的新功能(現(xiàn)在,MDK-ARM V5.26就快要出來了)具有上下文幫助(F1)的關(guān)鍵字將用淺灰色下劃線突出顯示。

詳細可以參看:

http://www2.keil.com/mdk5/525

(提示:公眾號不支持外鏈接,請復制鏈接到瀏覽器下載)

這里推薦閱讀我另外兩篇文章:

1.MDK v5.25比較實用的功能

2.MDK-ARM V5.26預覽版更新的幾條重要內(nèi)容

2.理解__set_MSP語句

上面講述的內(nèi)容是想引申出來:鼠標放在__set_MSP的位置,按F1,就可以直接進入幫助文檔。

下面是詳細內(nèi)容截圖:

o4YBAF4WkDqALzCoAADJRZf3woc012.jpg

大概意思是:調(diào)用MSR指令設(shè)置主狀態(tài)指針(MSP)的值。

物理上存在兩個不同的堆棧指針(SP):

1.主堆棧指針(MSP),復位后的默認堆棧指針。在運行異常處理程序時也使用它。

2.進程堆棧指針(PSP),只能在線程模式下使用。

當引用R13堆棧指針(SP)時,由控制寄存器(CONTROL)的Bit[1]決定:

Bit[1]=0,用MSP;

Bit[1]=1,用PSP;

這里具體內(nèi)容需要參看Cortex-M技術(shù)參考手冊。

我的另外一篇文章《如何判斷CPU是否正在執(zhí)行中斷函數(shù)》講述了關(guān)于控制寄存器(CONTROL)的一種使用方法,可以參看我那一篇文章。

5“雪白”的圖片

還是跟隨熱點,相信大家都聽說了“關(guān)于谷歌回來的消息”,據(jù)知情人透露,谷歌回來幾乎不可能。

當我現(xiàn)在(2018年8月9日)百度圖片輸入“雪白”的時候,已經(jīng)不在是“雪白”的圖片了,已經(jīng)被百度程序猿GG加班加點改掉了。

百度圖片搜索“雪白”如下圖:

谷歌圖片搜索“雪白”如下圖:

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • STM32
    +關(guān)注

    關(guān)注

    2270

    文章

    10901

    瀏覽量

    356223
  • 復位
    +關(guān)注

    關(guān)注

    0

    文章

    172

    瀏覽量

    24221
  • 控制寄存器
    +關(guān)注

    關(guān)注

    0

    文章

    34

    瀏覽量

    11492
收藏 人收藏

    評論

    相關(guān)推薦

    后悔沒有早點看到:天線設(shè)計中的知識點!

    Cat.1 bis R13架構(gòu),天線架構(gòu)精簡為單天線架構(gòu),去掉了分集接收天線,因此只需要一根天線。 ? 知識點: Cat.1 bis相對于Cat.1的區(qū)別是,后者為兩根天線(一根主天線,一根分集天線
    的頭像 發(fā)表于 12-24 17:11 ?300次閱讀
    后悔沒有早點看到:天線設(shè)計中的<b class='flag-5'>知識點</b>!

    單片機中斷相關(guān)知識點

    (EA=1)、申請中斷的中斷源的中斷允許位為1。當滿足響應條件后,CPU會保護斷點,即將程序計數(shù)器(PC)的內(nèi)容壓入堆棧,并將程序計數(shù)器指向中斷向量地址。(3)中斷服務程序執(zhí)行:CPU跳轉(zhuǎn)
    發(fā)表于 11-30 09:49

    接口測試理論、疑問收錄與擴展相關(guān)知識點

    本文章使用王者榮耀游戲接口、企業(yè)微信接口的展示結(jié)合理論知識,講解什么是接口測試、接口測試理論、疑問收錄與擴展相關(guān)知識點知識學院,快來一起看看吧~
    的頭像 發(fā)表于 11-15 09:12 ?323次閱讀
    接口測試理論、疑問收錄與擴展相關(guān)<b class='flag-5'>知識點</b>

    在VSCODE終端make時遇到錯誤要一看然后定位,可以直接跳轉(zhuǎn)點擊或者VSCODE定位錯誤嗎?

    每次在VSCODE終端make時遇到錯誤要一看然后定位,可以直接跳轉(zhuǎn)點擊或者VSCODE直接定位錯誤嗎?能給個指引鏈接嗎?謝謝!
    發(fā)表于 06-25 07:37

    STM32F1 IAP操作讀保護選項字節(jié)設(shè)置,APP使用系統(tǒng)復位跳轉(zhuǎn)后無法運行IAP的原因?

    最近調(diào)試一個程序,是基于STM32F1做的IAP,升級前后需要修改選項字節(jié),F(xiàn)LASH_EraseOptionBytes函數(shù)內(nèi)OB->RDP=RDP_Key語句實現(xiàn)讀保護的解除,如果我
    發(fā)表于 05-13 08:09

    模擬電子技術(shù)知識點問題總結(jié)概覽

    給大家分享模擬電子技術(shù)知識點問題總結(jié)。
    的頭像 發(fā)表于 05-08 15:16 ?1179次閱讀
    模擬電子技術(shù)<b class='flag-5'>知識點</b>問題總結(jié)概覽

    STM32H747用DTCM-ram啟動,跳轉(zhuǎn)之后app程序無法運行的原因?

    目前用的STM32H747,寫B(tài)OOTLOADER程序是運行在M7上,bootloader分兩次分別將APP1和APP2寫到指定的地址, app1 M7的啟動地址為0x08040000 ,app2
    發(fā)表于 04-01 07:19

    一篇搞定DCS系統(tǒng)相關(guān)知識點

    目標。DCS系統(tǒng)廣泛應用于各個行業(yè),如化工、電力、制藥等。在這些行業(yè)中,DCS系統(tǒng)可以實現(xiàn)對生產(chǎn)過程的集中監(jiān)控和分散控制,提高生產(chǎn)效率和產(chǎn)品質(zhì)量,降低能耗和減少環(huán)境污染,從而保證產(chǎn)品質(zhì)量,并確保生產(chǎn)過程的安全可靠。 二.DCS系統(tǒng)知識點
    的頭像 發(fā)表于 03-26 18:40 ?917次閱讀
    一篇搞定DCS系統(tǒng)相關(guān)<b class='flag-5'>知識點</b>

    STM32L431RCT6從用戶代碼區(qū)跳轉(zhuǎn)使用內(nèi)置system memory bootloader無效怎么解決?

    STM32L431RCT6 從用戶代碼區(qū)跳轉(zhuǎn)使用內(nèi)置system memory bootloader 無效。 1. 跳轉(zhuǎn)代碼如下,這個代碼 可以在STM32F407VET6上正常
    發(fā)表于 03-26 07:54

    stm32h750vbt6實現(xiàn)bootloader跳轉(zhuǎn)到外部Qsip flash執(zhí)行代碼,跳轉(zhuǎn)后APP程序不執(zhí)行怎么解決?

    stm32h750vbt6實現(xiàn)bootloader跳轉(zhuǎn)到外部Qsip flash執(zhí)行代碼,跳轉(zhuǎn)后APP程序不執(zhí)行
    發(fā)表于 03-19 07:24

    keil仿真查看反匯編,匯編窗口怎么跳轉(zhuǎn)到指定?

    如圖所示,想在匯編窗口跳轉(zhuǎn)到C:045F,查看匯編原碼;怎么操作?有無直接跳轉(zhuǎn)的辦法 現(xiàn)在只能用鼠標滾輪一直翻,有時候還到不了指定;
    發(fā)表于 03-14 07:28

    【量子計算機重構(gòu)未來 | 閱讀體驗】第二章關(guān)鍵知識點

    本帖最后由 oxlm_1 于 2024-3-6 23:20 編輯 之所以將第二章單獨拿出來,是因為在閱讀過程中,發(fā)現(xiàn)第二章知識點較多,理解起來比較耗時間。 第二章的主要知識點: 量子
    發(fā)表于 03-06 23:17

    Vim跳轉(zhuǎn)技巧

    相對跳轉(zhuǎn)用于在當前行的基礎(chǔ)上向上或向下跳轉(zhuǎn)一定的行數(shù)??梢栽诿钅J较螺斎?num命令,其中num可以是正數(shù)、負數(shù)。例如,要向上跳轉(zhuǎn)5,可以在命令模式下輸入:+5,然后按下回車鍵即可
    的頭像 發(fā)表于 01-18 16:30 ?1386次閱讀

    機器視覺基礎(chǔ)知識點總結(jié)

    照明是影響機器視覺系統(tǒng)輸入的重要因素。光源系統(tǒng)的設(shè)計非常重要,它與輸入數(shù)據(jù)直接相關(guān),即圖像的質(zhì)量和應用效果。
    發(fā)表于 01-16 10:08 ?1151次閱讀

    電路隔離的基礎(chǔ)知識點匯總

    隔離 什么是隔離?為什么需要隔離? 隔離是一種防止電流在兩個通信之間流動的手段。一般在兩種情況下需使用隔離:第一種是可能會出現(xiàn)導致設(shè)備受損或人員傷害的浪涌電流;第二種是互連涉及到不同的地電
    發(fā)表于 01-03 08:19