thumb2指令集及汇编格式

上传人:xh****66 文档编号:61680613 上传时间:2018-12-09 格式:PPT 页数:56 大小:3.83MB
返回 下载 相关 举报
thumb2指令集及汇编格式_第1页
第1页 / 共56页
thumb2指令集及汇编格式_第2页
第2页 / 共56页
thumb2指令集及汇编格式_第3页
第3页 / 共56页
thumb2指令集及汇编格式_第4页
第4页 / 共56页
thumb2指令集及汇编格式_第5页
第5页 / 共56页
点击查看更多>>
资源描述

《thumb2指令集及汇编格式》由会员分享,可在线阅读,更多相关《thumb2指令集及汇编格式(56页珍藏版)》请在金锄头文库上搜索。

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

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

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

4、5的数字,DCB可用“=”代替。 2. DCD/DCDU: 标号 DCD/DCDU 表达式 说明:DCD伪指令用于分配一块字存储单元并用伪指令中指定的表达式初始化,它定义的存储空间是字对齐的。DCD也可用“&”代替。,几个重要指令,3. MODULE 用于定义一个汇编模块,可用NAME,或PRAGRMA替代 一般作为汇编源文件名 如:PROGRAM hello,几个重要指令,4. _iar_program_start 在IAR环境中,定义IAR程序入口处,是默认的 5. PUBILC 声明外部函数或公有函数(变量) 如PUBLIC _iar_program_start 声明一个外部的变量,将该

5、入口地址告知其他源文件以及编译器,几个重要指令,6. _vector_table 在IAR中,具有特殊意义,定义了中断向量的入口 7.SECTION 定义一个程序段, 如:SECTION .intvec:CODE:ROOT(2) ;程序段,定义中断向量 DATA _vector_table DCD 0x20000000 ;定义中断向量的入口地址(cm3中的主堆 栈地址) DCD _iar_program_start SECTION.text:CODE:REORDER(2) ;一下可写具体代码,几个重要指令,8. main 在IAR中,对于汇编此标号也是需要的,不是程序入口,而是作为主堆栈的标志

6、 可以在设置中修改,但一般不做修改 9 .code16和code32 作为16位指令和32位指令开始的标志 等同于THUMB和ARM,10 END,END指示符告诉编译器已经到了源程序结尾。 语法格式: END 使用说明: 每一个汇编源程序都包含END指示符,以告诉本源程序的结束。,内嵌汇编,内嵌汇编(inline assembly)的语法如下: asm(“指令” ); asm(“指令” );,内嵌汇编代码举例,#include void str_cpy(const char *src,char *dst) int ch; asm(“mov r0,#1“); asm(“mov r0, #1“)

7、; asm(“add r0, r1“); ,IAR的固件库,由ST公司开发,包括驱动程序和应用函数的函数库 版本:3.4 优点: 入手快 便于开发,节约时间 缺点: 结构复杂繁琐 原理不够清晰,PPP:某一外设名称,说明,每一个外设都有一个对应的源文件:stm32f10x_ppp.c和一个对应的头文件:stm32f10x_ppp.h 文件stm32f10x_ppp.c包含了使用外设PPP所需的所有固件函数 文件stm32f10x_ppp.h包含了.c文件所需的预定义,函数声明以及变量定义等 同时,外设需要在时钟控制下工作,因此会用到时钟的头文件,说明,CM3对包括外设的所有存储设备统一编址,因

8、此在头文件中包含了存储器的映射关系stm32f10x_map.h 该文件也包含了所有寄存器的声明 用户文件与库文件通过stm32f10x_lib.h建立关系,该文件中定义了所有外设头文件的头文件,用于声明头文件,因此需要include在用户的文件中 而文件stm32f10x_conf.h则指定具体的参数,用户可以对此文件进行修改,外设的操作步骤,PPP代表任意外设 1. 在主应用文件中,声明一个结构PPP_InitTypeDef,例如: PPP_InitTypeDef PPP_InitStructure; 这里PPP_InitStructure是一个位于内存中的工作变量,用来初始化一个或者多个

9、外设PPP。,外设的操作步骤,2. 为变量PPP_InitStructure的各个结构成员填入允许的值。按照如下程序设置整个结构体PPP_InitStructure.member1 = val1; PPP_InitStructure.member2 = val2; PPP_InitStructure.memberN = valN; 3. 调用函数PPP_Init()来初始化外设PPP。 4. 在这一步,外设PPP已被初始化。可以调用函数PPP_Cmd()来使能之。PPP_Cmd(PPP, ENABLE); 可以通过调用一系列函数来使用外设。每个外设都拥有各自的功能函数。,外设的操作步骤,注:

