STM32单片机是如何启动的?
STM32單片機是如何啟動的?
STM32中的內存
STM32中的內存包含兩塊主要區域:flash memory(只讀)、static ram memory(SRAM,讀寫)。其中,flash memory 起始于0x08000000,SRAM起始于0x20000000。flash memory的第一部分存放異常向量表,表中包含了指向各種異常處理程序的指針。比如說,RESET Handler便位于0x08000004的位置,在處理器上電或重啟時執行。在0x08000000處存放的是內部棧指針。
STM32的存儲器映射如下圖所示:
程序執行時,機器代碼位于flash區域,變量和運行時棧等易變的內容位于SRAM中。
startup.s
下面看一下start.s的代碼,了解下如何定義不同類型的代碼。
Stack_Size EQU 0x400 ;定義一個變量Stack_Size,相當于 Stack_Size = 0x400
AREA STACK, NOINIT, READWRITE, ALIGN=3 ;定義一個segment 命名為 STACK
Stack_Mem SPACE Stack_Size ;連續0x400個字節清零
__initial_sp
; <h> Heap Configuration
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Heap_Size EQU 0x200
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
這段代碼中主要是定義了兩個段(segment),這兩個段都是可讀寫的,涉及到兩個匯編指令AREA和SPACE。
AREA
語法:
AREA sectionname{,attr}{,attr}...
where: sectionname is the name to give to the section. Sections are independent, named, indivisible chunks of code or data that are manipulated by the linker.
當遇到下一個AREA時,表示該段結束。或者是,碰到END也表示該段結束。
AREA屬性:
NOINIT 該數據段無須初始化
READWRITE 可讀寫
DATA 數據而非指令,默認是可讀寫的
ALIGN 對齊
SPACE
語法:
{label} SPACE expr
The SPACE directive reserves a zeroed block of memory.
保留了一段零初始化的內存
緊接著,定義了一個RESET段,該段只讀的數據段,該段主要包含異常向量表。異常向量表的每一個元素都是一個函數地址,CDC表示一個字長的整形數據。向量的第一個元素是棧頂地址,第二個元素是Reset_Handler。
PRESERVE8
THUMB
; Vector Table Mapped to Address 0 at Reset
AREA RESET, DATA, READONLY
EXPORT __Vectors
EXPORT __Vectors_End
EXPORT __Vectors_Size
__Vectors DCD __initial_sp ; Top of Stack
DCD Reset_Handler ; Reset Handler
DCD NMI_Handler ; NMI Handler
/******后面代碼省略********/
定義完向量表之后,又定義了.text段,也就是存放程序代碼段,該段也是只讀的。
該段定義了向量表中的各個處理程序,每個程序以PROC開始,以ENDP結束。第一個是Reset_Handler處理函數,單片機器動時便是從這里開始執行的。我們可以看到,除了ResetHandler其他的函數都只有一個 "B ."這是一個空的跳轉,相當于進了死循環,所以需要在外部定義相應的處理函數。
Reset_Handler函數首先執行函數SystemInit,完成硬件初始化工作,然后執行__main建立C運行環境并從中調到用戶定義的main()函數執行。
AREA |.text|, CODE, READONLY
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT SystemInit
IMPORT __main
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
; Dummy Exception Handlers (infinite loops which can be modified)
NMI_Handler PROC
EXPORT NMI_Handler [WEAK]
B .
ENDP
下載程序到單片機
startup.s匯編程序經過匯編器編譯后,產生目標代碼,然后通過鏈接器將各個子程序鏈接為可執行代碼。在鏈接之前,目標代碼中的地址都是相對地址,只有鏈接之后才能轉變為可執行的目標代碼。在鏈接過程中,會確定每一部分代碼的地址。這個過程都被IDE封裝起來了,所以用戶看不到。
鏈接過程中,不同的段的地址是不一樣的,比如可讀寫的段必須放在SRAM對應的地址中(0x20000000開始),只讀的段放到flash中(0x08000000開始)。我們可以在keil開發環境的Linker選項面板中看到讀寫和只讀存放的地址,如下圖所示。
下載到單片機時,也是分別制定了RAM和flash的地址,下圖所示。
總結
以上是生活随笔為你收集整理的STM32单片机是如何启动的?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 生物技术论文的文献
- 下一篇: [HTML]在页面中输出空格的几种方式