第三章第二節(jié)thumb2指令集及匯編格式ppt課件_第1頁
第三章第二節(jié)thumb2指令集及匯編格式ppt課件_第2頁
第三章第二節(jié)thumb2指令集及匯編格式ppt課件_第3頁
第三章第二節(jié)thumb2指令集及匯編格式ppt課件_第4頁
第三章第二節(jié)thumb2指令集及匯編格式ppt課件_第5頁
已閱讀5頁,還剩51頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第二講第二講thumb-2指令集、指令集、IAR匯編及固匯編及固件庫件庫Thumb-2指令集n同時支持16位和32位指令系統(tǒng)nBit15:11n 0b11101n 0b11110n 0b11111 緊鄰的兩個半字構(gòu)成一條32位指令n其他:皆為16位指令1 前索引2 后索引32位指令解碼n.N 表明此指令為16位指令n.W 表面此指令為32位指令集n如果沒有,則根據(jù)指令的15:11位自動選擇nWFEn等待一個事件發(fā)生nWFIn等待一個中斷發(fā)生匯編語言設(shè)計n匯編語言程序設(shè)計更能充分發(fā)揮處理器的硬件特性n兩個優(yōu)勢n操作系統(tǒng)移植需要編寫幾百行底層硬件的匯編語言程序,這是C語言不可取代的。n優(yōu)化算法的時

2、空效率,C語言的目標(biāo)代碼優(yōu)化是編譯器完成的,而匯編語言的目標(biāo)代碼優(yōu)化是人工完成的。人是算法的創(chuàng)造者,也是編譯器的設(shè)計者,人工優(yōu)化比編譯器質(zhì)量高。n弱點n編程效率低,開發(fā)周期長,經(jīng)濟(jì)代價大。ARM匯編程序編寫規(guī)范n匯編語句格式nARM匯編中,所有標(biāo)號必須在一行的頂格書寫,n而所有指令均不能頂格書寫。nARM匯編器對標(biāo)識符大小寫敏感(即區(qū)分大小寫字母),書寫標(biāo)號及指令時字母大小寫要一致。n在ARM匯編程序中,ARM指令、偽指令、寄存器名可以全部為大寫字母,也可以全部為小寫字母,但不要大小寫混合使用。n源程序中,語句之間可以插入空行,以使得源代碼的可讀性更好。 ARM匯編程序編寫規(guī)范續(xù))q格式如下:

3、q標(biāo)號 ;注釋q源程序中允許有空行。適當(dāng)?shù)夭迦肟招?,可以提高源程序的可讀性。q如果單行代碼太長,可以使用字符“”將其分行。“”后不能有任何字符,包括空格和制表符等。q對于變量的設(shè)置、常量的定義,其標(biāo)識符必須在一行的頂格書寫。匯編指令錯誤的例子 DOB MOV R0,#1 ;標(biāo)號DOB沒有頂格書寫MOV R2,#3 ;命令不允許頂格書寫Loop Mov R2,#3 ;指令中大小寫混合 B loop ;無法跳轉(zhuǎn)到loop標(biāo)號,大小寫;不一致幾個重要偽指令1. DCB:1. DCB: 標(biāo)號標(biāo)號 DCB DCB 表達(dá)式表達(dá)式 闡明:闡明:DCBDCB用于分配一塊字節(jié)單元并用偽指令中指定的表達(dá)用于分配一

4、塊字節(jié)單元并用偽指令中指定的表達(dá)式進(jìn)行初始化。其中,表達(dá)式可以為使用雙引號的字符串或式進(jìn)行初始化。其中,表達(dá)式可以為使用雙引號的字符串或00255255的數(shù)字的數(shù)字,DCB,DCB可用可用“= =”替代。替代。2. DCD/DCDU2. DCD/DCDU: 標(biāo)號標(biāo)號 DCD/DCDU DCD/DCDU 表達(dá)式表達(dá)式 闡明:闡明:DCDDCD偽指令用于分配一塊字存儲單元并用偽指令中偽指令用于分配一塊字存儲單元并用偽指令中指定的表達(dá)式初始化,它定義的存儲空間是字對齊的。指定的表達(dá)式初始化,它定義的存儲空間是字對齊的。DCDDCD也可也可用用“& &”替代。替代。幾個重要指令3. MODULE 3.

