MINI2440只接了UART0出来所以这里选择UART0做实验。参照数据手册我们要设置的寄存器值如下:
ULCON0线性控制寄存器,ULCON0=0x03 ,8个数据位一个停止位无校验。
UCON0控制寄存器,UCON0=0x245, (看vivi是这样设的,2410完全开发流程直接设成0x05)。
UFCON0 FIFO控制寄存器,UFCON0 =0x0,禁止FIFO。
UMCON0 MODEM控制寄存器 ,UMCON0 = 0x0 ,不使用MODEM。
UBRDIV0 波特率除数寄存器,
UBRDIV0 = (INT)(PCLK/(BUADRATE*16)) - 1 =(INT)51000000/(115200*16) - 1 = 28 - 1 =27
注意数据手册有句话:round to the nearest whole number 所以取28-1=27
所以UBRDIV0 =27。
UTRSTAT0接收发送状态寄存器:
发送数据:bit【2】:无数据发送时自动设为1。当我们发送数据时先读此位一判断是否有数据正在占用发送口。bit【1】:发送FIFO是否为空,不使用。bit【0】:接收缓冲区是否有数据,若有,此位设为1,本实验要不断查询此位以判断是否有数据已经被接收。
引脚设置:GPH2-3对应TDX0 RX0 设置 GPHCON |=(10<<4) | (10<<6).GPHUP
uart.c代码如下:
#define rULCON0 (*(volatile unsigned *)0x50000000) //UART 0 Line control #define rUCON0 (*(volatile unsigned *)0x50000004) //UART 0 Control #define rUFCON0 (*(volatile unsigned *)0x50000008) //UART 0 FIFO control #define rUMCON0 (*(volatile unsigned *)0x5000000c) //UART 0 Modem control #define rUTRSTAT0 (*(volatile unsigned *)0x50000010) //UART 0 Tx/Rx status #define rUBRDIV0 (*(volatile unsigned *)0x50000028) //UART 0 Baud rate divisor #define rUTXH0 (*(volatile unsigned char *)0x50000020) //UART 0 Transmission Hold #define rURXH0 (*(volatile unsigned char *)0x50000024) //UART 0 Receive buffer #define rGPHCON (*(volatile unsigned char *)0x56000070) #define rGPHUP (*(volatile unsigned char *)0x56000078)
void uart_init(void) { rGPHCON |=(10<<4)|(10<<6); rGPHUP = 0x00; rULCON0 = 0x03 ; rUCON0 = 0x245; rUFCON0 = 0x00; rUMCON0 = 0x00; rUBRDIV0=27; }
void putc(unsigned char c) { while(!(rUTRSTAT0&(1<<2))); rUTXH0=c; }
unsigned char getc(void) { while(!(rUTRSTAT0&(1<<0))); return rURXH0; }
void putstr(char *str) { while (*str) { putc(*str++); } }
int main() { uart_init(); putstr("test uart\r\n"); putstr("test uart\r\n"); putstr("test uart\r\n"); while(1) { char c; c=getc(); putc(c); }
return 0; }
|
head.s的代码和clock的一样。编译下载到开发板上运行成功。从串口输出信息来看整个系统是不断的重启。这是因为在head.s中没有把看门狗关掉。添加如下代码:
@关闭看门狗 mov r0, #0x53000000 mov r1, #0x0 str r1, [r0]
|
编译运行OK。
阅读(462) | 评论(0) | 转发(0) |