STM32学习之路入门篇之指令集及cortex——m3的存储系统

发布者:Huixin8888最新更新时间:2019-12-03 来源: eefocus关键字:STM32  指令集  cortex——m3  存储系统 手机看文章 扫描二维码
随时随地手机看文章

一、汇编语言基础

一)、汇编语言:基本语法

  1、汇编指令最典型的书写模式:

        标号

                   操作码        操作数1, 操作数2,... ;注释

   1)、标号是可选的,如果有,它必须顶格写。标号的作用是让汇编器来计算程序转移的地址。

   2)、操作码是指令的助记符,它的前面必须有至少一个空白符,通常使用提个Tab键来产生。

   3)、操作码后面往往跟若干个操作数,而第一个操作数,通常都给出本指令执行结果的存储地。不同指令需要不同数目的操作数,并且对操作数的语法要求也可以不同。

   4)、注释均以;开头,它的有无不影响汇编操作,只是给程序员看的,让程序员更加可以理解代码。

 

  2、可以使用EQU指示子来定义常数,也可以使用DCB来定义一串字节常数——允许以字符串的形式表达,还可以使用DCD来定义一串32位整数。

 

  3、如果汇编器不能识别某些特殊指令的助记符,就需要“手工汇编”,查出该指令的确切二进制机器码,然后使用DCI编译器指示器。

 

  4、不同汇编器的指示字和语法都可以不同。以上以ARM汇编器说明,如使用其他汇编器,细看说明和实例代码。


二)、汇编语言:后缀的使用

  1、在ARM处理器中,指令可以带有后缀的:

 

  2、在Cortex-CM3中,对条件后缀的使用有限制,只有转移指令(B指令)才可以随意使用。而对于其他指令,Cortex-CM3引入IF-THEN模块,在这个块中才可以加后缀,且必须加后缀。

 

 三)、汇编语言:统一的汇编语言

  1、为了有力支持Thumb-2,引入了一个“统一汇编语言(UAL)”语法机制。对于16位指令和32位指令均能实现一些操作,有时虽然指令的实际操作数不同,或者对立即数的长度有不同的限制,但是汇编器允许开发者以相同的语法格式编写,并且由汇编器来决定使用16位指令还是32位指令。

 

  2、如果使用了传统的Thumb语法有些指令会默认更新APSR,即使你没有加上S后缀。如果使用UAL语法,则必须使用S后缀才能更新。

 

  3、在Thumb-2指令集中,有些操作既可以由16位指令完成,也可以由32位指令完成。在UAL下,可以让编译器决定用哪个,也可以手工指令使用16位还是32位。

   1)、.W后缀指定32位指令。如果没有给出后缀,会bain其会先试着用16位指令以缩小代码体积如果不行在使用32位指令。

   2)、.N后缀指定16位指令。

 

  4、32位Thumb-2指令可以按半字节对齐。

 

四、指令集

  1、APSR中的5个标识位:

   1)、N:复数表示(Negative)。

   2)、Z:零结果标识(Zero)。

   3)、C:进位/借位标识(Carry)。

   4)、V:溢出标识(oVerflow)。

   5)、S:饱和标识(Saturation),它不做条件转移的依据。

 

  2、Cortex-CM3支持的指令集如下:

    注意:边框双粗的是从ARMv6T2才支持的指令。

    双线边框的是从Cortex-CM3才支持的指令,(v7的其他款式不一定支持)。

   1)、16位数据操作指令

   2)、16位转移指令

   3)、16位存储器数据传送指令

   4)、其他16位指令

   5)、32位数据操作指令

   6)、32位存储器数据传送指令

   7)、32位转移指令

   8)、其他32位指令

 

  3、未支持的指令

   1)、不再是传统的架构,呆滞某些指令已失去意义

   2)、不支持的协处理器相关指令

   3)、不支持的CPS指令用法

   4)、不支持的hint指令

  

 

