STM32F103啟動檔案

2021-10-19 11:37:42 字數 2973 閱讀 8085

目錄

一、概述

二、彙編指令

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...