精华内容
下载资源
问答
  • TMC5160寄存器定义

    2018-11-08 09:53:07
    TMC5160寄存器定义的头文件。结构体定义与位字段定义组合,可以直接使用
  • 寄存器组

    千次阅读 2007-01-29 00:27:00
    2.1 寄存器组寄存器是CPU内部重要的数据存储资源,是汇编程序员能直接使用的硬件资源之一。由于寄存器的存取速度比内存快,所以,在用汇编语言编写程序时,要尽可能充分利用寄存器的存储功能。寄存器一般用来保存...

    2.1 寄存器组

    寄存器是CPU内部重要的数据存储资源,是汇编程序员能直接使用的硬件资源之一。由于寄存器的存取速度比内存快,所以,在用汇编语言编写程序时,要尽可能充分利用寄存器的存储功能。

    寄存器一般用来保存程序的中间结果,为随后的指令快速提供操作数,从而避免把中间结果存入内存,再读取内存的操作。在高级语言(如:C/C++语言)中,也有定义变量为寄存器类型的,这就是提高寄存器利用率的一种可行的方法。

    另外,由于寄存器的个数和容量都有限,不可能把所有中间结果都存储在寄存器中,所以,要对寄存器进行适当的调度。根据指令的要求,如何安排适当的寄存器,避免操作数过多的传送操作是一项细致而又周密的工作。有关“寄存器的分配策略”在后续课程《编译原理》中会有详细的介绍。

    由于16位/32位CPU是微机CPU的两个重要代表,所以,在此只介绍它们内部寄存器的名称及其主要功能。

    2.1.1 寄存器组

    1、 16位寄存器组

    16位CPU所含有的寄存器有(见图2.1中16位寄存器部分):

    4个数据寄存器(AX、BX、CX和DX)

    2个变址和指针寄存器(SI和DI) 2个指针寄存器(SP和BP)

    4个段寄存器(ES、CS、SS和DS)

    1个指令指针寄存器(IP) 1个标志寄存器(Flags)

    2、 32位寄存器组

    32CPU除了包含了先前CPU的所有寄存器,并把通用寄存器、指令指针和标志寄存器从16位扩充成32位之外,还增加了216位的段寄存器:FSGS

    32位CPU所含有的寄存器有(见图2.1中的寄存器):

    4个数据寄存器(EAX、EBX、ECX和EDX)

    2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)

    6个段寄存器(ES、CS、SS、DS、FSGS)

    1个指令指针寄存器(EIP) 1个标志寄存器(EFlags)

    图2.1 CPU寄存器组的示意图

     

    2.1.2、通用寄存器的作用

    通用寄存器可用于传送和暂存数据,也可参与算术逻辑运算,并保存运算结果。除此之外,它们还各自具有一些特殊功能。汇编语言程序员必须熟悉每个寄存器的一般用途和特殊用途,只有这样,才能在程序中做到正确、合理地使用它们。

    表2.1 通用寄存器的主要用途

    寄存器的分类 寄存器

    主 要 用 途

    数据

     

    寄存器

    AX

    乘、除运算,字的输入输出,中间结果的缓存

    AL

    字节的乘、除运算,字节的输入输出,十进制算术运算

    AH

    字节的乘、除运算,存放中断的功能号

    BX

    存储器指针

    CX

    串操作、循环控制的计数器

    CL

    移位操作的计数器

    DX

    字的乘、除运算,间接的输入输出

    变址
    寄存器
    SI

    存储器指针、串指令中的源操作数指针

    DI

    存储器指针、串指令中的目的操作数指针

    变址
    寄存器
    BP

    存储器指针、存取堆栈的指针

    SP

    堆栈的栈顶指针

    指令指针

    IP/EIP  
    标志位寄存器 Flag/EFlag  
    32位

    CPU的

    段寄存器

    16位CPU的

    段寄存器

    ES  附加段寄存器
    CS  代码段寄存器
    SS  堆栈段寄存器
    DS  数据段寄存器
    新增加的
    段寄存器
    FS  附加段寄存器
    GS  附加段寄存器

    更详细的内容请点击:通用寄存器功能的说明

    2.1.3、专用寄存器的作用

    16CPU内部有一个16位的标志寄存器,它包含9个标志位。这些标志位主要用来反映处理器的状态和运算结果的某些特征。各标志位在标志寄存器内的分布如图2.2所示。

     
    15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
            OF DF IF TF SF ZF   AF   PF   CF
    31 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
    VM RF   NT IOPL OF DF IF TF SF ZF   AF   PF   CF

    图2.2 16位/32位标志寄存器的示意图

    上面9个标志位可分为二组:运算结果标志位(有背景色的标志位)和状态控制标志位。前者受算术运算逻辑运算结果的影响,后者受一些控制指令执行的影响。

    更详细的内容请点击:标志位的说明

    有些指令的执行会改变标志位(如:算术运算指令等),不同的指令会影响不同的标志位,有些指令的执行不改变任何标志位(如:MOV指令等),有些指令的执行会受标志位的影响(如:条件转移指令等),也有指令的执行不受其影响。

    程序员要想熟练运用这些标志位,就必须掌握每个标志位的含义、每条指令的执行条件和执行结果对标志位的作用。

    注意:虽然知道每个标志位在标志寄存器内的具体位置是有好处的,但通常情况下,没有这个必要。在使用第5.2.9节中的“条件转移指令”时,系统会自动引用相应标志位的值来决定是否需要“转移”的,所以,不必过分强调标志位在标志寄存器内的具体位置。

    展开全文
  • NVIC寄存器组

    千次阅读 2012-01-05 20:14:01
    在STM32中用到了Cortex-M3定义的三组寄存器,有关这三组...在STM32的固件库中定义了三个结构体与这三个寄存器组相对应,这三个结构体与ARM手册中寄存器的对应关系如下:   一、NVIC寄存器组 STM32的固件库

    在STM32中用到了Cortex-M3定义的三组寄存器,有关这三组寄存器的说明不在STM32的技术手册中,需要参考ARM公司发布的Cortex-M3 Technical Reference Manual (r2p0)


    在STM32的固件库中定义了三个结构体与这三个寄存器组相对应,这三个结构体与ARM手册中寄存器的对应关系如下:


     


    一、NVIC寄存器组


    STM32的固件库中有如下定义:


    typedef struct
    {
      vu32 ISER[2];
      u32 RESERVED0[30];
      vu32 ICER[2];
      u32 RSERVED1[30];
      vu32 ISPR[2];
      u32 RESERVED2[30];
      vu32 ICPR[2];
      u32 RESERVED3[30];
      vu32 IABR[2];
      u32 RESERVED4[62];
      vu32 IPR[11];
    } NVIC_TypeDef;


    它们对应ARM手册中的名称为
    ISER = Interrupt Set-Enable Registers
    ICER = Interrupt Clear-Enable Registers
    ISPR = Interrupt Set-Pending Register
    ICPR = Interrupt Clear-Pending Register
    IABR = Active Bit Register
    IPR = Interrupt Priority Registers


    每个寄存器有240位,以Interrupt Set-Enable Registers说明,ISER[0]对应中断源0~31,ISER[1]对应中断源32~63,STM32只有60个中断源,所以没有ISER[2:7]。

    首先分析为什么定义。这是因为ISER的地址是从E000E100开始的,ICER是从E000E180开始的,依次类推;可见从0xE000E100到0xE000E180间隔128个8位,也就是32个32位的数据;这就是vu32 XXX[2]+u32 RESERVED0[30]总的位数。

      1)

      ISER包括ISER[0]和ISER[1],它们的每位值依次对应一个中断的开启和关闭。例如ISER[0]中的第0位对应

    WWDG 窗口定时器中断;第25位对应TIM1_UP TIM1更新中断。---用来开中断

      ICER写响应的位为1则对应的中断禁止,默认全0,读如果该位为1则相应的中断允许--用来关中断。

      2)

      ISPR中某位为1则挂起相应中断;

      ICPR中某位为1则清除挂起的中断;

      3)

      IABR只读用来指示是否有中断发生或要处理;

      4)

      IPR用来设置优先级别



    参考STM32技术参考手册中的中断向量表,中断源的位置为:
    位置0 - WWDG = Window Watchdog interrupt
    位置1 - PVD = PVD through EXTI Line detection interrupt
    位置2 - TAMPER = Tamper interrupt
    ......
    位置58 - DMA2_Channel3 = DMA2 Channel3 global interrupt
    位置59 - DMA2_Channel4_5 = DMA2 Channel4 and DMA2 Channel5 global interrupts


     


    二、系统控制寄存器组


    STM32的固件库中有如下定义:


    typedef struct
    {
      vuc32 CPUID;
      vu32 ICSR;
      vu32 VTOR;
      vu32 AIRCR;
      vu32 SCR;
      vu32 CCR;
      vu32 SHPR[3];
      vu32 SHCSR;
      vu32 CFSR;
      vu32 HFSR;
      vu32 DFSR;
      vu32 MMFAR;
      vu32 BFAR;
      vu32 AFSR;
    } SCB_TypeDef; /* System Control Block Structure */


    它们对应ARM手册中的名称为


    CPUID = CPUID Base Register
    ICSR = Interrupt Control State Register
    VTOR = Vector Table Offset Register
    AIRCR = Application Interrupt/Reset Control Register
    SCR = System Control Register
    CCR = Configuration Control Register
    SHPR = System Handlers Priority Register
    SHCSR = System Handler Control and State Register
    CFSR = Configurable Fault Status Registers
    HFSR = Hard Fault Status Register
    DFSR = Debug Fault Status Register
    MMFAR = Mem Manage Address Register
    BFAR = Bus Fault Address Register
    AFSR = Auxiliary Fault Status Register


     


    三、系统时钟寄存器组


    STM32的固件库中有如下定义:


    typedef struct
    {
      vu32 CTRL;
      vu32 LOAD;
      vu32 VAL;
      vuc32 CALIB;
    } SysTick_TypeDef;


    它们对应ARM手册中的名称为


    CTRL = SysTick Control and Status Register
    LOAD = SysTick Reload Value Register
    VAL = SysTick Current Value Register
    CALIB = SysTick Calibration Value Register

    展开全文
  • 定义法:直接就是常量操作 方法1:用#define来定义,方便省事,缺点:系统不做检查 .../*枚举法定义寄存器,枚举中的值可以重复但名称不能重复*/// 通信寄存器bit定义 enum{ /* 寄存器选择 RS2 RS1 ...

    宏定义法:直接就是常量操作

    方法1:用#define来定义,方便省事,缺点:系统不做检查

    方法2:用enum来定义,可以像#define一样定义常量,同时系统做检查。既可以定义某个位也可以定义几个位的组合,备注:enum中标识不可以重复,但后面的值可以重复。

    /*枚举法定义寄存器,枚举中的值可以重复但名称不能重复*/
    // 通信寄存器bit定义
    enum
    {
    /* 寄存器选择 RS2 RS1 RS0 */
    REG_COMM = (0 << 4), /* 通信寄存器 */
    REG_SETUP = (1 << 4), /* 设置寄存器 */
    REG_CLOCK = (2 << 4), /* 时钟寄存器 */
    REG_DATA = (3 << 4), /* 数据寄存器,16位 */
    REG_TEST = (4 << 4), /* 测试寄存器 8位*/
    REG_NODO = (5 << 4), /* 无操作 */
    REG_OFFSET = (6 << 4), /* 偏移(满标度校准)寄存器24位 */
    REG_GAIN = (7 << 4), /* 增益(零标度校准)寄存器,24位 */

    /* 读写操作 */
    WRITE = (0 << 3), /* 写操作 */
    READ = (1 << 3), /* 读操作 */

    WAIT_MODE =(1 << 2),
    WAIT_NONE =(0 << 2),
    /*STBU =0X40 等待和掉电模式*/
    /* 通道 */
    CH_1 = (0 << 0), /* AIN1+ AIN1- */
    CH_2 = (1 << 0), /* AIN2+ AIN2- */
    CH_3 = (2 << 0), /* AIN1- AIN1- */
    CH_4 = (3 << 0) /* AIN1- AIN2- */
    };

    /* 设置寄存器bit定义 */
    enum
    {
    MD_NORMAL = (0 << 6), /* 正常模式 */
    MD_CAL_SELF = (1 << 6), /* 自校准模式,消除偏移和增益误差。上电执行一次,单极性是内部将IN+/-短接,时间是6倍输出速率,然后读数据到校准BUF中t=6 ×1/输出频率 ;tRdy=9 ×1/输出频率*/
    MD_CAL_ZERO = (2 << 6), /* 校准0刻度模式 环境变化时执行0校准和满校准到对应的校准buf中,3 ×1/输出频率*/
    MD_CAL_FULL = (3 << 6), /* 校准满刻度模式,tconv=3 ×1/输出频率,tRdy=4 ×1/输出频率 */

    GAIN_1 = (0 << 3), /* 增益 */
    GAIN_2 = (1 << 3), /* 增益 */
    GAIN_4 = (2 << 3), /* 增益 */
    GAIN_8 = (3 << 3), /* 增益 */
    GAIN_16 = (4 << 3), /* 增益 */
    GAIN_32 = (5 << 3), /* 增益 */
    GAIN_64 = (6 << 3), /* 增益 */
    GAIN_128 = (7 << 3), /* 增益 */

    /* 无论双极性还是单极性都不改变任何输入信号的状态,它只改变输出数据的代码和转换函数上的校准点 */
    BIPOLAR = (0 << 2), /* 双极性输入 */
    UNIPOLAR = (1 << 2), /* 单极性输入 */

    BUF_NO = (0 << 1), /* 输入无缓冲(内部缓冲器不启用) */
    BUF_EN = (1 << 1), /* 输入有缓冲 (启用内部缓冲器) */

    FSYNC_0 = 0, /* 由1到0,从已知时间点(下一个时钟)开始采样 */
    FSYNC_1 = 1 /* 不启用即不采样,处于复位状态 */
    };

    /* 时钟寄存器bit定义 */
    enum
    {
    CLKDIS_0 = (0<<4), /* 时钟输出使能 (当外接晶振时,必须使能才能振荡) */
    CLKDIS_1 =(1<<4), /* 时钟禁止 (当外部提供时钟时,设置该位可以禁止MCK_OUT引脚输出时钟以省电 */

    /*
    2.4576MHz(CLKDIV=0 )或为 4.9152MHz (CLKDIV=1 ),CLK 应置 “1”。
    1MHz (CLKDIV=0 )或 2MHz (CLKDIV=1 ),CLK 该位应置 “0”

    */

    CLKDIV= (1<<3),
    CLK = (1<<2),

    CLK_4_9152M = (0x03<<2),/*CLK=1*/
    CLK_2_4576M = (0x01<<2),/*CLK=1*/
    CLK_1M = (0x00<<2), /*CLK=0*/
    CLK_2M = (0x02<<2),/*CLK=0*/

    FS_50HZ = (0<<0)|CLK,/*2ms输出一个数字*/
    FS_60HZ = (1<<0)|CLK,
    FS_250HZ = (2<<0)|CLK,
    FS_500HZ = (3<<0)|CLK,

    FS_20HZ = (0<<0),
    FS_25HZ = (1<<0),
    FS_100HZ = (2<<0),
    FS_200HZ = (3<<0),

    /*
    提高TM7705 精度的方法:
    当使用主时钟为 2.4576MHz 时,强烈建议将时钟寄存器设为 84H,此时数据输出更新率为10Hz,即每0.1S 输出一个新数据。
    当使用主时钟为 1MHz 时,强烈建议将时钟寄存器设为80H, 此时数据输出更新率为4Hz, 即每0.25S 输出一个新数据
    */
    // ZERO_0 = 0x00,
    // ZERO_1 = 0x80
    };

    变量定义法:这样相当于定义了变量,通过修改变量和使用变量方法:参考https://wenku.baidu.com/view/f19d87727fd5360cba1adb45

    /*用结构体变量方法定义*/
    Typedef union{
    uint_16 Reg_Bit16;
    struct{
    { // 低字节低位,低字节高位,高字节低位,高字节高位
    uint_16 bit0:0; //
    uint_16 bit1:1; //
    uint_16 bit2:2; //
    uint_16 bit3:3; //
    uint_16 bit4:4; //
    uint_16 bit5:5; //
    uint_16 bit6:6; //
    uint_16 bit7:7; //
    uint_16 bit8:8; //
    uint_16 bit9:9; //
    uint_16 bit10:1; //
    uint_16 bit10:10; //
    uint_16 bit11:11; //
    uint_16 bit12:12; //
    uint_16 bit13:13; //
    uint_16 bit14:14; //
    uint_16 bit15:15 //
    }Bits;
    };

    Extern volatile Reg_XXX @(REG_BASE + 0x00000039);//
    #define FunBit Reg_XXX.Bits.bit0 // 寄存器的第0位


    /*寄存器级别的使用,然后用宏定义定义其组合位定义*/
    struct Reg_Bit8
    { // 低字节低位,低字节高位,高字节低位,高字节高位
    uint_8 busy/0 :1; // 7 写0,读busy
    uint_8 RegType :3; // 6:4
    uint_8 W/R :1; // 3 Write/read
    uint_8 Waitmode :1; // 2
    uint_8 Chnl :4; // 1:0 通道
    };
    union Communicate_REG
    {
    uint_8 all;
    struct Reg_Bit8 bit;
    };


    struct Reg_Bit8
    { // 低字节低位,低字节高位,高字节低位,高字节高位

    uint_8 WorkMODE :2; // 7:6 保留
    uint_8 Gain :3; // 5:3
    uint_8 POLAR :1; // 2 0=双极性
    uint_8 UseBUF :1; // 1=输入缓冲处理高阻抗源
    uint_8 FSYNC :1; // 0=从下一个点采样;1停止采样
    };
    union Config_REG
    {
    uint_8 all;
    struct Reg_Bit8 bit;
    };


    struct Reg_Bit8
    { // 低字节低位,低字节高位,高字节低位,高字节高位

    uint_8 rsvd :3; // 7:5 保留=000
    uint_8 CLKDIS :1; // 4 禁止=1
    uint_8 CLKDIV :1; // 3
    uint_8 CLK :1; // 2
    uint_8 FS :2; // 1:0和CLK一起决定输出速率

    };
    union CLK_REG
    {
    uint_8 all;
    struct Reg_Bit8 bit;
    };

    /* 通信寄存器bit定义 */
    /* 寄存器选择 RS2 RS1 RS0 */
    #define REG_COMM (0 << 4) /* 通信寄存器 */
    #define REG_SETUP (1 << 4) /* 设置寄存器 */
    #define REG_CLOCK (2 << 4) /* 时钟寄存器 */
    #define REG_DATA (3 << 4) /* 数据寄存器,16位 */
    #define REG_TEST (4 << 4) /* 测试寄存器 8位*/
    #define REG_NODO (5 << 4) /* 无操作 */
    #define REG_OFFSET (6 << 4) /* 偏移(满标度校准)寄存器24位 */
    #define REG_GAIN (7 << 4) /* 增益(零标度校准)寄存器,24位 */

    /* 读写操作 */
    #define WRITE (0 << 3) /* 写操作 */
    #define READ (1 << 3) /* 读操作 */
    #define
    #define WAIT_MODE (1 << 2)
    #define WAIT_NONE (0 << 2)

    /*通道 */
    #define CH_1 (0 << 0) /* AIN1+ AIN1- */
    #define CH_2 (1 << 0) /* AIN2+ AIN2- */
    #define CH_3 (2 << 0) /* AIN1- AIN1- */
    #define CH_4 (3 << 0) /* AIN1- AIN2- */
    };

    /* 设置寄存器bit定义 */


    #define MD_NORMAL (0 << 6) /* 正常模式 */
    #define MD_CAL_SELF (1 << 6) /* 自校准模式,消除偏移和增益误差。上电执行一次,单极性是内部将IN+/-短接,时间是6倍输出速率,然后读数据到校准BUF中t=6 ×1/输出频率 ;tRdy=9 ×1/输出频率*/
    #define MD_CAL_ZERO (2 << 6) /* 校准0刻度模式 环境变化时执行0校准和满校准到对应的校准buf中,3 ×1/输出频率*/
    #define MD_CAL_FULL (3 << 6) /* 校准满刻度模式,tconv=3 ×1/输出频率,tRdy=4 ×1/输出频率 */
    #define
    #define GAIN_1 (0 << 3) /* 增益 */
    #define GAIN_2 (1 << 3) /* 增益 */
    #define GAIN_4 (2 << 3) /* 增益 */
    #define GAIN_8 (3 << 3) /* 增益 */
    #define GAIN_16 (4 << 3) /* 增益 */
    #define GAIN_32 (5 << 3) /* 增益 */
    #define GAIN_64 (6 << 3) /* 增益 */
    #define GAIN_128 (7 << 3) /* 增益 */

    /* 无论双极性还是单极性都不改变任何输入信号的状态,它只改变输出数据的代码和转换函数上的校准点 */
    #define BIPOLAR (0 << 2) /* 双极性输入 */
    #define UNIPOLAR (1 << 2) /* 单极性输入 */

    #define BUF_NO (0 << 1) /* 输入无缓冲(内部缓冲器不启用) */
    #define BUF_EN (1 << 1) /* 输入有缓冲 (启用内部缓冲器) */

    #define FSYNC_0 0 /* 由1到0,从已知时间点(下一个时钟)开始采样 */
    #define FSYNC_1 1 /* 不启用即不采样,处于复位状态 */
    };

    /* 时钟寄存器bit定义 */
    enum
    {
    #define CLKDIS_0 (0<<4) /* 时钟输出使能 (当外接晶振时,必须使能才能振荡) */
    #define CLKDIS_1 (1<<4) /* 时钟禁止 (当外部提供时钟时,设置该位可以禁止MCK_OUT引脚输出时钟以省电 */

    /* 2.4576MHz(CLKDIV=0 )或为 4.9152MHz (CLKDIV=1 ),CLK 应置 “1”。
    1MHz (CLKDIV=0 )或 2MHz (CLKDIV=1 ),CLK 该位应置 “0” */

    CLKDIV= (1<<3),
    CLK = (1<<2),

    #define CLK_4_9152M = (0x03<<2)/*CLK=1*/
    #define CLK_2_4576M = (0x01<<2)/*CLK=1*/
    #define CLK_1M = (0x00<<2) /*CLK=0*/
    #define CLK_2M = (0x02<<2)/*CLK=0*/

    #define FS_50HZ = (0<<0)|CLK/*2ms输出一个数字*/
    #define FS_60HZ = (1<<0)|CLK
    #define FS_250HZ = (2<<0)|CLK
    #define FS_500HZ = (3<<0)|CLK

    #define FS_20HZ = (0<<0)
    #define FS_25HZ = (1<<0)
    #define FS_100HZ = (2<<0)
    #define FS_200HZ = (3<<0)

    /*提高TM7705 精度的方法:
    当使用主时钟为 2.4576MHz 时,强烈建议将时钟寄存器设为 84H,此时数据输出更新率为10Hz,即每0.1S 输出一个新数据。
    当使用主时钟为 1MHz 时,强烈建议将时钟寄存器设为80H, 此时数据输出更新率为4Hz, 即每0.25S 输出一个新数据*/
    // #define ZERO_0 0x00
    // #define ZERO_1 0x80
    };

    /*模块层级的使用*/
    struct TM7705_REGS
    {
    union Communicate_REG volatile ComReg; //
    Config_REG volatile ConfigReg;
    union CLK_REG volatile ClkReg;
    uint_16 volatile DataReg;
    }TM7705;

    转载于:https://www.cnblogs.com/jieruishu/p/10843016.html

    展开全文
  • Cortex --寄存器组

    2019-01-04 21:47:06
    前言 还是和ARM7做对比进行学习 ...为定义模式 IRQ模式 FIQ模式 cortex R0 R0 R0 R0 R0 R0 R0 R0 R1 R1 R1 R1 R1 R1 R1 R1 R2 R2 R2 R2 R2 R2 R2 R2 ...

    前言

    还是和ARM7做对比进行学习

    寄存器的总体区别

    由于arm7有七种工作模式,而cortex只有两种,所以在寄存器方面有很大的区别。

    用户模式 系统模式 管理模式 中止模式 为定义模式 IRQ模式 FIQ模式 cortex
    R0 R0 R0 R0 R0 R0 R0 R0
    R1 R1 R1 R1 R1 R1 R1 R1
    R2 R2 R2 R2 R2 R2 R2 R2
    R7 R7 R7 R7 R7 R7 R7 R7
    R8 R8 R8 R8 R8 R8 R8_FIQ R8
    …_FIQ
    R12 R12 R12 R12 R12 R12 R12_FIQ R12
    R13(SP) R13 R13_SVC R13_ABT R13_UND R13_IRQ R13_FIQ R13
    R14 (LR) R14 R14_SVC R14_ABT R14_UND R14_IRQ R14_FIQ R14
    R15(PC) PC PC PC PC PC PC PC
    CPSR CPSR CPSR CPSR CPSR CPSR CPSR xPSR
    SPSR_SVC SPSR_ABT SPSR_UND SPSR_IRQ SPSR_FIQ
    PRIMASK
    FAULTMASK
    BASEPRI
    CONTROL

    在arm7中,R0–R7的通用寄存器所有模式共用,而R8–R12寄存器中,快中断模式有自己独立的寄存器,可以快速处理中断,而其他模式还是共用寄存器。SP和LR中用户模式和系统模式共用寄存器,其他模式有独立寄存器,每个异常模式有自己的SPSR用于保存之前的cpsr,中断处理后进行返回。

    M3就没有这么繁琐的寄存器,它有R0–R15的通用寄存器,也有CPSR,不过换了个名字xPSR。同时新增了用于控制异常的使能和失能寄存器PRIMASK, FAULTMASK 和 BASEPRI。以及用于定义特权级别,还用于选择当前使用哪个堆栈指针的控制寄存器CONTROL

    程序状态寄存器

    在arm7时代的程序状态寄存器是这样的。将整个寄存器划分为4个域,[31-24]是标志域,用于判断计算是否溢出进位为0等。[23-16]是状态域没有使用,[15-8]是扩展域没有使用,[7-0]是控制域用于控制中断的模式。

    31 30 29 28 27 26-25 24 23 16 15-8 7 6 5 4-0
    N Z C V Q unused J unused unused I F T MODE

    cortex的程序状态寄存器xpsr,将整个寄存器分为三个子状态寄存器(部分位没有使用):
    应用程序 PSR(APSR)—对应cpsr标志域[31-27],(由8位减到5位)
    执行 PSR(EPSR)—对应cpsr没有使用的状态域和扩展域
    中断号 PSR(IPSR)—对应cpsr的控制域[8-0](增加了1位)

    31 30 29 28 27 26-25 24 23 -16 15-10 9 8-0
    N Z C V Q ICI/IT T unused ICI/IT 中断号

    在这里插入图片描述

    APSR

    N:表示两个有符号整数运算时,N==1表示运算结果为负数,N=0表示运算结果为正数或者零。
    Z:Z=1表示运算结果为0,Z=0表示运算结果不为0
    C:无符号加法运算产生进位,则C=1,无符号减法运算产生溢出,则C=0;
    V:有符号加减运算产生溢出,则V=1;
    Q:饱和条件码标志位

    IPSR

    在arm7中,是通过一个特定的数来表示某个模式,而cortex中,只有两个模式,所以当IPSR等于0时候,处于线程模式时,在手柄模式下,为当前异常的异常号。

    EPSR

    用来说明是arm指令还是thumb指令,其实也就是控制域的[5]位
    T:Thumb状态, T=1,ARM状态,T=0;

    通用状态寄存器

    由R0到R12寄存器构成,其中R0到R7是低组寄存器。所有指令都能访问它们,复位后的初始值是不可预料的。R8-R12 被称为高组寄存器。这是因为只有很少的 16 位 Thumb 指令能访问它们, thumb-2 指令则不受限制。复位后的初始值也是不可预料的。

    中间结果保存寄存器R12

    R12一般用在子程序连接代码中使用,作为子程序的中间结果寄存器

    堆栈指针寄存器R13(sp)

    在 CM3 中有两个堆栈指针,当引用 R13(时,引用到的是当前正在使用的那一个,另一个必须用特殊的指令来访问( MRS,MSR指令)。
    主堆栈指针(MSP),或写作 SP_main。这是缺省的堆栈指针,它由 OS 内核、异常服务例程以及所有需要特权访问的应用程序代码来使用。
    进程堆栈指针(PSP),或写作 SP_process。用于常规的应用程序代码(不处于异常服用例程中时)。

    连接寄存器R14(LR)

    当通过BL跳转到子程序时,R14就被设置成子程序的返回地址,在子程序中把LR的值赋值给pc就可以实现子程序的返回。如 MOV PC,LR 或者 BX LR;

    程序计数器R15(PC)

    CM3 内部使用了指令流水线,读 PC 时返回的值是当前指令的地址+4。

    异常/中断屏蔽寄存器组

    该寄存器组总共有3个寄存器,只有在特权级下,才允许访问这 3 个寄存器。
    使用MRS/MSR指令访问这三个寄存器,比如:
    MRS R0, BASEPRI ;读取BASEPRI到R0中
    MSR BASEPRI, R0 ;将R0数据写入到BASEPRI中

    PRIMASK寄存器

    只有单一比特的寄存器。置为1后,就关掉所有可屏蔽异常,只剩下NMI和硬Fault的异常可以响应。默认值是0,表示没有关闭中断。

    FAULTMASK寄存器

    只有单一比特的寄存器。置为1后,只有NMI异常可以响应。默认值为0,表示没有关异常。

    BASEPRI寄存器

    该寄存器最多有9位(由表达优先级的位数决定)。定义了被屏蔽优先级的阈值。当它被设置为某个值后,所有优先级号大于等于此值的中断都被关。若设置成0,则不关断任何中断,0为默认值。

    控制寄存器(Control)

    CONTROL[1]:
    为0表示选择MSP(主堆栈指针,默认情况),为1表示选择PSP(进程堆栈指针);
    当为Handle模式下不允许向该位写1,也就是在Handle模式下。改为一直为0;仅当处于特权级的线程模式下,此位才可写,其它场合下禁止写此位。
    CONTROL[0]:
    为0表示特权级的线程模式,为1表示用户级的线程模式,Handler 模式永远都是特权级的;

    展开全文
  • 通用寄存器 32位通用寄存器:EAX、EBX 、ECX、 EDX;...说明:为了说明一个段的描述符放在哪个表中、序号是多少以及特权级的高低,为每个段定义了一个16位的选择符,该选择符装入段寄存器即段寄存器中存放选择...
  • 寄存器

    2018-11-09 21:10:00
    一.内存在字的存储 1.字:(两个内存单元存储一个字). 字单元:存放一个字节型数据的...段:在需要时可以将一内存单元定义成一个段。 数据段:存储数据的一内存单元。 代码段:存储指令的一内存单元。 栈...
  • STM32使用的时候需要定义一些引脚为专用名称,如下图: 下面展示一些 内联代码片。 // A code block var foo = 'bar'; // An highlighted block var foo = 'bar'; 如若我们需要对同类型引脚做相同的操作,则将其...
  • STM32F4-学习笔记(一)—利用指针访问寄存器 利用指针访问寄存器 具体包含以下4个步骤:1、...利用结构体指针访问寄存器组 定义结构体模板 struct GPIO { volatile unsigned int MODER; volatile unsigned int OTY
  • Integer寄存器类型

    2020-12-09 13:47:02
    msb和lsb是定义整数数界限的常量表达式,数组界限的定义是可选的。注意容许无位界限的情况。一个整数最少容纳32位。但是具体实现可提供更多的位。下面是整数说明的实例。integer A, B, C; //三个整数型寄存器。...
  • 调试寄存器和测试寄存器

    千次阅读 2010-09-26 20:47:00
     这些寄存器可以使系统程序设计人员定义4个断点,用它们可以规定指令执行和数据读写的任何组合。DR0~DR3是线性断点地址寄存器,其中保存着4个断点地址。DR5、DR6是两个备用的调试寄存器,目前尚未定义。DR6是...
  • MCS - 51单片机中,除了程序计数器PC和4组工作寄存器组外,其它所有的寄存器均为特殊功能寄存器(SPR),分散在片内RAM区的高128字节中,地址范围为80H~0FFH。SFR中有11个寄存器具有位寻址能力,它们的字节地址都能被8...
  • MCS - 51单片机中,除了程序计数器PC和4组工作寄存器组外,其它所有的寄存器均为特殊功能寄存器(SPR),分散在片内RAM区的高128字节中,地址范围为80H~0FFH。SFR中有11个寄存器具有位寻址能力,它们的字节地址都能被8...
  • 寄存器模仿 STM32 寄存器定义前言I.MX6U 寄存器定义1、编写外设结构体2、定义 IO 复用寄存器组的基地址3、定义访问指针官方 SDK 移植 模仿 STM32 寄存器定义 前言 T 官方为 STM32F103 编写了一个叫做 stm32f10x.h 的...
  • 在STM32中用到了Cortex-M3定义的三组寄存器,有关这三组寄存器的说明不在STM32的技术手册中,需要参考ARM公司发布的Cortex-M3 Technical Reference Manual (r2p0)。
  • STM32系列——Cortex-M3寄存器简介

    千次阅读 2020-02-28 10:29:55
    Cortex-M3系列处理器拥有通用寄存器...特殊功能寄存器有预定义的功能,而且必须通过专用的指令来访问。 通用目的寄存器R0-R7 R0-R7也称为低组寄存器。所有指令都能访问它们。它们的字长全是32位,复位后的初始值是不...
  • STM32库函数如何实现对寄存器的寻址

    千次阅读 2017-03-28 14:45:57
    在学习STM32库函数的时候,发现库函数中寄存器的寻址一般是这样: ...(1)定义外设结构体(寄存器组) typedef struct { __IO uint32_t MODER; /*!, Address offset: 0x00 */ __IO uint32_t OTYPER; /*!
  • 配置寄存器组(位于配置空间中)中会有一个或多个基址寄存器BAR(Base Address Register),用于保存指向PCI存储空间的指针,同时BAR中可读不可写的位数决定了该存储空间的大小。BAR的最低位是只读位,它定义了BAR的...
  • 寄存器中按位定义数据的方法存在于很多厂家设备的MODBUS数据协议中。区别于线圈状态(RW)和离散输入(RO),寄存器中通过定义组合位数据,更有利于高效传输状态信息和设置开关量。 由于位数据被定义寄存器中,其...
  • 功能:用于寄存一二值代码,N个触发器 组成的寄存器可以存储一N位的二值代码。 组成:由具有存储功能的触发器构成。另 外,寄存器还应有执行数据接收和清除命令的 控制电路,一般由门电路构成。 按接收数码的方式...
  • 它能保证资源的所有权,任务需要遵守一由操作环境定义的、由硬件维护的规则,在硬件级上授予监视和控制资源程序的特殊权限。受保护系统主动防止一个任务使用其他任务的资源。因此使用硬件主动监视系统比协调加强的...
  • 本文转自网上,如果原作看到的话请留言,我会把出处加上,谢谢! 在STM32中用到了Cortex-M3定义的三组寄存器,有关这三组寄存器的...在STM32的固件库中定义了三个结构体与这三个寄存器组相对应,这三个结构体与AR...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 882
精华内容 352
热门标签
关键字:

寄存器组定义