五、近距离的检视指令

 一)、汇编语言:数据传送

  1、Cortex-CM3中的数据传输类型

   1)、两个寄存器间的传输数据。

   2)、寄存器与存储器间传输数据。

   3)、寄存器与特殊功能寄存器间传输数据。

   4)、把一个立即数加载到寄存器。

 

  2、用在数据传输的指令时MOV,它的另一个衍生物是MVN——把寄存器的内容取反后再传送。

 

  3、用于访问存储器的基础指令是“加载(load)”和“存储(store)”。

   1)、加载指令LDR把存储器中的内容加载到寄存器中,存储指令STR把寄存器的内容存储到存储器中。传送过程中数据类型也可以变通,最常见的格式有:

   2)、如果想一次性的解决存储器访问问题,可以使用LDM/STM来进行,它相当于把若干个LDR/STR给合并起来。

    I、表中加粗的符合Cortex-CM3堆栈操作的LDM/STM的使用方式。并且如果Rd是R13,则与PUSH和POP等效。

    II、感叹号表示自增或自减基址存储器Rd的值,时机是在每次访问前或访问后。感叹号还可以用于单一加载或存储指令,——LDR/STR。这也就是所谓的“带预索引”的LDR和STR。

    III、Cortex-CM3还支持后索引。后索引也要使用一个立即数offset,但与预索引不同的是,后索引是忠实使用基址寄存器Rd的值作为数据传送的地址的。待到数据传输之后,在执行Rd<-Rd+offset。

 

  4、LDR伪指令 VS ADR伪指令

   1)、LDR和ADR都有能力产生一个地址,但是语法和行为不同。

   2)、对于LDR,如果汇编器发生要产生立即数是一个程序地址,它会自动把LSB置位,

   3)、对于ADR相反,它不会修改LSB。

 

 二)、汇编语言:数据处理

  1、虽然助记符都是ADD,但是二进制机器码是不同的。当使用16位加法时会自动更新APSR的标识位。然而,在使用了“.W”显式指定了32位指令后,就可以通过“S”后缀控制对APSR的更新。

 

  2、常见的算术四则运算指令

 

  3、Cortex-CM3还片载了硬件乘法器,支持乘加/乘减运算,并能产生64位的值。

  4、逻辑运算

  5、移位(支持多种组合)运算和循环运算

  6、带符号扩展指令

  7、数据序转指令

  8、位段处理及把玩指令

 三)、汇编语言:子程序呼叫与无条件转移指令

  1、最基本的无条件转移指令有两条:

     B    Label    ;转移到Label处对应的地址

     BL    reg    ;转移到有寄存器reg给出的地址

 

  2、呼叫子程序时,需要保存返回地址,正点的指令是:

     BL    Label    ;转移到Label处对应的地址,并且把转移前的下条指令地址保存到LR

     BLX    reg    ;转移到由寄存器reg给出的地址,根据REG的LSB切换处理器的状态,并且把转移前的下条指令地址保存到LR

   注意:、使用BLX要注意,其改变状态的功能。因此确保reg的lsb必须为1,以确保不会进入ARM状态。

 

  3、以PC为目的寄存器的MOV和LDR指令也可以实现转移,常见的形式有:

     MOV    PC,    R0    ;         转移地址由R0给出

     LDR     PC,    [R0]    ;      转移地址存储在R0所指向的存储器中

     POP    {...,  PC]    ;     把返回地址以弹出堆栈的方式送给PC,从而实现转移

     LDMIA    SP!,     {...,  PC    ;   POP另一种等效写法

   注意:使用这些方式必须保证送给PC的值是奇数(LSB=1)。

 

 四)、标志位与条件指令

  1、在应用程序状态寄存器中有5个标志位,但只有4个被条件转移指令参考。绝大多数ARM的条件转移指令根据他们来决定是否转移。

 

  2、在ARM中数据操作指令可以更新这4个标志位。这些标志位除了可以当条件转移的判断之外,还能再一些场合下作为指令是否执行的依据。或者在移位操作中充当各种中介角色。

 

  3、担任条件转移和条件执行的依据时,这4个标志位既可以单独使用,也可以组合使用,以产生15种判断依据:

 

  4、在Cortex-CM3中,下列指令可以更新PSR的标志:

   1)、16位算术逻辑指令。

   2)、32位带S后缀的算术逻辑指令。

   3)、比较指令和测试指令。

   4)、直接写PSR/APSR(MAR指令)。

 

 五)、汇编语言:指令隔离指令和存储器隔离指令

 六)、汇编指令:饱和运算

  1、Cortex-CM3的饱和运算指令分为两种:带符号的饱和运算以及无符号饱和运算。

 

  2、饱和运算指令

