目录
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)为了调试方便,芯片厂家往往会开发寄存器调试界面。