arm cortex m0 lpc1114寄存器配置

  • 学习5608次

32位的单片机内部各种数据寄存器和控制寄存器都是32位的,同理,8位单片机内部的数据和控制寄存器都是8位的。

 

例如:

AT89C51单片机的“中断控制寄存器”IE定义如下图所示:

bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
EA 保留 ET2 ES ET1 EX1 ET0 EX0

 

LPC1114的“AHB总线时钟控制寄存器”SYSAHBCLKCTRL定义如下图所示:

 

bit31 bit30 bit29 bit28 bit27 bit26 bit25 bit24
保留 保留 保留 保留 保留 保留 保留 保留
bit23 bit22 bit21 bit20 bit19 bit18 bit17 bit16
保留 保留 保留 保留 保留 SSP1 保留 IOCON
bit15 bit14 bit13 bit12 bit11 bit10 bit9 bit8
WDT 保留 ADC UART SSP0 CT32B1 CT32B0 CT16B1
bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
CT16B0 GPIO I2C FLASH2 FLASH1 RAM ROM SYS

 

以上两个控制寄存器,一个是8位的,一个是32位的,它们的相同之处都是每一位决定了一项任务。例如,给AT89C51单片机的IE寄存器的bit4写1可以打开串口中断,写0可以关闭串口中断。给LPC1114单片机的AHBCLKCTRL寄存器的bit6写1表示打开GPIO的工作时钟,写0表示关闭GPIO的工作时钟。

 

上面所讲的IE寄存器,可以用IE=0x80开启总中断,也可以直接写EA=1开启总中断。用EA=1来开启的方式就是“位操作”。“位操作”与直接写寄存器值相比,直接写寄存器将会改变整个寄存器的值,而“位操作”不会改变寄存器中的其它值。

LPC1114单片机的寄存器不支持“位操作”,为了使得操作某位的同时,不影响其它位的值,我们需要运用一下C语言的逻辑“或”“与”操作。

例如:

 

对SYSAHBCLKCTRL寄存器的bit6写1:

LPC_SYSCON->SYSAHBCLKCTRL |= (1<<6);

 

对SYSAHBCLKCTRL寄存器的bit6写0:

LPC_SYSCON->SYSAHBCLKCTRL &= ~(1<<6);

 

在头文件lpc11xx.h中,各个寄存器是由各个模块的结构体定义的,所以我们要给某个寄存器写值的时候,要用到给结构体成员变量赋值符号“->”。上式中,SYSAHBCLKCTTL寄存器位于结构体LPC_SYSCON,所以给寄存器赋值的时候,要这么写。

1<<6就是1向左移6下的意思,即:

32位数1用二进制表示00000000000000000000000000000001

32位数1左移6下以后为00000000000000000000000001000000

把这个左移好的数据与SYSAHBCLKCTRL中的值“或”一下,“或”的逻辑为0“或”任何数都是任何数,1“或”任何数都是1,所以结果只把bit6置1.

 

同理,可以分析一下给bit6写0的语句。都是C语言的基础知识。请相信,高手并不是拥有了特殊的技能,而是掌握了扎实的基础。

 

特别提示:上述两条写寄存器的语句,初看有些复杂,实则简单至极!当我们以后要给某个寄存器的某个位写值的时候,例如,要给AA模块的BB寄存器的bit n写1,套用上式,即:

AA->BB |=(1<<n);

同理,要给bit n写0,即:

AA->BB&=~(1<<n)

亲!恭喜你,你已经学会一大半了。

发表评论