STM32微控制器是如何啟動的?

2022-07-12 13:45:25 字數 2686 閱讀 9756

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 實現了高度的功能整合,提供多種儲存容量和封裝的選擇,為成本...