stm32中的記憶體包含兩塊主要區域:flash memory(唯讀)、static ram memory(sram,讀寫)。其中,flash memory 起始於0x08000000,sram起始於0x20000000。flash memory的第一部分存放異常向量表,表中包含了指向各種異常處理程式的指標。比如說,reset handler便位於0x08000004的位置,在處理器上電或重啟時執行。在0x08000000處存放的是內部棧指標。
stm32的儲存器對映如下圖所示:
程式執行時,機器**位於flash區域,變數和執行時棧等易變的內容位於sram中。
下面看一下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
; heap configuration
; heap size (in bytes) <0x0-0xffffffff:8>
; heap_size equ 0x200
area heap, noinit, readwrite, align=3
__heap_base
heap_mem space heap_size
__heap_limit
這段**中主要是定義了兩個段(segment),這兩個段都是可讀寫的,涉及到兩個彙編指令area和space。
緊接著,定義了乙個reset段,該段唯讀的資料段,該段主要包含異常向量表。異常向量表的每乙個元素都是乙個函式位址,cdc表示乙個字長的整形資料。向量的第乙個元素是棧頂位址,第二個元素是reset_handler。
preserve8
thumb
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選項面板中看到讀寫和唯讀存放的位址,如下圖所示。
微控制器學習(一) 微控制器基礎 STM32
io四種輸入工作模式 io四種輸出工作模 stm32有8個16位定時器 stm32具有強大的異常響應系統,它把能夠打斷當前 執行流程的事件分為異常 exception 和中斷 interrupt 並把它們用乙個表管理起來,編號為 3 6的中斷向量定義為系統異常,編號從7到19的為外部中斷。中斷向量控...
微控制器 STM32庫開發
1.stm32庫開發是什麼?st公司推出的基於cortex m3核心的mcu 微控制器,也就是通常所說的微控制器 倡導使用韌體庫開發,僅通過呼叫庫裡面的api 應用程式介面 就可以迅速搭建乙個程式,寫出各種使用者需要的應用。庫開發方式自頂向下,可以避免對底層暫存器的繁瑣操作,能大大降低學習門檻和開發...
stm32mcuid規則 STM32微控制器命名規則
stm32 系列微控制器命名規則 stm32 f 103 c 8 t 6 1 2 3 4 5 6 7 8 產品系列名 固定為 stm32 和 產品系列 f 通用系列 0xx 入門級 mcu0x0 超值系列在傳統 位和位市場極具競爭力 0x1 實現了高度的功能整合,提供多種儲存容量和封裝的選擇,為成本...