1:
关于用C语言操作寄存器的问题:
有一个例子写的不错:
s2440IOP->GPGCON &= ~(3 < < 8);
是对这个寄存器的bit[8]和bit[11]置零。s2440IOP->GPGCON |= (1 < < 8);是对这个寄存器的bit[8]置1。s2440IOP->GPGDAT |= (1 < < 4); 是对这个寄存器的bit[4]置1。以此类推,其实这是典型的先读后写操作,就是因为某些寄存器里我们有时候只需要改变某一位或某几位而不能动其他的位,所以才这样用。至于(1 < < 8) 和(1 < < 4)这样的写法一目了然,一眼就能看出来是在对第几位进行操作,纯粹是为了阅读方便。2: 贴一段自己操作串口寄存器的代码吧 好好学学 不难的
#define UART_BASE_ADRS (0x100000000)
#define UART_RHR *(volatile unsigned char*)(UART_BASE_ADRS+0)#define UART_THR *(volatile unsigned char*)(UART_BASE_ADRS+0)#define WRITE_REG(addr,ch)*(volatile unsigned char*)(addr) = ch#define READ_REG(addr,ch) ch=*(volatile unsigned char*)(addr)#define UART_LCR *(volatile unsigned char*)(UART_BASE_ADRS+3)#define CHAR_LEN_5 0x00#define CHAR_LEN_6 0x01#define CHAR_LEN_7 0x02#define CHAR_LEN_8 0x03#define LCR_STB 0x04#define ONE_STOP 0x00#define LCR_PEN 0x08#define PARITY_NONE 0x00#define LCR_EPS 0x10#define LCR_SP 0x20#define LCR_SBRK 0x40#define LCR_DLAB 0x80int main(){ UART_LCR = CHAR_LEN_8|ONE_STOP|PARITY_NONE; //对给定位进行赋值 XX_CRTL |= 1<<7; // 对第八位赋值为1 XX_CRTL &= ~(1<<7); // 对第八位清零 UART_LCR |= LCR_DLAB; UART_LCR &=~(LCR_DLAB);}