5、 MODULE 用于定義一個匯編模塊,可用用于定義一個匯編模塊,可用NAMENAME,或,或PRAGRMAPRAGRMA替代替代一般作為匯編源文件名一般作為匯編源文件名如:如:PROGRAM helloPROGRAM hello幾個重要指令4. _iar_program_start 4. _iar_program_start 在在IARIAR環(huán)境中,定義環(huán)境中,定義IARIAR程序入口處,是默認(rèn)的程序入口處,是默認(rèn)的5. PUBILC5. PUBILC聲明外部函數(shù)或公有函數(shù)變量)聲明外部函數(shù)或公有函數(shù)變量)如如PUBLIC _iar_program_start PUBLIC _iar_prog

6、ram_start 聲明一個外部的變量,將該入口地址告知其他聲明一個外部的變量,將該入口地址告知其他源文件以及編譯器源文件以及編譯器幾個重要指令6. _vector_table6. _vector_table在在IARIAR中,具有特殊意義,定義了中斷向量的入口中,具有特殊意義,定義了中斷向量的入口7.SECTION7.SECTION定義一個程序段,定義一個程序段,如:如:SECTION .intvec:CODE:ROOT(2) SECTION .intvec:CODE:ROOT(2) ;程序段,定義中斷向量;程序段,定義中斷向量 DATADATA_vector_table_vector_ta

7、ble DCD 0 x20000000 DCD 0 x20000000 ;定義中斷向量的入口地址;定義中斷向量的入口地址cm3cm3中的中的主堆主堆 棧地址)棧地址) DCD _iar_program_startDCD _iar_program_start S E C T I O N . t e x t : C O D E : R E O R D E R ( 2 ) S E C T I O N . t e x t : C O D E : R E O R D E R ( 2 );一下可寫具體代碼;一下可寫具體代碼幾個重要指令8. main8. main在在IARIAR中,對于匯編此標(biāo)號也是需要的

8、,不是中,對于匯編此標(biāo)號也是需要的,不是程序入口,而是作為主堆棧的標(biāo)志程序入口,而是作為主堆棧的標(biāo)志可以在設(shè)置中修改,但一般不做修改可以在設(shè)置中修改,但一般不做修改9 .code169 .code16和和code32code32作為作為1616位指令和位指令和3232位指令開始的標(biāo)志位指令開始的標(biāo)志等同于等同于THUMBTHUMB和和ARMARM10 ENDnEND指示符告訴編譯器已經(jīng)到了源程序結(jié)尾。n語法格式:nENDn使用說明:n每一個匯編源程序都包含END指示符,以告訴本源程序的結(jié)束。內(nèi)嵌匯編n內(nèi)嵌匯編inline assembly的語法如下:nasm(“指令” );nasm(“指令”

9、);內(nèi)嵌匯編代碼舉例#includevoid str_cpy(const char *src,char *dst)int ch;asm(mov r0,#1);asm(mov r0, #1);asm(add r0, r1);IAR的固件庫n由ST公司開發(fā),包括驅(qū)動程序和應(yīng)用函數(shù)的函數(shù)庫n版本:3.4n優(yōu)點:n入手快n便于開發(fā),節(jié)約時間n缺陷:n結(jié)構(gòu)復(fù)雜繁瑣n原理不夠清晰PPP:某一外設(shè)名稱闡明n每一個外設(shè)都有一個對應(yīng)的源文件:stm32f10 x_ppp.c和一個對應(yīng)的頭文件:stm32f10 x_ppp.hn文件stm32f10 x_ppp.c包含了使用外設(shè)PPP所需的所有固件函數(shù)n文件stm

