uart初始化。
1 我们可以通过原理图可知道 串口的RXD,TXD 分别连接在OK6410 GPA0,GPA1 口上的。。所以首先设置GPIO 的输入输出状态:0010=UART RXD[0] 0010=UART TXD[0]
同时设置相应的上下拉电阻关系。
rGPACON = (rGPACON & ~(0xff<<0)) | (0x22<<0);
rGPAPUD = (rGPAPUD & ~(0xf<<0)) | (0x1<<0);
2 uart 初始化:
2.1、配置UART 0 通道行控制寄存器。ULCON0格式如下图所示
rULCON0=rULCON0&(0xFFFFFFFF)|(0<<6)|(0<<3)|(0<<2)|(3<<0); //普通操作模式 无校验 1位停止位 8位数据位
2.2 配置 UCON0寄存器。
rUCON0=rUCON0&(0xFFFFFFFF)|(0<<10)|(1<<9)|(1<<8)|(0<<7)|(0<<6)|(0<<5)|(0<<4)|(1<<2)|(1<<0);
·
2.3、配置UFCON0寄存器
rUFCON0=rUFCON0&(0xFFFFFFFF)|(0<<6)|(0<<4)|(0<<2)|(0<<1)|(0<<1);
2.4、配置 rUMCON0 寄存器
rUMCON0 = (0<<4)|(0<<0);
2.5、设置波特率 UBRDIV0,UDIVSLOT0 寄存器
因为上面 配置UCON0寄存器的时候选择 该模式 所以采用以下公式
DIV_VAL = (PCLK / (b/s × 16 ) ) –1
PCLK=66MHz =66000000Hz
DIV_VAL=66000000/(115200× 16)) - 1
=35.8-1
=34.8
UBRDIVn = 20 (DIV_VAL 的整数部分)
(UDIVSLOTn 中 1 的数量)/16 = 0.8
这时, (UDIVSLOTn 中 1 的数量) = 12
因此, UDIVSLOTn 为 16’b1101_1101_1101_1101 或者 16’b0111_0111_0111_0101 等。
Num of 1’s UDIVSLOTn Num of 1’s UDIVSLOTn
0 0x0000(0000_0000_0000_0000b) 8 0x5555(0101_0101_0101_0101b)
1 0x0080(0000_0000_0000_1000b) 9 0xD555(1101_0101_0101_0101b)
2 0x0808(0000_1000_0000_1000b) 10 0xD5D5(1101_0101_1101_0101b)
3 0x0888(0000_1000_1000_1000b) 11 0xDDD5(1101_1101_1101_0101b)
4 0x2222(0010_0010_0010_0010b) 12 0xDDDD(1101_1101_1101_1101b)
5 0x4924(0100_1001_0010_0100b) 13 0xDFDD(1101_1111_1101_1101b)
6 0x4A52(0100_1010_0101_0010b) 14 0xDFDF(1101_1111_1101_1111b)
7 0x54AA(0101_0100_1010_1010b) 15 0xFFDF(1111_1111_1101_1111b)
根据上述分析:
rUBRDIV0=34;
rUDIVSLOT0=0xDDDD;
3 uart 发送
主函数调用 Uart_Printf()函数实现打印功能
uart 发送的时候是通过判断FIFO缓冲器(UTRSTAT0 的第二位 )是否为空,如果为空则发送。 (这个是在 UFCON0 寄存器中第六位 设置的)
void Uart_SendByte(int data)
{
while(!(rUTRSTAT0&0x02));
WrUTXH0(data);
}
最终工程文件:http://pan.baidu.com/share/link?shareid=64455&uk=3037598361