嵌入式系統(tǒng)導(dǎo)論(第2版) 課件 第3、4章 Thumb指令系統(tǒng)、STM32微控制器_第1頁
嵌入式系統(tǒng)導(dǎo)論(第2版) 課件 第3、4章 Thumb指令系統(tǒng)、STM32微控制器_第2頁
嵌入式系統(tǒng)導(dǎo)論(第2版) 課件 第3、4章 Thumb指令系統(tǒng)、STM32微控制器_第3頁
嵌入式系統(tǒng)導(dǎo)論(第2版) 課件 第3、4章 Thumb指令系統(tǒng)、STM32微控制器_第4頁
嵌入式系統(tǒng)導(dǎo)論(第2版) 課件 第3、4章 Thumb指令系統(tǒng)、STM32微控制器_第5頁
已閱讀5頁,還剩105頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

嵌入式系統(tǒng)導(dǎo)論主講教師:第3章Thumb指令系統(tǒng)本章內(nèi)容提要3.1ARM指令集和Thumb指令集3.2統(tǒng)一匯編語言UAL3.3數(shù)據(jù)尋址3.4常用指令3.5STM32啟動代碼3.6開發(fā)工具MDK3.132位ARM指令和16位Thumb指令傳統(tǒng)的ARM處理器具有兩種指令執(zhí)行狀態(tài)32位ARM狀態(tài):所有32位指令,以獲得高性能16位Thumb狀態(tài):僅16位指令,以提高代碼密度很多應(yīng)用程序混合使用ARM和Thumb代碼ARM和Thumb指令的轉(zhuǎn)換需要進行狀態(tài)切換帶來執(zhí)行時間和代碼數(shù)量的額外開銷增加軟件編譯的復(fù)雜度沒有經(jīng)驗的開發(fā)人員很難進行軟件優(yōu)化32、16位指令是指令字長是32、16位Thumb-2技術(shù)Cortex-M系列處理器的指令系統(tǒng)被稱為Thumb包括16位Thumb指令和新的32位Thumb指令Cortex-M3/M4使用Thumb-2技術(shù)允許混合16和32位Thumb指令,無需狀態(tài)切換簡化軟件開發(fā),提高代碼密度、效率和性能不支持32位ARM指令導(dǎo)致Cortex-M3無法向后兼容傳統(tǒng)的ARM處理器不過Cortex-M3完全支持原來16位Thumb指令大多數(shù)程序使用C語言開發(fā),轉(zhuǎn)換比較簡單Thumb指令系統(tǒng)ARM指令集的發(fā)展動態(tài)編譯器支持VFPv3NEONThumb-2(可選)Thumb-2(標配)TrustZoneSIMDVFPv2Jazelle僅Thumb-2ARMv5ARMv6ARMv7A&RARMv7M3.2統(tǒng)一匯編語言UALUAL(Unifiedassemblylanguage)ARM和Thumb指令的通用匯編語言語法過去的語法被稱為:pre-UAL最新的ARM軟件開發(fā)工具已經(jīng)支持UALPre-UAL目前仍被大多數(shù)開發(fā)工具接受KeilMDK-ARM中,指示符THUMB ;使用UAL語法的Thumb指令CODE16 ;使用pre-UAL語法的Thumb指令A(yù)RM匯編程序的語句格式symbolmnemonicoperand1,operand2,... ;Comments標識符助記符操作數(shù)1,操作數(shù)2,... ;注釋標識符symbol必須起始于第一列(頂格)所有指令不能頂格書寫標號等標識符大小寫敏感指令、寄存器可全大寫、全小寫,不要大小寫混用匯編語言的程序結(jié)構(gòu)代碼區(qū):定義指令代碼序列匯編后被保存在代碼(CODE)存儲器數(shù)據(jù)區(qū):聲明使用的數(shù)據(jù),還可以提供初始值或常量匯編后在數(shù)據(jù)(DATA)存儲器預(yù)留空間(初值)系統(tǒng)堆棧:在存儲器中保留空間、設(shè)置棧指針SP區(qū)域指示符AREA定義存儲區(qū)段(section):代碼區(qū)或數(shù)據(jù)區(qū)區(qū)段名可以使用兩個垂線字符括起類型:code(代碼)、data(數(shù)據(jù))屬性主要是一些選項:readonly:只讀(CODE區(qū)段的默認屬性)readwrite:可讀可寫(DATA區(qū)段的默認屬性)align=n:地址對齊2n分配,n=0~31noinit:說明DATA區(qū)段沒有初始值或初始值為0AREA區(qū)段名{,類型}{,屬性}... ;區(qū)段內(nèi)容,指令或數(shù)據(jù)定義過程指示符PROC/ENDP(FUNCTION/ENDFUNC)定義過程結(jié)構(gòu)(函數(shù)、子程序)可選{reglist1}是過程要保護的寄存器列表過程名 PROC[{reglist1}] ;開始

... ;過程體(指令序列)