10、32f10 x_ppp.h包含了.c文件所需的預(yù)定義,函數(shù)聲明以及變量定義等n同時,外設(shè)需要在時鐘控制下工作,因此會用到時鐘的頭文件闡明nCM3對包括外設(shè)的所有存儲設(shè)備統(tǒng)一編址,因此在頭文件中包含了存儲器的映射關(guān)系stm32f10 x_map.hn該文件也包含了所有寄存器的聲明n用戶文件與庫文件通過stm32f10 x_lib.h建立關(guān)系,該文件中定義了所有外設(shè)頭文件的頭文件,用于聲明頭文件,因此需要include在用戶的文件中n而文件stm32f10 x_conf.h則指定具體的參數(shù),用戶可以對此文件進(jìn)行修改外設(shè)的操作步驟nPPP代表任意外設(shè)n1. 在主應(yīng)用文件中,聲明一個結(jié)構(gòu)PPP_Ini

11、tTypeDef,例如: PPP_InitTypeDef PPP_InitStructure; 這里PPP_InitStructure是一個位于內(nèi)存中的工作變量,用來初始化一個或者多個外設(shè)PPP。外設(shè)的操作步驟n2. 為變量PPP_InitStructure的各個結(jié)構(gòu)成員填入允許的值。按照如下程序設(shè)置整個結(jié)構(gòu)體PPP_InitStructure.member1 = val1; PPP_InitStructure.member2 = val2; PPP_InitStructure.memberN = valN; n3. 調(diào)用函數(shù)PPP_Init(.)來初始化外設(shè)PPP。n4. 在這一步,外設(shè)PP

12、P已被初始化。可以調(diào)用函數(shù)PPP_Cmd(.)來使能之。PPP_Cmd(PPP, ENABLE); 可以通過調(diào)用一系列函數(shù)來使用外設(shè)。每個外設(shè)都擁有各自的功能函數(shù)。外設(shè)的操作步驟n注:n1. 在設(shè)置一個外設(shè)前,必須調(diào)用以下一個函數(shù)來使能它的時鐘: RCC_AHBPeriphClockCmd(RCC_AHBPeriph_PPPx, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_PPPx, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_PPPx, ENABLE); n2. 可以調(diào)用函數(shù)PPP_Deini

13、t(.)來把外設(shè)PPP的所有寄存器復(fù)位為缺省值: PPP_DeInit(PPP) 外設(shè)的操作步驟n注:n3. 在外設(shè)設(shè)置完成以后,繼續(xù)修改它的一些參數(shù),可以參照如下步驟: PPP_InitStucture.memberX = valX; PPP_InitStructure.memberY = valY; n PPP_Init(PPP, &PPP_InitStructure); 僅為arm公司粗略設(shè)計的存儲器映射圖,不同廠家根據(jù)需要,設(shè)計自己的存儲器映射對應(yīng)關(guān)系,以及各存儲器的大小。關(guān)于存儲器映射關(guān)系Bit-Bandn處理器存儲器映射包括兩個bit-banding 區(qū)域。它們分別為SRAM 和外

14、設(shè)存儲區(qū)域中的最低的1MB。n作用:將存儲器別名區(qū)的一個字映射為bit-band 區(qū)的一個位n即:在別名存儲區(qū)寫入一個字具有對位段區(qū)的目標(biāo)位執(zhí)讀-改-寫操作的相同效果。n目的:所有STM32F10 x外設(shè)寄存器都被映射到一個位段(bit-band)區(qū)。在各個函數(shù)中對單個比特進(jìn)行置1/置0操作時被大量使用,用以減小和優(yōu)化代碼尺寸。Bit-BandBit-Bandn如何對應(yīng)?n映射公式:nbit_word_offset = (byte_offset x 32) + (bit_number 4)nbit_word_addr = bit_band_base + bit_word_offset n其中:

