日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32 单片机启动流程

發布時間:2025/4/16 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32 单片机启动流程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

STM32 單片機啟動流程

剛接觸ARM的cortex-m系列單片機時,被告知一切都從main() 函數開始,要將程序寫在main()函數中。而仿真時也貌似是從main() 函數開始的,以STM32F103為例。

后來了解到全局變量是在main()函數之前初始化的。MDK默認情況下勾選下面選項,跳過了啟動的匯編部分代碼,直接進入了main() 函數.

實際起始位置

在cortex-m系列中,中斷向量表存放在 Flash 開始部分,Flash中第一個字存放棧頂指針,第二個字存放復位中斷服務函數入口地址,其他中斷服務函數入口地址依次存放在Flash中。

MCU上電后,會將Flash中的第一個字加載到R13 MSP寄存器中,第二個字加載到R15 PC寄存器中。

從上圖可以看出ARM規定了M3,M4內核要從地址0x0000 0000讀取中斷向量表,而STM32設置Flash地址到0x0800 0000怎么辦?

STM32將地址0x0800 0000開始的內容重映射到首地址0x0000 0000中,這樣就解決了從0x0000 0000讀取中斷向量表的問題。
下圖可以看出STM32F105實際讀出的0x0000 0000和0x0800 0000內容一樣

R13:棧頂指針寄存器SP

SP寄存器有兩個,MSP或者PSP,PSP是為了RTOS特意設置的,如果使用RTOS,則在RTOS的任務中就是使用的PSP,在中斷服務函數中則使用MSP。如果不使用RTOS,則默認一直使用MSP。

在MCU中,RAM只是負責暫存數據,真正的運算是在寄存器中完成的,例如要對兩個變量進行加法運算,就需要將兩個變量的值從RAM中取出存入寄存器中,然后操作寄存器進行計算,最后將計算結果存入RAM中。因此常說的在進入子函數或者中斷服務函數時需要保存現場,其實也就是保存寄存器中的值,將寄存器值PUSH在棧中。

SP寄存器指向棧頂地址,因此隨著PUSH和POP,SP寄存器會跟著自動變化。

MSP寄存器存放棧頂指針,棧中存放局部變量、函數參數以及進入子函數、中斷服務函數前寄存器的值,當從子函數或者中斷服務函數中跳出時,會從棧中POP寄存器值,也就是恢復現場,確保程序可以正常執行。平時盡量不讓使用遞歸就是為了防止多次調用自身,多次保存現場導致棧溢出。

入棧和出棧操作由編譯器自動生成代碼,但是入棧時默認只會將R0-R3入棧,如果中斷服務函數過于復雜,則編譯器也會將R4-R11入棧,這也就是為什么中斷服務函數盡量簡短的原因之一。

R15:程序計數寄存器PC

PC寄存器指向當前的程序地址。如果修改它的值,就能改變程序的執行流(很多高級技巧就在這里面)

上電時將中斷向量表中的第二個字加載到PC寄存器中,也就是讓程序跳轉到復位中斷服務函數中。


不過復位中斷服務函數是一個匯編函數。

復位中斷服務函數中調用了SystemInit()函數,該函數主要作用是設置中斷向量表的偏移地址。也就是說中斷向量表位置是可變的,當使用BOOT后,就需要在APP修改該偏移地址。

接著復位中斷服務函數跳轉到__main()函數中,__main()和我們平時說的main()函數是有區別的。


RAM掉電會丟失數據,在上電后,RAM中的數據是不確定的,在運行main()函數之前需要將RAM中的數據初始化,也就是下圖左邊到右邊的過程,將flash中的RW數據加載到RAM中,并將RAM中的ZI段數據進行初始化操作。MDK中__main()函數幫我們自動完成了這個操作,也就是所謂的準備C語言環境,C語言環境準備好之后會跳到 main() 函數。

最后,其實還少說了一個,在上電后會根據boot0,boot1 的狀態確定自舉空間的位置,如果從系統存儲器自舉(系統bootLoad,出廠時,官方固化在單片機中的一段代碼,用戶無法修改的。在STM32中,常用的串口下載,DFU就是系統bootLoad中的功能),系統bootLoad執行完畢后才是我們上面說的哪些,文章中的圖大部分來自《Cortex-M3 權威指南》

總結

以上是生活随笔為你收集整理的STM32 单片机启动流程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。