ENDP ;結(jié)束AREAmysect,CODE,readonly,align=2MyFunctPROC ... ENDP起始執(zhí)行指示符 ENTRY ... ;第一條執(zhí)行的指令 ... END ;匯編語言程序結(jié)束匯編結(jié)束指示符地址對齊指示符 ALIGN{expr}不帶參數(shù)設(shè)置當前位置是下一個字(4個字節(jié))邊界帶參數(shù)expr對齊expr字節(jié)邊界expr是2冪次方的值,例如2、4、8、……由于ARM處理器大多數(shù)情況下都要求對齊地址邊界操作,所以經(jīng)常需要使用ALIGN指令以保證數(shù)據(jù)和代碼對齊了適合的地址邊界預(yù)留存儲器空間指示符SPACE偽指令預(yù)留內(nèi)容是0的存儲空間SPACE可以使用“%”替代FILL偽指令預(yù)留內(nèi)容是value值的存儲空間label是可選的標號expr是分配存儲器空間的大小(字節(jié)為單位)value在存儲空間預(yù)留的值,無表示是0valuesize是value的字節(jié)數(shù)(1、2或4), 無表示是1{label}SPACEexpr{label}FILLexpr{,value{,valuesize}}數(shù)據(jù)定義指示符DC(DefineConstant),在存儲單元定義固定初值數(shù)據(jù)區(qū)域分配的靜態(tài)數(shù)據(jù),類似共享變量DCB/DCW/DCD/DCQ依次以1/2/4/8字節(jié)分配空間賦初值expr(可以是多個數(shù)值)DCB的初值expr還可以是括起的字符串沒有U選項,則要求相應(yīng)地址對齊U選項不要求地址對齊,但有風(fēng)險、慎用{label}DCBexpr{,expr}{label}DCW{U}expr{,expr}{label}DCD{U}expr{,expr}{label}DCQ{U}expr{,expr}常量表達十六進制數(shù)像C語言一樣使用0x前綴字符用單引號,字符串用雙引號字符和字符串中都可以是C語言標準的轉(zhuǎn)義符布爾常量 邏輯真→{TRUE},邏輯假→{FALSE}符號常量聲明使用等價EQU指示符

STACK_TOPEQU0x00000400指令中,常量要使用“#”作為前導(dǎo)字母

MOVR0,#0x12 ;R0=0x12立即數(shù)尋址

MOVR0,#0x12 ;R0=0x12在16位Thumb指令中,立即數(shù)只能是8位數(shù)據(jù)32位指令MOVW的立即數(shù)超過8位、不超過16位32位指令編碼無法直接表達32位立即數(shù):

MOVR5,#0X1FF400 ;=>AssemblyERRORUAL語法支持MOV32偽指令: MOV32{cond}Rd,expr ;一般格式 MOV32R5,#0X1FF400 ;示例MOV32偽指令實質(zhì)是使用MOV和MOVT指令組合32位數(shù)據(jù)的賦值:使用偽指令LDR

LDRRi,=val ;一般格式

LDRR5,=0X1FF400 ;示例實際上,這里沒有立即數(shù),而是類似:

