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