第三章第二节thumb2指令集及汇编格式ppt课件_第1页
第三章第二节thumb2指令集及汇编格式ppt课件_第2页
第三章第二节thumb2指令集及汇编格式ppt课件_第3页
第三章第二节thumb2指令集及汇编格式ppt课件_第4页
第三章第二节thumb2指令集及汇编格式ppt课件_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第二讲第二讲thumb-2指令集、指令集、IAR汇编及固汇编及固件库件库Thumb-2指令集n同时支持16位和32位指令系统nBit15:11n 0b11101n 0b11110n 0b11111 紧邻的两个半字构成一条32位指令n其他:皆为16位指令1 前索引2 后索引32位指令解码n.N 表明此指令为16位指令n.W 表面此指令为32位指令集n如果没有,则根据指令的15:11位自动选择nWFEn等待一个事件发生nWFIn等待一个中断发生汇编语言设计n汇编语言程序设计更能充分发挥处理器的硬件特性n两个优势n操作系统移植需要编写几百行底层硬件的汇编语言程序,这是C语言不可取代的。n优化算法的时

2、空效率,C语言的目标代码优化是编译器完成的,而汇编语言的目标代码优化是人工完成的。人是算法的创造者,也是编译器的设计者,人工优化比编译器质量高。n弱点n编程效率低,开发周期长,经济代价大。ARM汇编程序编写规范n汇编语句格式nARM汇编中,所有标号必须在一行的顶格书写,n而所有指令均不能顶格书写。nARM汇编器对标识符大小写敏感(即区分大小写字母),书写标号及指令时字母大小写要一致。n在ARM汇编程序中,ARM指令、伪指令、寄存器名可以全部为大写字母,也可以全部为小写字母,但不要大小写混合使用。n源程序中,语句之间可以插入空行,以使得源代码的可读性更好。 ARM汇编程序编写规范续)q格式如下:

3、q标号 ;注释q源程序中允许有空行。适当地插入空行,可以提高源程序的可读性。q如果单行代码太长,可以使用字符“”将其分行。“”后不能有任何字符,包括空格和制表符等。q对于变量的设置、常量的定义,其标识符必须在一行的顶格书写。汇编指令错误的例子 DOB MOV R0,#1 ;标号DOB没有顶格书写MOV R2,#3 ;命令不允许顶格书写Loop Mov R2,#3 ;指令中大小写混合 B loop ;无法跳转到loop标号,大小写;不一致几个重要伪指令1. DCB:1. DCB: 标号标号 DCB DCB 表达式表达式 阐明:阐明:DCBDCB用于分配一块字节单元并用伪指令中指定的表达用于分配一

4、块字节单元并用伪指令中指定的表达式进行初始化。其中,表达式可以为使用双引号的字符串或式进行初始化。其中,表达式可以为使用双引号的字符串或00255255的数字的数字,DCB,DCB可用可用“= =”替代。替代。2. DCD/DCDU2. DCD/DCDU: 标号标号 DCD/DCDU DCD/DCDU 表达式表达式 阐明:阐明:DCDDCD伪指令用于分配一块字存储单元并用伪指令中伪指令用于分配一块字存储单元并用伪指令中指定的表达式初始化,它定义的存储空间是字对齐的。指定的表达式初始化,它定义的存储空间是字对齐的。DCDDCD也可也可用用“& &”替代。替代。几个重要指令3. MODULE 3.

5、 MODULE 用于定义一个汇编模块,可用用于定义一个汇编模块,可用NAMENAME,或,或PRAGRMAPRAGRMA替代替代一般作为汇编源文件名一般作为汇编源文件名如:如:PROGRAM helloPROGRAM hello几个重要指令4. _iar_program_start 4. _iar_program_start 在在IARIAR环境中,定义环境中,定义IARIAR程序入口处,是默认的程序入口处,是默认的5. PUBILC5. PUBILC声明外部函数或公有函数变量)声明外部函数或公有函数变量)如如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中,对于汇编此标号也是需要的

8、,不是中,对于汇编此标号也是需要的,不是程序入口,而是作为主堆栈的标志程序入口,而是作为主堆栈的标志可以在设置中修改,但一般不做修改可以在设置中修改,但一般不做修改9 .code169 .code16和和code32code32作为作为1616位指令和位指令和3232位指令开始的标志位指令开始的标志等同于等同于THUMBTHUMB和和ARMARM10 ENDnEND指示符告诉编译器已经到了源程序结尾。n语法格式:nENDn使用说明:n每一个汇编源程序都包含END指示符,以告诉本源程序的结束。内嵌汇编n内嵌汇编inline assembly的语法如下:nasm(“指令” );nasm(“指令”

9、);内嵌汇编代码举例#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公司开发,包括驱动程序和应用函数的函数库n版本:3.4n优点:n入手快n便于开发,节约时间n缺陷:n结构复杂繁琐n原理不够清晰PPP:某一外设名称阐明n每一个外设都有一个对应的源文件:stm32f10 x_ppp.c和一个对应的头文件:stm32f10 x_ppp.hn文件stm32f10 x_ppp.c包含了使用外设PPP所需的所有固件函数n文件stm