LDRR5,[PC,#18] ;從[PC+18]獲得數(shù)據(jù)數(shù)據(jù)保存在被匯編程序事先創(chuàng)建的存儲區(qū)域(假設(shè)是當前PC的偏移位置18處)該偽指令也用于獲得指針(變量地址) MOVRi,#val ;實際生成的MOV指令

LDRRi,[PC,#n] ;或者生成的LDR指令3.3數(shù)據(jù)尋址立即數(shù)尋址:從指令的機器代碼中獲得數(shù)據(jù)數(shù)據(jù)本身直接編碼在指令的機器代碼中,指令執(zhí)行時可以立即從機器代碼中獲得立即數(shù)多以常量形式表達,用井號“#”作為前導(dǎo)寄存器尋址:從處理器的寄存器中訪問數(shù)據(jù)存儲器尋址:從主存儲器中訪問數(shù)據(jù)寄存器尋址通用寄存器13個:R0~R12R13(SP)和R14(LR)多數(shù)情況下也可以使用但由于他們的特定含義和作用,要小心使用R15(PC),大多數(shù)指令不能使用它因為它將改變程序流程、非常危險改變流程,應(yīng)該使用跳轉(zhuǎn)指令(B、BL、BX等)寄存器移位尋址ARM和Thumb-2指令的特有尋址方法對第3個寄存器操作數(shù)實現(xiàn)移位操作移位(shift)操作有5種LSL(LogicalShiftLeft),邏輯左移LSR(LogicalShiftRight),邏輯右移ASR(ArithmeticShiftRight),算術(shù)右移ROR(RotateRight),循環(huán)右移RRX(RotateRighteXtended),循環(huán)右移擴展即帶進位標志的右移 ANDR0,R1,R2,LSL#3 ;R0←R1&(R2<<3)寄存器移位尋址的MOV指令只有移位、沒有其他操作的MOV指令寄存器在UAL語法中,直接使用移位關(guān)鍵字為助記符寄存器移位尋址的MOV指令UAL語法MOVRd,Rn,LSLshiftMOVRd,Rn,LSRshiftMOVRd,Rn,ASRshiftMOVRd,Rn,RORshiftMOVRd,Rn,RRXLSLRd,Rn,shiftLSRRd,Rn,shiftASRRd,Rn,shiftRORRd,Rn,shiftRRXRd,Rn訪問(存?。┐鎯ζ鞑僮鲾?shù)RISC處理器采用Load-Store結(jié)構(gòu)存儲器操作指令只有兩種讀取存儲器操作數(shù)LoadtoRegister

LDRRi,{expr}存儲存儲器操作數(shù)StorefromRegister

STRRi,{expr}操作數(shù)expr有多種形式(尋址方式)存儲器操作數(shù)的寄存器間接尋址

LDRRi,[Rj] ;Ri=[Rj]expr是“[Rj]”形式存儲器地址保存在某個通用寄存器中ARM不支持直接尋址Indirectaddressing存儲器操作數(shù)的寄存器偏移尋址LDRRi,[Rj,#offset] ;①Ri=[Rj+offset]LDRRi,[Rj,Rk] ;②Ri=[Rj+Rk]LDRRi,[Rj,Rkshift#n] ;③Ri=[Rj+(Rkshift#n)]存儲器地址由通用寄存器內(nèi)容加上一個位移量(Displacement)、也稱偏移量(Offset)組成位移量可以來自①立即數(shù)(通常在4KB范圍內(nèi))②寄存器③寄存器移位(LSL、LSR、ASR、ROR、RRX)Indirectaddressingwithdisplacement存儲器操作數(shù)的寄存器后偏移尋址

LDRRi,[Rj],#offset ;Ri=[Rj],Rj=Rj+offset

LDRRi,[Rj],Rk ;Ri=[Rj],Rj=Rj+Rk

LDRRi,[Rj],Rkshift#n ;Ri=[Rj],Rj=Rj+(Rkshift#n)這種尋址方式的指令具有兩個功能:先用[Rj]間接尋址訪問存儲器內(nèi)容賦值Ri之后將Rj加上位移量更新Rj的地址Indirectaddressingwithpost-displacement存儲器操作數(shù)的寄存器前偏移尋址

LDRRi,[Rj,#offset]! ;Rj=Rj+offset,Ri=[Rj]

LDRRi,[Rj,Rk]! ;Rj=Rj+Rk,Ri=[Rj]

LDRRi,[Rj,Rkshift#n]! ;Rj=Rj+(Rkshift#n),Ri=[Rj]這種尋址方式的指令具有兩個功能:先將Rj加上位移量更新Rj的地址然后用[Rj]間接尋址訪問存儲器內(nèi)容賦值RiIndirectaddressingwithpre-displacement3.4Cortex-M3的指令系統(tǒng)存儲器訪問指令,批量32位數(shù)據(jù)傳輸指令通用數(shù)據(jù)處理加減運算、邏輯運算以及硬件除法等指令乘法指令飽和運算指令位操作指令跳轉(zhuǎn)、條件分支和功能調(diào)用指令系統(tǒng)控制、操作系統(tǒng)支持等指令A(yù)RM處理器的指令格式花括號“{}”表示可選opcode指令操作碼:使用助記符表示Rd目的寄存器存儲器讀(除批量讀)指令,是讀入數(shù)據(jù)的寄存器存儲器寫(除批量存)指令,該寄存器內(nèi)容寫入存儲器Rn(第1個源操作數(shù))寄存器{,operand2}第2個源操作數(shù)非存儲器訪問指令支持寄存器移位尋址存儲器訪問指令支持間接、偏移和前偏移、后偏移尋址opcode{S}{cond}Rd,Rn{,operand2}S后綴:更新APSR沒有S后綴:不影響APSR中的標志有S后綴:更新APSR內(nèi)容opcode{S}{cond}Rd,Rn{,operand2}313029282726:252415:108:0NZCVQICI/ITTICI/IT異常號APSREPSRIPSRPSR或xPSR應(yīng)用程序狀態(tài)寄存器APSRN(Negative)負數(shù)標志有符號整數(shù)的結(jié)果是負數(shù)設(shè)置N標志為1結(jié)果是正數(shù)或0設(shè)置N標志為0Z(Zero)零標志執(zhí)行結(jié)果是0(兩數(shù)比較相等)設(shè)置為1,否則為0C(Carry)進位標志對無符號相加,無符號溢出(進位)設(shè)置為1對無符號相減,結(jié)果沒有借位設(shè)置為1,借位為0V(Overflow)溢出標志對有符號整數(shù)加減,當有符號溢出時設(shè)置為1ApplicationProgramStatusRegister{cond}后綴:條件執(zhí)行沒有cond后綴:總是執(zhí)行有cond后綴:條件成立,執(zhí)行條件不成立,不執(zhí)行opcode{S}{cond}Rd,Rn{,operand2}這樣,大多數(shù)指令都成了條件執(zhí)行指令條件cond后綴標志含義EQZ=1Equal,相等NEZ=0NotEqual,不相等MIN=1Minus,負數(shù)PLN=0Plus,正數(shù)VSV=1oVerflowSet,溢出VCV=0oVerflowClear,未溢出CSHSC=1CarrySet,進位HigherorSame,高于或等于CCLOC=0ClearCarry,無進位Lower,低于條件cond(續(xù))后綴標志含義HIC=1ANDZ=0unsignedHigher,無符號高于LSC=0ORZ=1unsignedLowerorSame,無符號低于或等于GEN=VsignedGreaterthanorEqual,有符號大于或等于LTN≠VsignedLessThan,有符號小于GTZ=0ANDN=VsignedGreaterThan,有符號大于LEZ=1ORN≠VsignedLessthanorEqual,有符號小于或等于處理器內(nèi)的傳送指令寄存器之間傳送、傳送立即數(shù)到寄存器

MOV{S}{cond}Rd,Operand2 ;寄存器傳送

MOV{cond}Rd,#imm16 ;立即數(shù)傳送

MVN{S}{cond}Rd,Operand2 ;源操作數(shù)取反后傳送給目的寄存器(取反)專用寄存器與通用寄存器之間傳送

MRS{cond}Rd,spec_reg ;專用寄存器讀取

MSR{cond}spec_reg,Rn ;專用寄存器寫入存儲器訪問指令存儲器讀寫

LDR{cond}Rd,Rn,Operand2 ;存儲器讀

STR{cond}Rd,Rn,Operand2 ;存儲器寫存儲器批量讀寫

LDM{cond}Rn{!},reglist ;存儲器批量讀

STM{cond}Rn{!},reglist ;存儲器批量寫堆棧操作指令

PUSH{cond}reglist

POP{cond}reglist生成相對PC的地址

ADR{cond}Rd,label ;Rd=label的地址label是標號匯編程序也支持label加減一個數(shù)字或者[PC,#number]形式加減運算、邏輯運算指令A(yù)DD(加法)、ADC(帶進位加法)SUB(減法)、SBC(帶進位減法)RSB(反轉(zhuǎn)減法,ReverseSubtract)

oprand2–Rn→RdAND(邏輯與)、ORR(邏輯或)、EOR(邏輯異或)BIC(邏輯與非,operand2求反后與Rn相邏輯與)ORN(邏輯或非,operand2求反后與Rn相邏輯或)op{S}{cond}{Rd,}Rn,Operand2

;Rnopoprand2→Rdop{cond}{Rd,}Rn,#imm12;僅ADD和SUB比較測試指令 CMP{cond}Rn,Operand2 ;Rn-oprand2,類似SUBS、但不保存結(jié)果

CMN{cond}Rn,Operand2;Rn+oprand2,類似ADDS、但不保存結(jié)果

TST{cond}Rn,Operand2;Rn與oprand2,類似ANDS、但不保存結(jié)果

TEQ{cond}Rn,Operand2 ;Rn異或oprand2,類似EORS、但不保存結(jié)果移位指令 op{S}{cond}Rd,Rm,Rs op{S}{cond}Rd,Rm,#n RRX{S}{cond}Rd,Rm操作碼op指邏輯左移LSL、邏輯右移LSR算術(shù)右移ASR、循環(huán)右移RORRs指保存移位位數(shù)的寄存器,只用最低字節(jié)n是移位位數(shù)乘除法指令

MUL{S}{cond}{Rd,}Rn,Rm ;乘法:Rd=(Rn×Rm)低32位

MLA{cond}Rd,Rn,Rm,Ra ;乘加:Rd=(Rn×Rm)低32位+Ra

MLS{cond}Rd,Rn,Rm,Ra ;乘減:Rd=Ra–(Rn×Rm)低32位

SDIV{cond}{Rd,}Rn,Rm ;有符號數(shù)除法:Rd=Rn÷Rm

UDIV{cond}{Rd,}Rn,Rm ;無符號數(shù)除法:Rd=Rn÷Rm長乘法指令 UMULL{cond}RdLo,RdHi,Rn,Rm;無符號數(shù)64位長乘法:(RdHi,RdLo)=Rn×Rm

SMULL{cond}RdLo,RdHi,Rn,Rm;有符號數(shù)64位長乘法:(RdHi,RdLo)=Rn×Rm

UMLAL{cond}RdLo,RdHi,Rn,Rm;無符號數(shù)64位長乘加:

(RdHi,RdLo)=(RdHi,RdLo)+Rn×Rm SMLAL{cond}RdLo,RdHi,Rn,Rm;有符號數(shù)64位長乘加:

(RdHi,RdLo)=(RdHi,RdLo)+Rn×Rm跳轉(zhuǎn)調(diào)用指令

B{cond}label ;跳轉(zhuǎn)到label

BL{cond}label ;跳轉(zhuǎn)并連接到label ;調(diào)用label子程序(下條指令地址存入R14)

BX{cond}Rm ;跳轉(zhuǎn)到Rm指定的地址

;子程序返回一般用“BXLR“指令

BLX{cond}Rm ;調(diào)用Rm指定地址的子程序 (下條指令地址存入R14)分支指令

CBZRn,label ;Rn等于0跳轉(zhuǎn)到Label

CBNZRn,label ;Rn不等于0跳轉(zhuǎn)到Label

IT{x{y{z}}}cond ;分支(If-Then)條件指令

;cond說明IT塊中第1條指令執(zhí)行的條件

;x、y和z依次說明IT塊中第2、3和4條指令執(zhí)行的條件開關(guān)T或E:

;如果是T(Then)表示條件成立執(zhí)行

;否則是E(Else)表示條件不成立執(zhí)行。其他指令

NOP{cond} ;空操作指令

BKPT#imm ;斷點(Breakpoint)指令

;引起處理器進入調(diào)試狀態(tài)

SVC{cond}#imm ;引起管理員調(diào)用SVC ;(SupervisorCall)異常

WFI{cond} ;等待中斷WaitForInterrupt ;暫停執(zhí)行直到非屏蔽中斷產(chǎn)生并響應(yīng)、

;被PRIMASK屏蔽的中斷被掛起(pending)、

;或者有調(diào)試(DebugEntry)請求3.5STM32啟動代碼(StartupCode)用來初始化硬件電路為高級語言編寫的應(yīng)用程序做好運行前準備通常采用匯編語言編寫是處理器上電復(fù)位時的程序運行入口點啟動代碼與使用的處理器和硬件設(shè)備有關(guān)過程大致相同,主要是:堆和棧的定義及初始化異常(中斷)向量表的建立提供默認異常(中斷)處理程序調(diào)用函數(shù)配置時鐘系統(tǒng)最終轉(zhuǎn)向main函數(shù)開始執(zhí)行應(yīng)用程序Cortex-M3啟動方式通過boot引腳設(shè)置,有3種啟動方式方式1:SRAM區(qū)中斷向量表定位于SRAM區(qū)起始地址和PC指針是0x20000000方式2:Flash區(qū)中斷向量表定位于Flash區(qū)起始地址和PC指針是0x80000000方式3:Bootloader區(qū)中斷向量表定位于內(nèi)置Bootloader區(qū)起始地址必須存放棧頂指針第2個地址必須存放復(fù)位入口地址STM32啟動代碼文件在STM32庫V3.5.0中,啟動代碼的文件名是startup_stm32f10x_??.s“??”表示不同類型STM32微控制器例如,“xl”,指超高密度容量的微控制器芯片啟動代碼基本一樣,分成4個片段:(1)定義堆和棧的大?。?)定義中斷向量表(3)默認的中斷處理程序(4)用戶初始化堆和棧分析startup_stm32f10x_hd.sSTM32啟動代碼1:定義堆和棧的大小Stack_SizeEQU0x00000400 ;棧大小為0x400

AREASTACK,NOINIT,READWRITE,ALIGN=3 ;定義棧STACK,未初始化、可讀可寫、8字節(jié)對齊Stack_MemSPACEStack_Size ;為棧分配空間__initial_sp ;棧地址標號Heap_SizeEQU0x00000200 ;堆大小為0x200

AREAHEAP,NOINIT,READWRITE,ALIGN=3__heap_base ;堆基地址標號Heap_MemSPACEHeap_Size ;為堆分配空間__heap_limit ;堆容量地址標號

PRESERVE8 ;指定當前堆棧8字節(jié)對齊

THUMB ;使用32位Thumb指令、支持UAL匯編語言STM32啟動代碼2:定義中斷向量表

AREARESET,DATA,READONLY ;定義復(fù)位(RESET)區(qū)、數(shù)據(jù)段,只讀

EXPORT__Vectors

;中斷向量地址(程序地址)

EXPORT__Vectors_End

EXPORT__Vectors_Size

;EXPORT定義全局標號,表示可在其他文件中使用__Vectors DCD__initial_sp ;地址0x00保存堆棧指針

DCDReset_Handler ;地址0x04保存復(fù)位地址

DCDNMI_Handler ;地址0x08保存非屏蔽地址

…… ;略(所有中斷向量地址)STM32啟動代碼3:默認中斷處理程序

AREA|.text|,CODE,READONLY

;代碼段、只讀Reset_HandlerPROC ;復(fù)位處理程序

EXPORTReset_Handler[WEAK] ;[WEAK]選項:若其他文件也定義該標號(函數(shù)) ;連接時使用其他文件的地址;否則以此處地址連接

IMPORT__main IMPORTSystemInit ;IMPORT表示標號在其他文件中定義

STM32啟動代碼3:默認中斷處理程序(續(xù)1) LDRR0,=SystemInit ;把SystemInit的地址給RO

BLXR0 ;調(diào)用SystemInit,初始化STM32的時鐘系統(tǒng)

LDRR0,=__main ;把__main的地址給RO

BXR0 ;跳轉(zhuǎn)到__main標號

ENDP注1:SystemInit定義在system_stm32f10x.c中注2:__main指向C/C++初始化子程序(初始化堆和棧等),最后跳轉(zhuǎn)到C語言程序的main函數(shù)STM32啟動代碼3:默認中斷處理程序(續(xù)2) ;默認異常(中斷)處理程序(無限循環(huán)、可被修改)NMI_HandlerPROC ;NMI處理程序

EXPORTNMI_Handler[WEAK] B. ;“.”代表當前指令地址 ;“B

.”類似C語言的while(1)語句,無限循環(huán)

ENDP …… ;略

ALIGN ;按照要求進行對齊注3:V3.5.0前啟動代碼沒有調(diào)用SystemInit,需要用戶在應(yīng)用程序主函數(shù)main中首先調(diào)用STM32啟動代碼4:用戶初始化堆和棧

IF:DEF:__MICROLIB ;如果定義了__MICROLIB則為真,否則為假

EXPORT__initial_sp ;為真,讓外部文件使用定義的堆和棧地址

EXPORT__heap_base EXPORT__heap_limitMicroLib是為基于ARM嵌入式應(yīng)用編寫的一個高度優(yōu)化的C語言庫,提供了更緊湊的代碼大小、可應(yīng)用于無操作系統(tǒng)支持的情況,不支持文件I/O和寬字符、有些函數(shù)速度略慢MicroLib的選擇(目標選項)STM32啟動代碼4:用戶初始化堆和棧(續(xù))

ELSE

;為假,使用默認的C語言運行庫

IMPORT__use_two_region_memory EXPORT__user_initial_stackheap__user_initial_stackheap LDRR0,=Heap_Mem ;堆起始地址

LDRR1,=(Stack_Mem+Stack_Size) ;棧大小

LDRR2,=(Heap_Mem+Heap_Size) ;堆大小

LDRR3,=Stack_Mem ;棧頂指針

BXLR ALIGN ENDIF END3.6開發(fā)工具MDK-ARM流行的Cortex-M處理器商業(yè)開發(fā)平臺包括各種組件:μVision集成開發(fā)環(huán)境(IDE)ARM編譯工具(C/C++編譯器、匯編器、連接器等)調(diào)試器和模擬器RTX實時操作系統(tǒng)核心超過1000個微控制器的參考啟動代碼Flash編程算法程序示例KeilMicrocontrollerDevelopmentKitforARM基于MDK的一般開發(fā)流程μVision集成界面MDK安裝目錄MDK-ARM5安裝的Keil目錄UV4子目錄(μVision5的文件)ARM子目錄(主要文件)ARMCC\bin是主要的程序文件armcc.exe:C/C++編譯程序armasm.exe:匯編程序armlink.exe:連接程序fromelf.exe:下載生成程序BIN是動態(tài)鏈接庫DLLHlp保存各種幫助文件Pack驅(qū)動程序包(庫)的目錄軟件包程序目錄Pack目錄(驅(qū)動程序文件)ARM是ARM公司的基本驅(qū)動程序Keil保存有ST公司的驅(qū)動程序 含啟動代碼文件、外設(shè)驅(qū)動程序的頭文件和源程序文件等……創(chuàng)建應(yīng)用程序1.新建項目:Project–NewμVisionProject選擇或新建一個目錄,輸入項目文件名選擇目標微控制器(ST公司的STM32F103ZE)根據(jù)項目需求,選擇相應(yīng)的驅(qū)動程序修改目標名、組名,或增加新組創(chuàng)建應(yīng)用程序2.新建源程序文件:File–New編輯源程序代碼、保存文件加入項目(AddExistingFilestoGroup)intmain(){}創(chuàng)建應(yīng)用程序3.構(gòu)建應(yīng)用程序:Project–BuildTarget編譯、匯編和連接4.調(diào)試應(yīng)用程序:

Debug–Start/StopDebugSession目標選項的調(diào)試配置:OptionforTarget使用模擬器UseSimulator啟動時載入應(yīng)用程序

LoadAplicationatStartup運行至主函數(shù)Runtomain()目標選項的調(diào)試配置【例3-1】簡化STM32微控制器啟動代碼-1Stack_Size EQU0x00000400

AREASTACK,NOINIT,READWRITE,ALIGN=3

SPACEStack_Size__initial_sp

THUMB

AREARESET,DATA,READONLY

DCD__initial_sp;設(shè)置棧指針

DCDReset_Handler;設(shè)置復(fù)位程序入口

AREA|.text|,CODE,READONLY【例3-1】簡化STM32微控制器啟動代碼-2Reset_HandlerPROC

movr0,#10

;R0=10

addr1,r0,r0

;R1=R0+R0

addr1,r1,r1,lsl#2 ;R1=R1+R1×4=R0×10=100

mulr2,r0,r0

;R3=R0×R0=100

B.

;無限循環(huán)

ENDP

END不要選擇“運行至主函數(shù)Runtomain()”單步調(diào)試:Step單步通過:StepOver【例3-2】獨立的匯編語言程序-1 THUMB ;使用THUMB指令和UAL語法 AREARESET,DATA,READONLY ;數(shù)據(jù)區(qū)、只讀 DCD0x20000460 ;設(shè)置棧指針 DCDstart ;設(shè)置起始執(zhí)行位置 AREA|.text|,CODE,READONLY ;代碼區(qū)、只讀 ENTRY ;程序開始執(zhí)行點start movr1,#num ;傳送求和個數(shù)給R1 ldrr2,=array ;獲取數(shù)組地址給R2 movr0,#0 ;使用R0進行累加求和,初始為0【例3-2】獨立的匯編語言程序-2again ldrr3,[r2],#4 ;取數(shù)組元素值給R3,然后R2增量4 addr0,r0,r3 ;求和 subsr1,r1,#1 ;個數(shù)減1 bneagain ;個數(shù)大于0,繼續(xù)求和 ldrr4,=sum strr0,[r4] ;保存求和R0到結(jié)果變量sum b. ;無限循環(huán)【例3-2】獨立的匯編語言程序-3 AREA|.rodata|,DATA,READONLY,ALIGN=3 ;數(shù)據(jù)區(qū)、只讀array dcd3,-17,26,-13,101 ;數(shù)組num equ(.-array)/4 ;求得數(shù)組元素個數(shù) AREA|.data|,DATA,READWRITE,ALIGN=3 ;數(shù)據(jù)區(qū)、可讀寫sum dcd0 ;保存求和結(jié)果 END“運行(Run)”命令執(zhí)行“停止(Stop)”命令結(jié)束【例3-2】MDK模擬運行結(jié)果嵌入式系統(tǒng)導(dǎo)論主講教師:第4章STM32微控制器本章內(nèi)容提要4.1STM32微控制器結(jié)構(gòu)4.2STM32微控制器開發(fā)4.3復(fù)位與時鐘控制(RCC)4.1STM32微控制器結(jié)構(gòu)基于Cortex-M3/M4設(shè)計微控制器產(chǎn)品的公司意法半導(dǎo)體(STMicroelectronics)愛特梅爾(Atmel)三星(Samsung)……微控制器包含許多不同的模塊處理器核心存儲器時鐘電路、系統(tǒng)總線外設(shè)(硬件單元):I/O接口、通信接口、定時器、ADC和DAC,……基于Cortex-M3的微控制器STM32微控制器應(yīng)用類別STM32系列產(chǎn)品主要特點(核心,時鐘頻率等)高性能STM32F2系列STM32F4系列STM32F7系列STM32H7系列Cortex-M3、120MHz,基礎(chǔ)產(chǎn)品線Cortex-M4+FPU、180MHz,基礎(chǔ)或先進產(chǎn)品線Cortex-M7+FPU、216MHz,極高性能雙核Cortex-M7+M4FPU、480MHz,極高性能主流STM32F0系列STM32G0系列STM32F1系列STM32F3系列STM32G4系列Cortex-M0、48MHz,入門級,適用于成本敏感的應(yīng)用Cortex-M0+、64MHz,新一代入門級、首個8引腳STM32Cortex-M3、72MHz,基礎(chǔ)產(chǎn)品線Cortex-M4+FPU、72MHz,具有16位ADC等Cortex-M4+FPU、170MHz,具有數(shù)學(xué)加速器等超低功耗STM32L0系列STM32L1系列STM32L4系列STM32L4+系列STM32L5系列STM32U5系列Cortex-M0+、32MHz,低功耗模式+RAM+RTCCortex-M3、32MHz,低功耗模式+RAM+RTCCortex-M4+FPU、80MHz,低功耗模式+RAM+RTCCortex-M4+FPU、80MHz,低功耗模式+RAM+RTCCortex-M33+FPU、110MHz,低功耗模式+RAM+RTCCortex-M33+FPU、160MHz,低功耗模式+RAM+RTCSTM32微控制器STM32F0系列:入門級MCU、基于CM0STM32F1系列:主流MCU、基于CM3STM32F2系列:高性能MCU、基于CM3STM32F3系列:具有DSP和FPU的MCU、基于CM4STM32F4系列:具有DSP和FPU的高性能MCU、基于CM4STM32L0系列:低功耗MCU、基于Cortex-M0+STM32L1系列:低功耗MCU、基于Cortex-M3……CM:Cortex-M,CM3:Cortex-M3,CM4:Cortex-M4STM32F10x系列微控制器STM32F10xSTM32F1系列微控制器STM32F10024MHz,具有馬達控制器和HDMICEC功能STM32F10136MHz,多達1MBFlash存儲器STM32F10248MHz,支持USB接口STM32F10372MHz,多達1MBFlash存儲器支持馬達控制、USB和CAN接口STM32F105/10772MHz,支持以太網(wǎng)、CAN和USB2.0OTG接口STM32F10xSTM32F103系統(tǒng)結(jié)構(gòu)哈佛存儲結(jié)構(gòu)獨立的指令總線(I-bus),連接Flash總線矩陣(BusMatrix)提供多種數(shù)據(jù)通道數(shù)據(jù)總線(D-bus)系統(tǒng)總線(System)DMA和SRAM通過AHB-APB橋連接2個先進外設(shè)總線APBAPB2可全速工作于72MHz,但APB1限制在36MHz外設(shè)連接在APB上STM32F103系統(tǒng)結(jié)構(gòu)STM32F103的主要外設(shè)通過APB連接外設(shè)和I/O接口,共同具有的外設(shè):通用和復(fù)用功能I/O(GPIO和AFIO)通用定時器(TIMx)實時時鐘(RTC)(Cortex處理器自帶系統(tǒng)時間片時鐘SysTick)看門狗(WatchDog)通用同步異步接收發(fā)送器(USART)串行外設(shè)接口(SPI)I2C接口(I2C)模擬數(shù)字轉(zhuǎn)換器ADC(以及溫度傳感器)更高性能的STM32微控制器還支持更多外設(shè)STM32F10x存儲器結(jié)構(gòu)4GB線性地址空間,全部統(tǒng)一編排地址4GB空間分成8個512MB(0.5GB)區(qū)域代碼區(qū)(Code),起始于0x00000000Flash組成,程序代碼起始于0x08000000SRAM區(qū),起始于0x20000000型號不同、容量不同:16KB、48KB、64KB等

外設(shè)區(qū),起始于0x40000000外設(shè)的寄存器訪問地址外部區(qū),起始于0x600000001GB用于外部RAM,1GB用于外設(shè)系統(tǒng)外設(shè)區(qū),起始于0xE0000000STM32地址空間4.2STM32微控制器開發(fā)基于目標機-宿主機的交叉編譯系統(tǒng)在集成開發(fā)環(huán)境(MDK)的支持下進行通常采用高級語言(C/C++語言)編寫Cortex微控制器軟件接口標準CMSIS為基于Cortex-M處理器的系統(tǒng)定義了標準軟件接口是Cortex-M處理器與供應(yīng)商無關(guān)的硬件抽象層可實現(xiàn)與處理器和外設(shè)間的一致且簡單的軟件接口從而簡化軟件的重用,便于初學(xué)者使用、降低成本目前,CMSIS包含以下組件CMSIS-Core:處理器與外圍寄存器間的接口CMSIS-RTOS:實時操作系統(tǒng)的標準化編程接口CMSIS-DSP:60多種DSP函數(shù)庫CMSIS-SVD:系統(tǒng)視圖描述的XML文件CortexMicrocontrollerSoftwareInterfaceStandard基于CMSIS-Core的開發(fā)結(jié)構(gòu)https:///cmsisCMSIS-Core的標準化工作標準化處理器外設(shè)定義標準化訪問處理器特性的訪問函數(shù)(有些文獻稱之為應(yīng)用程序接口API)標準化訪問特殊指令的函數(shù)標準化系統(tǒng)異常處理程序的函數(shù)名標準化系統(tǒng)初始化的函數(shù)(系統(tǒng)初始化使用“SystemInit()”函數(shù))……CortexMicrocontrollerSoftwareInterfaceStandardCMSIS-Core使用很多針對Cortex-M的軟件產(chǎn)品都兼容CMSISCMSIS文件被集成在設(shè)備驅(qū)動程序庫中有些文件是ARM提供、對所有微控制器廠商通用有些文件與廠商設(shè)備相關(guān)的MDKV5開發(fā)平臺,用戶應(yīng)用程序需要:startup_<device>.s(startup_stm32f10x_hd.s) 設(shè)備的啟動代碼,包括復(fù)位處理程序和異常向量system_<device>.c(system_stm32f10x.c)

設(shè)備的基本配置文件,包括時鐘和總線設(shè)置<device>.h(stm32f10x.h) 用戶代碼需要的包含文件,用于訪問設(shè)備嵌入式應(yīng)用程序的開發(fā)方式針對外設(shè)寄存器直接編程需要詳細掌握各個寄存器、費時耗力但能夠深入理解原理,通常代碼簡潔高效適合C51等比較簡單的8位單片機(微控制器)基于廠商提供的驅(qū)動程序庫進行開發(fā)簡單快捷、兼容性好、便于移植,但代碼略多32位STM32微控制器結(jié)構(gòu)比較復(fù)雜直接從寄存器入手會很困難建議初學(xué)者從驅(qū)動程序庫入手逐漸深入到寄存器編程STM32驅(qū)動程序庫(標準外設(shè)固件庫)ST公司為使用STM32提供的函數(shù)接口開發(fā)人員通過調(diào)用庫函數(shù)配置STM32寄存器STM32庫是以函數(shù)源代碼形式提供的函數(shù)接口庫函數(shù)是直接對寄存器編程非常好的實例通過閱讀學(xué)習(xí)這些官方庫函數(shù)不僅能夠深入理解STM32工作原理同時也是進一步熟練掌握C語言的極佳機會直接對寄存器編程,也可利用其頭文件STM32F10xStandardPeripheralsFirmwareLibrarySTM32庫-基本代碼文件stm32f10x.hSTM32寄存器地址、結(jié)構(gòu)體類型定義的底層頭文件使用STM32庫的應(yīng)用程序都要引用(包含)該文件system_stm32f10x.c(system_stm32f10x.h)定義核心時鐘變量、設(shè)置系統(tǒng)時鐘和總線時鐘等的源程序文件startup_stm32f10x_??.s啟動文件,“??”表示不同類型STM32微控制器MDKV5通過“運行環(huán)境管理”添加到項目中STM32-外設(shè)驅(qū)動程序文件StdPeriph_Driver\src子目錄驅(qū)動程序的源文件stm32f10x_ppp.cStdPeriph_Driver\inc子目錄驅(qū)動程序的頭文件stm32f10x_ppp.hMDKV5通過“運行環(huán)境管理”添加到項目中STM32標準外設(shè)名稱-1縮寫ppp

外設(shè)名稱adcbkpcanceccrcdacdbgmcudmaextiflashfsmcA/D轉(zhuǎn)換器備份寄存器CAN控制器局域網(wǎng)消費電子控制CRC計算單元D/A轉(zhuǎn)換器MCU調(diào)試模塊DMA控制器外部中斷/事件控制器閃存靈活的靜態(tài)存儲器控制器STM32標準外設(shè)名稱-2縮寫ppp

外設(shè)名稱gpioi2ciwdgpwrrccrtcsdiospitimusartwwdg通用I/O端口I2C總線接口獨立看門狗電源控制復(fù)位和時鐘控制器實時時鐘SD存儲卡接口SPI串行外設(shè)接口定時器通用同步異步收發(fā)器窗口看門狗C語言的數(shù)據(jù)類型ARM處理器C數(shù)據(jù)類型C99標準位數(shù)Bytecharint8_tuint8_t8Halfwordshortint16_tuint16_t16Wordint,longint32_tuint32_t32Doublewordlonglongint64_tuint64_t64intN_t有符號整數(shù),uintN_t無符號整數(shù)C語言的位操作

a&=~(1<<6);//位與實現(xiàn)復(fù)位

//將整型變量a的D6位清零、其他位不變

a|=(1<<6);//位或?qū)崿F(xiàn)置位

//將整型變量a的D6位置位、其他位不變

a^=(1<<6);//位異或?qū)崿F(xiàn)求反

//將整型變量a的D6位取反、其他位不變運算符含義示例(假設(shè)為char類型)&位與0x69&0x55→0x41|位或0x69|0x55→0x7D~位非~0x69→0x96^位異或0x69^0x55→0x3CI/O接口和外設(shè)的訪問外設(shè)單獨編排地址主存空間I/O空間FFFFF0FFFF主存部分I/O部分存儲器空間00000FFFFF外設(shè)與存儲器統(tǒng)一編址外設(shè)寄存器的訪問I/O接口寄存器通過存儲器地址訪問C語言使用指針訪問這些外設(shè)寄存器“volatile”類型修飾符必不可少volatile說明的變量表示是隨時可能發(fā)生變化的每次操作需要直接訪問地址單元獲取最新的數(shù)據(jù)編譯器不能進行編譯優(yōu)化外設(shè)寄存器的訪問都需要進行如此限定

/*定義*/#defineGPIOA_CRL(*((volatileunsignedlong*)(0x40010800)))

/*使用*/GPIOA_CRL=0;外設(shè)寄存器

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論