六、Cortex-CM3中一些有用的新指令

  1、MSR和MRS

   1)、这两条指令是访问特殊功能寄存器的指令,必须在特权下访问,出APSR外。

   2)、指令语法如下:

          MRS    ,       ;   加载特殊功能寄存器的值到Rn

          MSR    ,       ;   存储Rn的值到特殊功能寄存器的值

   3)、SReg可以是下表中的一个

 

  2、IF-THEN

   1)、IF-THEN指令围成一个块,里面最多4条指令,它里面的指令可以条件执行。

   2)、IT使用形式:

 

  3、CBZ和CBNZ

   1)、比较并条件跳转指令专为循环结构的优化而设,它只能做向前跳转。

   2)、格式为

   

 

  4、SDIV和UDIV

   1)、32位硬件除法指令。

   2)、格式

  

   3)、运算结果是Rd = Rn / Rm。

 

  5、REV,REVH,REV16以及REVSH

   1)、REV反转32位整数中的字节序,REVH则以半字节为单位反转,且只反转低半字节。

   2)、REVSH在REVH的基础上,还把反转后的半子做带符号的扩展。

   3)、语法

 

  6、RBIT

   1)、RBIT比以前的REV之流更为精细,它是按位反转的,相当于把32位整数的二进制表示法水平旋转180°。此指令在处理串行比特流大有用处。

   2)、格式

        RBIT.W    Rd,    Rn

 

  7、SXTB,SXTH,UXTB,UXTH

   1)、这四条指令是为了优化C的强制数据类型转换而设的,把数据宽度转换为处理器喜欢的32位长度。

   2)、语法

   3)、对于SXTB/SXTH,数据带符号位扩展成32位整数。对于UXTB/UXTH,高位清0。

 

  8、BFC/BFI,UBFX/SBFX

   1)、这四个指令是Cortex-CM3提供的位段操作指令。

   2)、BFC(位段清零)指令把32位整数任意一段连续的二进制位S清0,语法格式为:

           BFC    Rd,    #lsb,    #width

   3)、BFI(位段插入指令),则把某寄存器按LSB对齐的数据,拷贝到另一个寄存器的某个位段中,其格式为:

           BFI.w    Rd,    Rn,    #lsb,    #width

    4)、UBFX/SBFX都是位段提取指令,语法格式为:

           UBFx.w    Rd,    Rn,    #lsb,    #width

          SBFX.w    Rd,    Rn,    #lsb,    #width

 

  9、LDRD/STRD

   1)、Cortex-CM3在一定程度上支持对64位整数,其中LDRD/STRD就是为64位整数的数据传输而设置的。

   2)、格式:

 

  10、TBB,TBH

   1)、TBB(查表跳转字节范围的偏移量)指令和TBH(查表跳转半字节范围的偏移量)指令,分别用于从一个字节数组表中查找偏移地址,和从半字节数组表中查找偏移地址。TBB的跳转范围为255*2+4=514,TBH的跳转范围为65535*2+4=128kb+2。

   2)、TBB语法格式

             TBB.W    [Rn,   Rm]    ;PC+=Rn[Rm]*2

   3)、TBH语法格式   

             TBH.W    [Rn,   2*Rm]    ;PC+=Rn[2*Rm]*2

 

一、存储器系统的功能概览

  1、Cortex-CM3存储器系统功能

   1)、存储器映射是预定义的,并且还规定好了那个位置使用那条总线。

   2)、Cortex-CM3的存储器系统支持“位带”操作。

   3)、Cortex-CM3存储器系统支持非对齐访问和互斥访问。

   4)、Cortex-CM3的存储器系统支持both大端配置和小端配置。

 

二、存储器映射

  1、Cortex-CM3只有一个单一固定的存储器映射。这极大方便了软件在各种Cortex-CM3单片机间的移植。

 

  2、存储器的一些位置用于调试组件等私有外设,这个地址被称为“私有外设区”。私有外设区的组件包括:

   1)、闪存地址重载及断点单元(FPB)。

   2)、数据观察点单元(DWT)。

   3)、指令跟踪宏单元(ITM)。

   4)、嵌入式跟踪宏单元(ETM)。

   5)、跟踪端口接口单元(TPIU)。

   6)、ROM表。

 

  3、Cortex-CM3的地址空间是4GB,程序可以在代码区,内部SRAM区以及RAM区执行。4GB粗线条划分:

   1)、内部SRAM区的大小是512MB,用于让芯片制造商连接片上的SRAM,这个区通过系统总线来访问。在此区的下部,有一个1MB的位带区,该位带区还有一个对应的32MB的“位带别名区”,容纳了8M个“位变量”。位带区对应的是最低的1MB地址范围,而位带别名区里面的每个字对应位带区的一个比特。位带操作只适用于数据访问,不适用与取指操作。

   2)、地址空间另一个512范围由片上外设(的寄存器)使用。这个区也有一条32MB的位带别名,以便于快捷的访问外设寄存器。

   3)、还有两个1GB的范围,分别用于连接外部RAM和外部设备,它们之间没有位带。两者的区别在于外部RAM区允许执行指令,而外设设备区则不允许。

   4)、最后剩下0.5GB的地带是Cortex-CM3内核所在区域,包括系统级组件,内部私有外部总线S,外部私有外部总线S,以及由提供者定义的系统外设。

   5)、私有外部总线有两条

    I、AHB外设总线,只用于Cortex-CM3内部的AHB设备,它们是:NVIC,FPB,DWT和ITM。

    II、APB外设总线,即用于Cortex-CM3内部的APB设备,也用于外部设备

   6)、NVIC所处的区域叫做“系统控制空间(SCS)”在SCS里面还有SysTick、MPU以及代码调试控制所用的寄存器:

 

 

