arm cortex m0 lpc1114寄存器配置
32位的單片機(jī)內(nèi)部各種數(shù)據(jù)寄存器和控制寄存器都是32位的,同理,8位單片機(jī)內(nèi)部的數(shù)據(jù)和控制寄存器都是8位的。
例如:
AT89C51單片機(jī)的“中斷控制寄存器”IE定義如下圖所示:
bit7bit6bit5bit4bit3bit2bit1bit0EA保留ET2ESET1EX1ET0EX0LPC1114的“AHB總線時(shí)鐘控制寄存器”SYSAHBCLKCTRL定義如下圖所示:
bit31bit30bit29bit28bit27bit26bit25bit24保留保留保留保留保留保留保留保留bit23bit22bit21bit20bit19bit18bit17bit16保留保留保留保留保留SSP1保留IOCONbit15bit14bit13bit12bit11bit10bit9bit8WDT保留ADCUARTSSP0CT32B1CT32B0CT16B1bit7bit6bit5bit4bit3bit2bit1bit0CT16B0GPIOI2CFLASH2FLASH1RAMROMSYS以上兩個(gè)控制寄存器,一個(gè)是8位的,一個(gè)是32位的,它們的相同之處都是每一位決定了一項(xiàng)任務(wù)。例如,給AT89C51單片機(jī)的IE寄存器的bit4寫1可以打開串口中斷,寫0可以關(guān)閉串口中斷。給LPC1114單片機(jī)的AHBCLKCTRL寄存器的bit6寫1表示打開GPIO的工作時(shí)鐘,寫0表示關(guān)閉GPIO的工作時(shí)鐘。
上面所講的IE寄存器,可以用IE=0x80開啟總中斷,也可以直接寫EA=1開啟總中斷。用EA=1來開啟的方式就是“位操作”?!拔徊僮鳌迸c直接寫寄存器值相比,直接寫寄存器將會改變整個(gè)寄存器的值,而“位操作”不會改變寄存器中的其它值。
LPC1114單片機(jī)的寄存器不支持“位操作”,為了使得操作某位的同時(shí),不影響其它位的值,我們需要運(yùn)用一下C語言的邏輯“或”“與”操作。
例如:
對SYSAHBCLKCTRL寄存器的bit6寫1:
LPC_SYSCON->SYSAHBCLKCTRL |= (1<<6);
對SYSAHBCLKCTRL寄存器的bit6寫0:
LPC_SYSCON->SYSAHBCLKCTRL &= ~(1<<6);
在頭文件lpc11xx.h中,各個(gè)寄存器是由各個(gè)模塊的結(jié)構(gòu)體定義的,所以我們要給某個(gè)寄存器寫值的時(shí)候,要用到給結(jié)構(gòu)體成員變量賦值符號“->”。上式中,SYSAHBCLKCTTL寄存器位于結(jié)構(gòu)體LPC_SYSCON,所以給寄存器賦值的時(shí)候,要這么寫。
1<<6就是1向左移6下的意思,即:
32位數(shù)1用二進(jìn)制表示00000000000000000000000000000001
32位數(shù)1左移6下以后為00000000000000000000000001000000
把這個(gè)左移好的數(shù)據(jù)與SYSAHBCLKCTRL中的值“或”一下,“或”的邏輯為0“或”任何數(shù)都是任何數(shù),1“或”任何數(shù)都是1,所以結(jié)果只把bit6置1.
同理,可以分析一下給bit6寫0的語句。都是C語言的基礎(chǔ)知識。請相信,高手并不是擁有了特殊的技能,而是掌握了扎實(shí)的基礎(chǔ)。
特別提示:上述兩條寫寄存器的語句,初看有些復(fù)雜,實(shí)則簡單至極!當(dāng)我們以后要給某個(gè)寄存器的某個(gè)位寫值的時(shí)候,例如,要給AA模塊的BB寄存器的bit n寫1,套用上式,即:
AA->BB |=(1< 同理,要給bit n寫0,即: AA->BB&=~(1< 親!恭喜你,你已經(jīng)學(xué)會一大半了。