STM8單片機啟動流程徹底探究--基于IAR開發環境
初學STM8會發現,STM8官方的固件庫并沒有提供一個.s文件的啟動代碼,那么她是如何啟動然后跳轉到main函數執行的呢
本文引用地址:http://www.j9360.com/article/201701/342940.htm首先,我們根據ARM的只是可以推測,STM8也是通過復位向量來啟動的,假設流程在復位響亮中完成的,應該首先去復位向量表中間去找,看復位向量又要看存儲器映射,一環扣一環
STM8使用的是統一編址技術,以下是存儲器編址圖

我們可以看到,最大取指空間是0XFFFFFF,也就是說,是16M,這是因為PC的特性決定的

在程序內部,它是將16M分為了256個節(sector),每個節的大小為64K,64*256= 16384K=16M,由圖我們可以看到,在SECTOR0區間里面似乎還有些玄妙,之后的就是普通空間了

這就是sector的分區,分區如下
0-17ff 是RAM空間,而且是最大的ram空間,STM8的ram一般都小于6K由此可見,在這個ram空間里面就包含有我們的堆棧區域.但是不一定是6K,(3G尋址的win7也沒見多少人真的裝3G啊,裝2G內存條的多的是)
1800-3fff是保留區域
4000-47ff是最大2K的數據保存區(相當于EEPROM)
4800-487f是選項字節空間,用于設置一些配置信息
4900-4fff是保留空間
5000-57ff IO以及外設的寄存器空間(統一編址技術)
5800-5fff 保留區域
6000-67ff 2K的啟動代碼rom
6800-7eff 保留區間
7f00-7fff 系統寄存器的地址
8000-8080 中斷向量
在往下才是flash空間,也就是說,我們的代碼存放的區域就是在0x8000開始的
在上面那張圖我們可以看見復位向量

那是不是說芯片啟動立馬就到了復位向量0x8000的位置了呢?
其實不然,查看手冊我們發現這一段話

也就是說,系統啟動的時候不在復位向量的地方,那這個6000區域存放的是啥

原來是啟動代碼,還是數據手冊

鑒于此,我們可以很肯定地說,系統啟動的過程是
復位-->跳轉到boot ram--->boot ram進行某種初始化-->處理用戶有可能的程序更新-->跳轉到0x8000-->復位向量執行
既然復位向量在8000,那么代碼中應該有指示

我們在IAR里面看到他對中斷的處理依靠這個宏定義,實際上他就是定義了兩個重要的宏定義
INTERRUPT_HANDLER_TRAP(a)和INTERRUPT_HANDLER(a, b )
我們展開第一個
得到
INTERRUPT_HANDLER_TRAP(a) ==
_Pragma(vector = 1) __interruptvoid (a) (void)
這里面涉及到兩個編譯器關鍵字分別是Pragma和interrupt

Pragma是一個預處理指令,它包含不同的語句的時候有不同的含義,我們現在包含的是vector,那就和vector有關系了

什么意思呢,我們得看具體語法

也就是說,相當于在中斷向量表標號中寫入指定的函數
_Pragma(vector = 1) __interruptvoid (a) (void)
相當于在中斷向量1的位置寫入a這個函數的指針
INTERRUPT_HANDLER( a, b )展開來
_Pragma(vector = b+2) __interruptvoid (a) (void)
就是在中斷向量表B+2的位置寫入a這個函數的指針,(因為0和1被reset和trap占用了)
現在我們來看it.c中的語句就很清楚了

第一個函數是trap指針,我們需要實現TRAP_IRQHandler這個函數就能關聯上對應的中斷向量
第二個函數同樣我們只要實現TLI_IRQHandler這個函數就OK了
函數的視線需要遵循
__interrupt void (a) (void)的模式,否則宏定義報錯
可是trap有了,reset去哪了呢?這是IAR的一個手段,他把RESET隱藏了,我們來看這個圖片

相當于,IAR在RESET處默認存放了一個中斷向量指針,指針的指向是__iar_program_start函數,這個函數我們無法找到,屬于iar內置函數,但是我們可以看到,調試就可以了
打開仿真

在reset位置放置了一個0x80c3地址(0x82屬于固定填充,24位地址,32位高八位不用),80c3位置代碼如下

由此可見我們的推論是正確的
先設置堆棧基地址0x17ff然后經歷lowinit和datainit之后跳轉到main函數執行
所以,IAR下編譯STM8啟動的過程總結如下
復位-->跳轉到boot ram--->boot ram進行某種初始化-->處理用戶有可能的程序更新-->跳轉到0x8000-->復位向量執行à跳轉到__iar_program_start-->跳轉到main函數地址
評論