三、存储器访问属性S

  1、Cortex-CM3为存储器做了映射之外,还为存储器的访问规定了4中属性:

   1)、可否缓冲(Bufferable)

   2)、可否缓存(Cacheable)

   3)、可否执行(Executable)

   4)、可否共享(Shareable)

 

  2、如果配置了MPU,则可以通过它配置不同的存储区,并且覆盖缺省的访问属性。

 

四、存储器的缺省访问许可

  1、Cortex-CM3有一个缺省的访问许可,它能防止使用户代码访问系统控制存储空间,保护NVIC,MPU等关键组件。缺省访问许可在以下条件时生效:

   1)、没有配置MPU。

   2)、配置了MPU,但是MOPU被除能。

 

  2、存储器的缺省访问许可

四、位带操作

 一)、简介

  1、支持位带操作后,可以使用普通的加载/存储指令来对单一的比特进行读写。在Cortex-CM3中,有两个区实现了位带。其中一个是SRAM区的最低1MB,第二个则是片内外

设区的最低1MB范围。这两个区的地址除了可以像普通的RAM使用外,它也都有自己的“位带别名区”,位带别名区把每个比特膨胀成一个32位的字。

  1)、位带区与别名区的膨胀对应关系图A

   2)、位带区与别名区的膨胀对应关系图B

 

  2、Cortex-CM3用如下术语来表示位带存储的地址区

   1)、位带区:支持位带操作的地址区。

   2)、位带别名:对别名地址的访问最总作用到位带区的访问上。(注意:这中途有一个地址映射过程)

 

  3、在位带区中每个比特都都映射到别名地址区的一个字——这是只有LSB有效的字。当一个别名地址被访问时,会先把改地址变换成位带地址。

   1)、对于读操作,读取位带地址中的一个字,再把需要的位右移到LSB,并把LSB返回。

   2)、对于写操作,把需要写的位左移到对应的位序号处,然后执行一个原子的“读-改-写”过程。

[1] [2]
关键字:STM32  指令集  cortex——m3  存储系统 引用地址:STM32学习之路入门篇之指令集及cortex——m3的存储系统

上一篇:STM32学习之路之MDK安装篇
下一篇:STM32总线结构和存储器

推荐阅读最新更新时间:2024-11-07 15:34

STM32的FLASH简单应用
  STM3210XXX内嵌的闪存存储器可以用于在线编程(ICP)或在程序中编程(IAP)。也可以作为闪存存放数据。   主存储块:小容量产品 4K 64位        中容量产品 16K 64位        大容量产品 64K 64位   信息块: 258 64位 闪存模块组织织: 中容量(每页1K)和大容量(每页2K)的参照数据手册。   闪存存储器被组织成32位宽的存储器单元,可以存放代码和数据常数。每一个闪存模块都有一个特定的启始地址。   此次测试目的在于利用闪存存储器存放数据,并不是实现程序烧录功能,所以,只关注存储器的读写,保护功能留待日后再研究。   下面的例子是从0x08008204的地址中