10、32f10 x_ppp.h包含了.c文件所需的预定义,函数声明以及变量定义等n同时,外设需要在时钟控制下工作,因此会用到时钟的头文件阐明nCM3对包括外设的所有存储设备统一编址,因此在头文件中包含了存储器的映射关系stm32f10 x_map.hn该文件也包含了所有寄存器的声明n用户文件与库文件通过stm32f10 x_lib.h建立关系,该文件中定义了所有外设头文件的头文件,用于声明头文件,因此需要include在用户的文件中n而文件stm32f10 x_conf.h则指定具体的参数,用户可以对此文件进行修改外设的操作步骤nPPP代表任意外设n1. 在主应用文件中,声明一个结构PPP_Ini

11、tTypeDef,例如: PPP_InitTypeDef PPP_InitStructure; 这里PPP_InitStructure是一个位于内存中的工作变量,用来初始化一个或者多个外设PPP。外设的操作步骤n2. 为变量PPP_InitStructure的各个结构成员填入允许的值。按照如下程序设置整个结构体PPP_InitStructure.member1 = val1; PPP_InitStructure.member2 = val2; PPP_InitStructure.memberN = valN; n3. 调用函数PPP_Init(.)来初始化外设PPP。n4. 在这一步,外设PP

12、P已被初始化。可以调用函数PPP_Cmd(.)来使能之。PPP_Cmd(PPP, ENABLE); 可以通过调用一系列函数来使用外设。每个外设都拥有各自的功能函数。外设的操作步骤n注:n1. 在设置一个外设前,必须调用以下一个函数来使能它的时钟: RCC_AHBPeriphClockCmd(RCC_AHBPeriph_PPPx, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_PPPx, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_PPPx, ENABLE); n2. 可以调用函数PPP_Deini

13、t(.)来把外设PPP的所有寄存器复位为缺省值: PPP_DeInit(PPP) 外设的操作步骤n注:n3. 在外设设置完成以后,继续修改它的一些参数,可以参照如下步骤: PPP_InitStucture.memberX = valX; PPP_InitStructure.memberY = valY; n PPP_Init(PPP, &PPP_InitStructure); 仅为arm公司粗略设计的存储器映射图,不同厂家根据需要,设计自己的存储器映射对应关系,以及各存储器的大小。关于存储器映射关系Bit-Bandn处理器存储器映射包括两个bit-banding 区域。它们分别为SRAM 和外

14、设存储区域中的最低的1MB。n作用:将存储器别名区的一个字映射为bit-band 区的一个位n即:在别名存储区写入一个字具有对位段区的目标位执读-改-写操作的相同效果。n目的:所有STM32F10 x外设寄存器都被映射到一个位段(bit-band)区。在各个函数中对单个比特进行置1/置0操作时被大量使用,用以减小和优化代码尺寸。Bit-BandBit-Bandn如何对应?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是目标位在存取器位段区中的位置bit_word_addr 是别名存储器区中字的地址,它映射到某个目标位。nbit_band_base 是别名区的起始地址。nbyte_offset 是包含目标位的字节在位段的序号bit_number 是目标位所在位置0-31) Bit-Bandexamplen设置地址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设置地址0 x2000_0000 中的比特2,那么:寄存器RCC_CR的PLLON24位,映射到别名区: #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口。嵌入式系统中常常有数量众多,但是结构却比较简单的外部设备/电路,对这些设备/电路有的需要CPU为之提供控制手段,有的则需要被CPU用作输入信号。而且,许多这样的设备/电路只要求一位,即只要有开/关两种状态就够了,比如灯亮与灭。对这些设备/电路的控制,使用传统的串行口或并行口都不合适。所以在微控制器芯片上一般都会提供一个“通用可编程IO接口”,即GPIO。Example:G

18、PIO控制n硬件资源分配:硬件资源分配:nPC6-PC9分别连到分别连到4个个LED,定义为,定义为LED14跑马灯实验控制过程n点亮LEDn相应管脚输出高电平n即相应管脚置1n管脚如何控制?n特殊寄存器端口配置寄存器)Example:GPIO控制nGPIO寄存器结构寄存器结构nGPIO寄存器结构,寄存器结构,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外设声明于文件“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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论