一、杂谈寄存器

目录

1:寄存器

2:寄存器的地址

3:寄存器与结构体

4:寄存器调试

总结:


1:寄存器

     在写程序中最开始的代码时是“Hello world!”,而单片我们最常做的,

点亮LED。在下面C51程序的功能是点亮LED0。

#include "reg52.h"

sbit LED0 = P0^0;

int main(void)

{

    LED0 = 0;

    while(1);

    return 0;

}

        点亮LED0,将I/O引脚设置为低电平于是LED就亮了。这好像理所应当的,

但是我们需要注意的是我们在执行到while(1),一直执行while(1)循环,这时候我

们并没有继续对LED0 所对应的I/O口设置电平,它的电平一直保持在LED0 = 0

语句执行之后的状态。因此它不可能是单片执行程序不断赋值的结果,而是P0

寄存器对它进行了数据锁存,直到下一次单片机数据将它进行改变。

      是的,对数据锁存。这是寄存器的特性之一。

 

        仅仅是用来锁存数据,功能貌似非常的单调。似乎谁也不会无聊到整天往

寄存器中写数据,保持的它的状态,然后就不管了。但是在51单片机的中断后,

给我们打开了新的用法。寄存器与功能功能选择相结合,通过寄存器控制硬件

逻辑。以下是51单片机中IE寄存器的硬件逻辑控制。

 

2:寄存器的地址

    在下面的51单片机左侧图中,可以看到特殊寄存器的地址(80H -FFH),

细心的人可以发现间接寻址RAM地址居然也是(80H-FFH),它们两者的地址

居然是冲突的。虽然它们的地址是冲突的,但是它们的读写方式不一样。特殊

寄存器使用的直接寻址,而相同地址的RAM使用是间接寻址。通过指令的不

一样访问不一样的区域。右侧则是单片机各个特殊寄存器的地址

    讲了这么多目的只有一个,寄存器是地址的

          

     

3:寄存器与结构体

在前面提到中51单片机中,寄存器具有访问地址,而且控制对应的I/O口组

(P0,P1,P2,P3),只有一个寄存器。但随着社会科技的发展,目前单

片机从8位发展到32位,单片机的功能也越来越复杂,对于某一功能,可能

已经不是一个寄存器就进行满足。以下是STMF407的寄存器结构体,里面包

含的是一组I/O涉及的相关寄存器,并且按照寄存器地址进行排序。

typedef struct

{

  __IO uint32_t MODER;    /*!< GPIO port mode register,               Address offset: 0x00      */

  __IO uint32_t OTYPER;   /*!< GPIO port output type register,        Address offset: 0x04      */

  __IO uint32_t OSPEEDR;  /*!< GPIO port output speed register,       Address offset: 0x08      */

  __IO uint32_t PUPDR;    /*!< GPIO port pull-up/pull-down register,  Address offset: 0x0C      */

  __IO uint32_t IDR;      /*!< GPIO port input data register,         Address offset: 0x10      */

  __IO uint32_t ODR;      /*!< GPIO port output data register,        Address offset: 0x14      */

  __IO uint32_t BSRR;     /*!< GPIO port bit set/reset register,      Address offset: 0x18      */

  __IO uint32_t LCKR;     /*!< GPIO port configuration lock register, Address offset: 0x1C      */

  __IO uint32_t AFR[2];   /*!< GPIO alternate function registers,     Address offset: 0x20-0x24 */

} GPIO_TypeDef;

在使用之前需要先找到GPIO的基础地址,下面以GPIOA为例讲解:

       通过对片内外设地址的偏移,可以计算出GPIOA的基础地址(GPIOA_BASE),

然后通过结构体指针对GPIOA_BASE进行数据转换,使得在程序中可以通过

GPIOA->XXX的方式对相应的寄存器进行操作。

#define PERIPH_BASE           0x40000000UL /*!< Peripheral base address in the alias region                                */


#define AHB1PERIPH_BASE       (PERIPH_BASE + 0x00020000UL)

#define GPIOA_BASE            (AHB1PERIPH_BASE + 0x0000UL)


#define GPIOA               ((GPIO_TypeDef *) GPIOA_BASE)

 

4:寄存器调试

 

现在的单片机中为方便调试,快速的修改寄存器的里面的值,

改变单片机状态,往往厂家会开发调试寄存器的界面。

以下是ILI2511触摸IC寄存器调试界面

 

总结:

       1)寄存器具有数据锁存的功能,它往往跟硬件搭配使用从而可以控制硬件;

       2)寄存器是有地址的,可以通过寄存器地址控制它;

       3)为了方便控制寄存器,往往将寄存器组封装在结构体中,通过控制结构体控制寄存器;

      4)为了调试方便,芯片厂家往往会开发寄存器调试界面。

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

颖川初尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值