10、1. 在设置一个外设前,必须调用以下一个函数来使能它的时钟: RCC_AHBPeriphClockCmd(RCC_AHBPeriph_PPPx, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_PPPx, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_PPPx, ENABLE); 2. 可以调用函数PPP_Deinit()来把外设PPP的所有寄存器复位为缺省值: PPP_DeInit(PPP),外设的操作步骤,注: 3. 在外设设置完成以后,继续修改它的一些参数,可以参照如下步骤: PPP_InitS

11、tucture.memberX = valX; PPP_InitStructure.memberY = valY; PPP_Init(PPP, ,仅为arm公司粗略设计的存储器映射图,不同厂家根据需要,设计自己的存储器映射(对应)关系,以及各存储器的大小。,关于存储器映射关系,Bit-Band,处理器存储器映射包括两个bit-banding 区域。它们分别为SRAM 和外设存储区域中的最低的1MB。 作用:将存储器别名区的一个字映射为bit-band 区的一个位 即:在别名存储区写入一个字具有对位段区的目标位执读-改-写操作的相同效果。 目的:所有STM32F10x外设寄存器都被映射到一个位段

12、(bit-band)区。在各个函数中对单个比特进行置1/置0操作时被大量使用,用以减小和优化代码尺寸。,Bit-Band,Bit-Band,如何对应? 映射公式: bit_word_offset = (byte_offset x 32) + (bit_number 4) bit_word_addr = bit_band_base + bit_word_offset 其中: bit_word_offset是目标位在存取器位段区中的位置bit_word_addr 是别名存储器区中字的地址,它映射到某个目标位。 bit_band_base 是别名区的起始地址。 byte_offset 是包含目标位的

13、字节在位段的序号bit_number 是目标位所在位置(0-31),Bit-Band,example,设置地址0x2000_0000 中的比特2,则:,bit_word_offset = (byte_offset x 32) + (bit_number 4) =0*32+2*4=8 bit_word_addr = bit_band_base + bit_word_offset =0x22000000+8=0x2200008,example,设置地址0x2000_0000 中的比特2,则:,寄存器RCC_CR的PLLON24位,映射到别名区: #define PERIPH_BASE (u32)0

14、x40000000) #define PERIPH_BB_BASE (u32)0x42000000) #define RCC_OFFSET (RCC_BASE - PERIPH_BASE) #define CR_OFFSET (RCC_OFFSET + 0x00) #define PLLON_BitNumber 0x18 #define CR_PLLON_BB (PERIPH_BB_BASE + (CR_OFFSET * 32 (PLLON_BitNumber * 4),一、什么是GPIO? GPIO,英文全称为General-Purpose IO ports,也就是通用IO口。嵌入式系统中常

15、常有数量众多,但是结构却比较简单的外部设备/电路,对这些设备/电路有的需要CPU为之提供控制手段,有的则需要被CPU用作输入信号。而且,许多这样的设备/电路只要求一位,即只要有开/关两种状态就够了,比如灯亮与灭。对这些设备/电路的控制,使用传统的串行口或并行口都不合适。所以在微控制器芯片上一般都会提供一个“通用可编程IO接口”,即GPIO。,Example:GPIO控制,硬件资源分配: PC6-PC9分别连到4个LED,定义为LED14,跑马灯实验,控制过程,点亮LED,相应管脚输出高电平 即相应管脚置1,管脚如何控制?,特殊寄存器(端口配置寄存器),Example:GPIO控制,GPIO寄存

16、器结构 GPIO寄存器结构,GPIO_TypeDef和AFIO_TypeDef,在文件“stm32f10x_map.h”中定义如下: typedef struct vu32 CRL; vu32 CRH; vu32 IDR; vu32 ODR; vu32 BSRR; vu32 BRR; vu32 LCKR; GPIO_TypeDef;,typedef struct vu32 EVCR; vu32 MAPR; vu32 EXTICR4; AFIO_TypeDef;,Example:GPIO控制,五个GPIO外设声明于文件“stm32f10x_map.h”: #define PERIPH_BASE (u32)0x40000000) #define APB1PERIPH_BASE PERIPH_BASE #define APB2PERIPH_BASE (PERIPH_BASE + 0x10000) #define AH

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号