日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

STM32单片机是如何启动的?

發布時間:2023/12/31 综合教程 43 生活家
生活随笔 收集整理的這篇文章主要介紹了 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单片机是如何启动的?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。