Exynos4412 Uart Controller

 
寄存器描述来自Exynos 4412 User's Manual
0
uart寄存器需要关注的点有:
1、如何设置帧格式?
2、如何设置uart接收和发送模式?
3、如何设置uart的波特率?
4、发送和接收都是哪些寄存器,如何查看是否发送完毕?
 
设置帧格式寄存器如下:
0
ULCONn寄存器:
bit[1:0]设置数据宽度,这里设置为b'11,表示8bits数据位
bit[2]设置停止位,这里设置为b'0,表示1bit停止位
bit[5:3]设置奇偶校验类型,不设置奇偶校验,就设置为0x0
bit[6]选择正常模式或红外模式,这里选择正常模式
则该寄存器设置为0x000111
 
设置uart接收和发送模式:
0
UCONn寄存器:
bit[1:0]设置接收模式,这里设置为0x01,表示轮询模式
bit[3:2]设置发送模式,这里设置为0x01,表示轮询模式
 
设置波特率:
0
0
UBRDIVn和UFRACVALn两个寄存器共同决定波特率大小,上图也有计算方法说明,计算如下:
wclk为100M,则DIV_VAL= 100000000/(112500 x 16) - 1 = 53.25
0.25 x 16 = 4
则:UBRDIVn设置为53,UFRACVALn设置为4
 
发送寄存器和接受寄存器:
0
 
状态寄存器UTRSTATn:
0
UTRSTATn寄存器:
bit[0]表示接受数据buffer是否已准备好
bit[1]表示发送数据buffer是否为空
 
示例代码:
 1 #include "exynos_4412.h"
 2 
 3 
 4 /*串口控制器号初始化*/
 5 void UART_Init(void)
 6 {
 7     /*1.将GPA1_0和GPA1_1设置成UART2的接收和发送引脚 GPA1CON[7:0],设置引脚功能*/
 8     GPA1.CON = GPA1.CON & (~(0xFF << 0)) | (0x22 << 0);
 9 
10     /*2.设置UART2的帧格式 8位数据位 1位停止位 无校验 正常模式 ULCON2[6:0]*/
11     UART2.ULCON2 = UART2.ULCON2 & (~(0x7F << 0)) | (0x3 << 0);
12 
13     /*3.设置UART2的接收和发送模式为轮询模式 UCON2[3:0]*/
14     UART2.UCON2 = UART2.UCON2 & (~(0xF << 0)) | (0x5 << 0);
15 
16     /*4.设置UART2的波特率为115200 UBRDIV2/UFRACVAL2*/
17     UART2.UBRDIV2 = 53;
18     UART2.UFRACVAL2 = 4;
19 }
20 
21 /*对外发送一个字节数据*/
22 void UART_Send_Byte(char Dat)
23 {
24     /*等待发送寄存器为空,即上一个数据已经发送完成 UTRSTAT2[1]*/
25     while(!(UART2.UTRSTAT2 & (1 << 1)));
26 
27     /*将要发送的数据写入发送寄存器 UTXH2*/
28     UART2.UTXH2 = Dat;
29 }
30 
31 /*接受外部发来的数据*/
32 char UART_Rec_Byte(void)
33 {
34     char Dat = 0;
35 
36     /*判断接收寄存器是否接收到了数据 UTRSTAT2[0]*/
37     if(UART2.UTRSTAT2 & 1) { 
38 
39         /*从接收寄存器读取接收到的数据 URXH2*/
40         Dat = UART2.URXH2;
41         return Dat;
42 
43     } else {
44         return 0;
45     }
46 
47 }
48 
49 void UART_Send_Str(char *pstr) {
50     while(* pstr != '\0') {
51         UART_Send_Byte(*pstr++);
52     }
53 } 
54 
55 int main()
56 {
57     char RecDat = 0;
58 
59     UART_Init();
60 
61     while(1)
62     {
63         RecDat = UART_Rec_Byte();
64         if(RecDat == 0) {
65         }
66  else {
67             RecDat = RecDat + 1;
68             UART_Send_Byte(RecDat);
69         }
70 
71 
72         /*通过串口输出字符串*/
73         UART_Send_Str("Hello world!");
74 
75 
76 
77     }
78     return 0;
79 }
posted @ 2024-03-17 15:55  lethe1203  阅读(19)  评论(0编辑  收藏  举报