stm32 中bootloader、startup_stm32f10x_md.s的作用
stm32?中bootloader、startup_stm32f10x_md.s的作用
轉載 2016-09-12 10:47:39一、啟動文件的作用是:
1.??初始化堆棧指針?SP;
2.??初始化程序計數器指針?PC;
3.??設置堆、棧的大小;
4.??設置異常向量表的入口地址;
5.??配置外部?SRAM?作為數據存儲器(這個由用戶配置,一般的開發板可沒
有外部?SRAM);
6.??設置?C?庫的分支入口__main(最終用來調用?main?函數);
7.??在?3.5?版的啟動文件還調用了在?system_stm32f10x.c?文件中的
SystemInit()????函數配置系統時鐘,在舊版本的工程中要用戶進入
main?函數自己調用?SystemInit()??函數。
二、關于啟動文件的介紹,可以參考:
1、?http://www.360doc.com/content/11/0711/21/4083881_132978087.shtml
2、http://www.amobbs.com/forum.php?mod=viewthread&tid=5462931
至此可以總結一下STM32的啟動文件和啟動過程。首先對棧和堆的大小進行定義,并在代碼區的起始處建立中斷向量表,其第一個表項是棧頂地址,第二個表項是復位中斷服務入口地址。然后在復位中斷服務程序中跳轉??C/C++標準實時庫的__main函數,完成用戶堆棧等的初始化后,跳轉.c文件中的main函數開始執行C程序。假設STM32被設置為從內部FLASH啟動(這也是最常見的一種情況),中斷向量表起始地位為0x8000000,則棧頂地址存放于0x8000000處,而復位中斷服務入口地址存放于0x8000004處。當STM32遇到復位信號后,則從0x80000004處取出復位中斷服務入口地址,繼而執行復位中斷服務程序,然后跳轉__main函數,最后進入main函數,來到C的世界。
三、bootloader文件的作用。
1、可以參考《嵌入式系統bootloader技術內幕》?
鏈接:?http://blog.csdn.net/phunxm/article/details/6897541
bootloader 分為boot 和loader,更多的時候是針對于linux系統,windows系統里的bios也是這個功能。就是boot 的功能是初始化堆棧、中斷向量表等參數,loader就是跳轉到main函數里,加載用戶程序。從這個層面來理解的話,其實stm32的啟動文件就相當于是一個bootloader程序。
2、在做stm32在線升級的時候,常常可以聽到要自己寫一個bootloader程序。這個就很容易造成誤解,比如,升級的時候要寫bootloader程序,那不升級的時候,bootloader難道就不需要了嗎?如果需要是在哪一個文件中,完成這個功能的呢?
其實,在IAP的時候,我們寫的只是相當于一個跳轉并下載的功能的程序,這個程序實現的就是IAP的功能,或者說是軟的IAP功能。這個不是bootloader。在iap程序里,我們是用C語言實現的,也只是一個main函數,里面可能會根據需要有定時器、串口、led驅動等功能。但是真正開始執行這個main函數,還是由啟動文件完成,也就是bootloader?完成。
四、51單片機為什么沒聽說bootloader
五、stm32的啟動方式
?STM32的啟動選擇,通過設置BOOT1、BOOT0的引腳的高低電平即可選擇。
其中主閃存啟動是將程序下載到內置的Flash進行啟動(該flash可運行程序),該程序可以掉電保存,下次開機可自動啟動;
系統存儲器啟動是將程序寫入到一快特定的區域,一般由廠家直接寫入,不能被隨意更改或擦除。Boot0設置為1,Boot1設置為0,代碼將從ROM區啟動,這上電啟動都會運行Bootloader,在此過程中可以實現IAP程序更新,這一般是通過USART 進行更新,此時如果USART或者是SPI端口沒有接收到數據信號,那么MCU將會一直程序等待下去,不會自動跳到FLash主代碼區。所以一般這作為個體產品想實現代碼更新的工作。這需要你那邊是否要考慮以后產品升級,如若升級,可以在Boot0引腳接入一個拔碼開關實現對Boot0電平的控制,從而可以實現 IAP更新功能。
內置SRAM啟動,由于SRAM掉電丟失,不能保存程序,一般只用于程序的調試。
六、stm32啟動過程?
STM32的內部閃存(FLASH)地址起始于0x08000000,一般情況下,程序文件就從此地
址開始寫入。此外STM32是基于Cortex-M3內核的微控制器,其內部通過一張“中斷向量表”來響應中斷,程序啟動后,將首先從“中斷向量表”取出復位中斷向量執行復位中斷程序完成啟動,而這張“中斷向量表”的起始地址是0x08000004(0x8003000的程序中,中斷向量表的地址是0x8003000),當中斷來臨,STM32的內部硬件機制亦會自動將PC指針定位到“中斷向量表”處,并根據中斷源取出對應的中斷向量執行中斷服務程序。?
??在圖53.1.1中,STM32在復位后,先從0X08000004地址取出復位中斷向量的地址,并跳轉到復位中斷服務程序,如圖標號①所示;在復位中斷服務程序執行完之后,會跳轉到我們的main函數,如圖標號②所示;而我們的main函數一般都是一個死循環,在main函數執行過程中,如果收到中斷請求(發生重中斷),此時STM32強制將PC指針指回中斷向量表處,如圖標號③所示;然后,根據中斷源進入相應的中斷服務程序,如圖標號④所示;在執行完中斷服務程序以后,程序再次返回main函數執行,如圖標號⑤所示。
總結
以上是生活随笔為你收集整理的stm32 中bootloader、startup_stm32f10x_md.s的作用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 橘子游戏平台_apex英雄_游戏快速下载
- 下一篇: redis获取byte数组_《Redis