資源描述:
《STM32啟動(dòng)代碼分析、簡化、實(shí)戰(zhàn)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、本文通過對(duì)STM32的官方固件庫STM32F10x_StdPeriph_Lib_V3.5.0里的MDK啟動(dòng)文件分析,簡化部分不需要的代碼,并從繁雜的固件庫里,精煉出一個(gè)類似于“helloworld”的入門實(shí)戰(zhàn)小程序——點(diǎn)亮一個(gè)LED。該工程僅僅包含一個(gè)啟動(dòng)文件和一個(gè)有main函數(shù)的C文件。本文初衷:不用固件庫建立自己的工程!實(shí)驗(yàn)軟件:KeiluVision4實(shí)驗(yàn)硬件:神舟IV號(hào)開發(fā)板芯片型號(hào):STM32F107VCSTM32啟動(dòng)代碼分析、簡化、實(shí)戰(zhàn)匯編基礎(chǔ):1.偽指令:EQU語法格式:名稱EQU表達(dá)式{,類型}EQU偽指令用于為程序中的常量、標(biāo)號(hào)等定
2、義一個(gè)等效的字符名稱,類似于C語言的#define。其中EQU可以用“*”代替。名稱為EQU偽指令定義的字符名稱,當(dāng)表達(dá)式為32位的常量時(shí),可以指定表達(dá)式的數(shù)據(jù)類型,可以有一下三種類型:CODE16、CODE32和DATA2.偽指令:AREA語法格式:AREA段名{,屬性1}{,屬性2}……AREA命令指示匯編程序匯編一個(gè)新的代碼段或數(shù)據(jù)段。段是獨(dú)立的、指定的、不可見的代碼或數(shù)據(jù)塊,它們由鏈接程序處理。段名:可以為段選擇任何段名。但是,以一個(gè)數(shù)字開始的名稱必須包含在豎杠號(hào)內(nèi),否則會(huì)產(chǎn)生一個(gè)缺失段名錯(cuò)誤。例如,
3、1_DataArea
4、。有些名稱是習(xí)慣性
5、的名稱。例如:
6、.text
7、用于表示由C編譯程序產(chǎn)生的代碼段,或用于以某種方式與C庫關(guān)聯(lián)的代碼段。屬性字段表示該代碼段(或數(shù)據(jù)段)的相關(guān)屬性,多個(gè)屬性用逗號(hào)分隔。常用的屬性如下:——CODE屬性:用于定義代碼段,默認(rèn)為READONLY?!狣ATA屬性:用于定義數(shù)據(jù)段,默認(rèn)為READWRITE?!猂EADONLY屬性:指定本段為只讀,代碼段默認(rèn)為READONLY。——READWRITE屬性:指定本段為可讀可寫,數(shù)據(jù)段的默認(rèn)屬性為READWRITE?!狝LIGN屬性:使用方式為ALIGN表達(dá)式。在默認(rèn)時(shí),ELF(可執(zhí)行連接文件)的代碼段和數(shù)據(jù)段是按
8、字對(duì)齊的,表達(dá)式的取值范圍為0~31,相應(yīng)的對(duì)齊方式為2表達(dá)式次方?!狽OINIT屬性:表示數(shù)據(jù)段是未初始化的或初始化為零。其只包含零初始化的空間保留命令SPACE或DCB、DCD、DCDU、DCQ、DCQU、DCW或DCWU??梢詻Q定在鏈接時(shí)AREA是未初始化的還是零初始化的。一個(gè)匯編語言程序至少要包含一個(gè)段,當(dāng)程序太長時(shí),也可以將程序分為多個(gè)代碼段和數(shù)據(jù)段。3.偽指令:SPACE用于分配一片連續(xù)的存儲(chǔ)單元啟動(dòng)代碼分析:定義棧段,不初始化棧名:STACK大?。篠tack_Size只分配空間不做初始化或者初始化為0:NOINIT可讀可寫:READW
9、RITE:按8字節(jié)對(duì)齊:ALIGN=3棧頂?shù)刂罚篲_initial_spStack_SizeEQU0x00000400AREASTACK,NOINIT,READWRITE,ALIGN=3Stack_MemSPACEStack_Size__initial_sp定義堆段,不初始化堆名:HEAP大小:Heap_Size只分配空間不做初始化或者初始化為0:NOINIT可讀可寫:READWRITE:按8字節(jié)對(duì)齊:ALIGN=3堆起始地址:__heap_base堆終止地址:__heap_limitHeap_SizeEQU0x00000200AREAHEAP,NO
10、INIT,READWRITE,ALIGN=3__heap_baseHeap_MemSPACEHeap_Size__heap_limit4.偽指令:EXPORT語法格式:EXPORT標(biāo)號(hào){[WEAK]}EXPORT偽指令用于在程序中聲明一個(gè)全局的標(biāo)號(hào),該標(biāo)號(hào)可在其他的文件中引用。EXPORT可用GLOBAL代替。標(biāo)號(hào)在程序中區(qū)分大小寫,[WEAK]選項(xiàng)聲明其他的同名標(biāo)號(hào)優(yōu)先于該標(biāo)號(hào)被引用。5.偽指令:DCD語法格式:DCD(或DCDU)表達(dá)式DCD(或DCDU)偽指令用于分配一片連續(xù)的字存儲(chǔ)單元并用偽指令中指定的表達(dá)式初始化。其中,表達(dá)式可以為程序標(biāo)號(hào)
11、或數(shù)字表達(dá)式。DCD也可用“&”代替。用DCD分配的字存儲(chǔ)單元是字對(duì)齊的,而用DCDU分配的字存儲(chǔ)單元并不嚴(yán)格字對(duì)齊。PRESERVE8;指示編譯器8字節(jié)對(duì)齊(keil編譯器時(shí)需要加上)THUMB;指示編譯器為THUMB指令定義復(fù)位段(中斷向量表),并初始化段名:RESET大?。篲_Vectors_Size數(shù)據(jù)段:DATA只讀:READONLY按字節(jié)對(duì)齊:默認(rèn)ALIGN向量表起始地址:__Vectors向量表終止地址:__Vectors_EndAREARESET,DATA,READONLYEXPORT__VectorsEXPORT__Vectors_
12、EndEXPORT__Vectors_Size__VectorsDCD__initial_sp;TopofS