15、 nbit_word_offset是目標(biāo)位在存取器位段區(qū)中的位置bit_word_addr 是別名存儲器區(qū)中字的地址,它映射到某個目標(biāo)位。nbit_band_base 是別名區(qū)的起始地址。nbyte_offset 是包含目標(biāo)位的字節(jié)在位段的序號bit_number 是目標(biāo)位所在位置0-31) Bit-Bandexamplen設(shè)置地址0 x2000_0000 中的比特2,那么:bit_word_offset = (byte_offset x 32) + (bit_number 4) =0*32+2*4=8bit_word_addr = bit_band_base + bit_word_offse

16、t =0 x22000000+8=0 x2200008examplen設(shè)置地址0 x2000_0000 中的比特2,那么:寄存器RCC_CR的PLLON24位,映射到別名區(qū): #define PERIPH_BASE (u32)0 x40000000) #define PERIPH_BB_BASE (u32)0 x42000000) #define RCC_OFFSET (RCC_BASE - PERIPH_BASE) #define CR_OFFSET (RCC_OFFSET + 0 x00) #define PLLON_BitNumber 0 x18 #define CR_PLLON_BB

17、(PERIPH_BB_BASE + (CR_OFFSET * 32 (PLLON_BitNumber * 4) n一、什么是GPIO? nGPIO,英文全稱為General-Purpose IO ports,也就是通用IO口。嵌入式系統(tǒng)中常常有數(shù)量眾多,但是結(jié)構(gòu)卻比較簡單的外部設(shè)備/電路,對這些設(shè)備/電路有的需要CPU為之提供控制手段,有的則需要被CPU用作輸入信號。而且,許多這樣的設(shè)備/電路只要求一位,即只要有開/關(guān)兩種狀態(tài)就夠了,比如燈亮與滅。對這些設(shè)備/電路的控制,使用傳統(tǒng)的串行口或并行口都不合適。所以在微控制器芯片上一般都會提供一個“通用可編程IO接口”,即GPIO。Example:G

18、PIO控制n硬件資源分配:硬件資源分配:nPC6-PC9分別連到分別連到4個個LED,定義為,定義為LED14跑馬燈實驗控制過程n點亮LEDn相應(yīng)管腳輸出高電平n即相應(yīng)管腳置1n管腳如何控制?n特殊寄存器端口配置寄存器)Example:GPIO控制nGPIO寄存器結(jié)構(gòu)寄存器結(jié)構(gòu)nGPIO寄存器結(jié)構(gòu),寄存器結(jié)構(gòu),GPIO_TypeDef和和AFIO_TypeDef,在文件在文件“stm32f10 x_map.h中定義如下:中定義如下:n typedef struct n vu32 CRL; nvu32 CRH;n vu32 IDR; nvu32 ODR;n vu32 BSRR;n vu32 BR

19、R; nvu32 LCKR; n GPIO_TypeDef; ntypedef struct nvu32 EVCR; nvu32 MAPR; nvu32 EXTICR4; nAFIO_TypeDef; Example:GPIO控制n五個GPIO外設(shè)聲明于文件“stm32f10 x_map.h”: n#define PERIPH_BASE (u32)0 x40000000) n#define APB1PERIPH_BASE PERIPH_BASEn #define APB2PERIPH_BASE (PERIPH_BASE + 0 x10000)n#define AHBPERIPH_BASE (P

20、ERIPH_BASE + 0 x20000) .n#define AFIO_BASE (APB2PERIPH_BASE + 0 x0000) n#define GPIOA_BASE (APB2PERIPH_BASE + 0 x0800) n#define GPIOB_BASE (APB2PERIPH_BASE + 0 x0C00) n#define GPIOC_BASE (APB2PERIPH_BASE + 0 x1000) n#define GPIOD_BASE (APB2PERIPH_BASE + 0 x1400) n#define GPIOE_BASE (APB2PERIPH_BASE + 0 x1800) Example:GPIO控制n“stm32f10 x_conf.h中定義如下:中定義如下:n #define _GPIOn #defi

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論