目錄
一、概述
二、彙編指令
2.1、equ
2.2、area
2.3、space
2.4、preserve8
2.5、thumb
2.6、export
2.7、dcd
2.8、proc
2.9、ldr
2.10、blx
2.11、bx
2.12、temport
2.13、b
2.14、if,else,endif
2.15、end
三、keil自帶的組合語言幫組文件
四、堆疊
五、復位程式
啟動檔案的作用是負責執行微控制器從「復位」到」開始執行main函式「,中間這段時間(稱為啟動過程)所必須進行的工作。
啟動檔案完成的工作
初始化堆指標sp=_initial_sp
初始化pc指標=reset_handler
初始化中斷向量表
配置系統時鐘
呼叫 c 庫函式_main 初始化使用者堆疊,從而轉向我們使用者應用程式的 main。
彙編乙個新的**段或者資料段。
area stack,noinit,readwrite,align=3
表示彙編乙個資料段,名字是stack,noinit表示不初始化readwrite表示可讀寫,alig表示位元組對齊,通常後面會賦乙個立即數,比如align=3表示的就是2^3位元組對齊,即8位位元組對齊。
分配一定大小的記憶體空間,單位為位元組。
stack_men space stack_size
表示給stack_men 分配乙個stack_size大小的記憶體空間。通常它後面還會跟隨乙個_initial_sp語句,表示棧的結束位址,即棧頂位址,因為是由高向低生長的。
當前檔案堆疊需要按照8個位元組對齊。格式:直接寫此指令即可。
表示後面指令相容 thumb 指令。在 arm 以前的指令集中有 16 位的 thumbm 指令,現在 cortex-m 系列使用的都是 thumb-2 指令集,thumb-2 是 32 位的,相容 16 位和 32 位的指令,是 thumb 的超級版。格式:直接寫此指令 即可
學習中會接觸很多的中斷函式,這些中斷函式名都 可在 dcd 這部分找到。
定義子程式。
從儲存器中載入字到乙個暫存器中,常用格式:;reset handler
reset_handler proc
export reset_handler
import systeminit
import _main
ldr ro,=systeminit
blx ro
ldr ro,=_main
bx ro
endp
表示定義乙個全域性的子程式reset_handler,需與endp成對使用,表示子程式結束,
在export reset_handler [weak]
後面有乙個weak,這個是弱定義,如果外部檔案宣告了乙個標號,則優先使用外部檔案定義的標號,如果外部檔案沒有定義也不出錯。要主要的是:這個並不是arm的指令,是編譯器的。
ldr ro,=systeminit
跳轉到由暫存器給出的位址,並根據暫存器的 lse 確定處理器 的狀態,還要把跳轉前的下條指令位址儲存到 lr。常用格式:
bx r0
bx r0
宣告標號來自外部檔案,和 c 語言中的 extern 關鍵字類似。
import systeminit
import __main
表示宣告 systeminit 和 main 為外部檔案,在建立暫存器模板的時候寫乙個 systeminit()空函式,就是這個原因,如果沒有定義該函式,編譯將會報錯。如果想修改 main.c 檔案中的 main 函式名,在這個地方就可以改動,然後後 面 ldr r0, =__main 中的 main 也需要改動。建議不要改。
b:
跳轉到乙個標號。常用格式如下
b .
b 後面有乙個「.」,彙編中表示迴圈。這句話的意思就是說跳進了迴圈
彙編條件分支語句,與 c 語言的 if else 類似。常 用格式:
到達檔案的末尾,檔案結束。if :def:__microlib
export __initial_sp
export __heap_base
export __heap_limit
else
import __use_two_region_memory
export __user_initial_stackheap
endif
;棧空間的開闢
stack_size equ 0x00000400
area stack, noinit, readwrite, align=3
stack_mem space stack_size
__initial_sp ;棧的結束位址
;堆空間的開闢 heap_size equ 0x00000200
area heap, noinit, readwrite, align=3
__heap_base
heap_mem space heap_size
__heap_limit ;堆的結束位址
stm32f103外部中斷
void extix init void 外部中斷0服務程式 void exti9 5 irqhandler void 這是簡單的外部中斷的配置,pc7作為中斷輸入 上面補充io口的初始化 gpio initstructure.gpio mode gpio mode ipu pc6配置為快充指示 1...
關於STM32F103精確延時
為了相容freertos,所以將延時函式統一規範,後續使用方便移植。此延時針對無晶振,示例為系統倍頻64mhz,型號 stm32f103c8t6。新建system資料夾,新增兩個檔案,delay.c和delay.h 以下為delay.c內容 其中系統已倍頻為64m include stm32f10x...
FreeRTOS移植到STM32F103步驟
二 mdk下移植freertos 目前官方提供的最新版本是v9.0.0,freertos原始碼在解壓目錄下的路徑為 freertos v9.0.0rc2 freertos source iar資料夾的內容,裡面都是跟微控制器底層相關的,我們以stm32f103為例,保留arm cm3資料夾即可。ar...