[单片机]
<font color='red'>STM32</font>的FLASH简单应用
STM32 16位IO口操作的一些教训
最近在用TFT屏的时候走啦不少弯路,因为TFT屏都是16位的,所以大部分的都是采用一组IO口对应16个数据位刚好并口传输数据,最近因为IO口紧缺,所以想要改成串口,但是发现串口刷新屏幕太慢所以最后改成8位的并口,但是STM32操作IO口的寄存器是16位的。也就是说用并口的话一起传输数据进去虽然只用8位但是操作还是16位一起操作,虽然有8位没用到但是还是在传输数据进去的时候被一起操作,会把不用的8位的值一起覆盖。 #define DATAOUT(x) GPIOB- ODR=x; //数据输出 如上当调用宏的时候整个B端口一起被操作。 方法1: ODR配置法,可以直接使用 GPIO- ODR = value N;给对应的IO口
[单片机]
STM32小白入门(第12天)---I2C协议
一、概述 二、信号概念 三、AT24C02(EEPROM电可擦除ROM)--配合单片机存贮掉电前需要保存的数据,类似单片机的硬盘 1、写时序 2、读时序 思考题2:在24c02控制时钟的时候,为什么要进行5us的延时,小于5us延时或许大于5us的延时是否可以,示例代码如下: //设置SCL高电平 SCL=1; delay_us(5); //设置SCL低电平 SCL=0; delay_us(5); 回答:大于5us是可以的,如果使用5ms是可以的。但是延时是不能低于1.2us,详细描述如下图。 3、起始信号和停止信号 //sda输入输出模式切换函数 v
[单片机]
<font color='red'>STM32</font>小白入门(第12天)---I2C协议
STM32初学笔记4之USART
=========================== 文件分割线 =============================== /** ** 文件名称:BSP_ALIENTEK.H ** 功能描述:ALIENTEK开发板板级支持包声明 ** 硬件平台:STM32F103RBT6 Development Board ** 编译环境:Keil uversion4 IDE ** 版本信息:v0.2 ** 编写作者:唐华明 ** 编写时间:2011.11.26 ** 附加说明:无 ** 修改记录:2011-11-26 将DS0Off() GPIO_SetBits(GPIOD, GPIO_Pin_8)修改为 **
[单片机]
STM32的IO模式选择
有关推挽输出、开漏输出、复用开漏输出、复用推挽输出以及上拉输入、下拉输入、浮空输入、模拟输入区别 有关推挽输出、开漏输出、复用开漏输出、复用推挽输出 以及上拉输入、下拉输入、浮空输入、模拟输入的区别 最近在看数据手册的时候,发现在Cortex-M3里,对于GPIO的配置种类有8种之多: (1)GPIO_Mode_AIN模拟输入 (2)GPIO_Mode_IN_FLOATING浮空输入 (3)GPIO_Mode_IPD下拉输入 (4)GPIO_Mode_IPU上拉输入 (5)GPIO_Mode_Out_OD开漏输出 (6)GPIO_Mode_Out_PP推挽输出 (7)GPIO_Mode_AF_OD复用开漏输出 (8)GPIO
[单片机]
STM32-GPIO 
为了快速了解STM32,并且使用STM32完成工程。我们首先来浏览一下STM32的GPIO,这也最容易学习的。在本节我们了解一下GPIO的框架。下一节了解一下STM32的晶振,就可以干什么了?当然是流水灯或者键盘实验。 在《STM32中文资料》在第8章做了详细的介绍。我们只是浏览一下。在105页列举了GPIO的几种模式。 GPIO管脚可以兼容5V的电平,这一点在手册上有明确的说明。也就是说STM32的GPIO可以不需要任何转换连接5V的设备。上半虚线框图是输入部分,下半虚线框图是输出部分。 k1、K2是两个开关,当k1、k2 都断开时是输入浮空,k1闭合、k2断开输入上拉。k1断开、k2闭合输出上拉。 当k1闭
[单片机]
STM32-GPIO 
STM32开发板学习日记-[5]TIM的PMW模式
脉冲宽度调制模式可以产生一个由TIMx_ARR寄存器确定频率、由TIMx_CCRx寄存器确定占空比的信号。 在TIMx_CCMRx寄存器中的OCxM位写入 110 (PWM模式1)或 111 (PWM模式2),能够独立地设置每个OCx输出通道产生一路PWM。必须设置TIMx_CCMRx寄存器OCxPE位以使能相应的预装载寄存器,最后还要设置TIMx_CR1寄存器的ARPE位使能自动重装载的预装载寄存器(在向上计数或中心对称模式中)。 因为仅当发生一个更新事件的时候,预装载寄存器才能被传送到影子寄存器,因此在计数器开始计数之前,必须通过设置TIMx_EGR寄存器中的UG位来初始化所有的寄存器。 OCx的极性可以通过软件在TIMx_C
[单片机]
一文详解STM32端口复用及映射
复用 STM32有很多的内置外设,这些外设的外部引脚都是与GPIO复用的。也就是说,一个GPIO如果可以复用为内置外设的功能引脚,那么当这个GPIO作为内置外设使用的时候,就叫做复用。 哪些端口可以复用为什么,这个查表就可以了 2,如何进行端口复用? 比如AF1要复用到TIM1; 通过设置AFRL寄存器和AFRH寄存器 就可以AF1----- TIM1; 一组IO口有16个 GPIOAF0~15 AFRL负责低八位IO AFRH负责高八位IO 举例 除了ADC或者DAC配置为模拟之外,其他外设都要配置为复用 //完整版 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIO
[单片机]
一文详解<font color='red'>STM32</font>端口复用及映射
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved