嵌入式实验: TINY4412 UART 程序设计
嵌入式实验: TINY4412 UART 程序设计
一、实验目的
熟悉UART通信相关的寄存器的功能和设置方法,设置引脚复用,选择UART接收和发送对应的引脚用于UART通信,数据流格式设置,设置UART通信的数据帧格式,波特率等,设置UART部件的工作模式等。
二、设计要求
实现用串口助手给开发板发送一个数字,开发板接收这个数字并加一后回送,并在此基础上实现主机发送不同的数字控制开发板上的LED亮灭。
三、实验原理
电路原理如图所示:
通过SP3232的TXD0 RXD0引脚实现TTL3.3V电平转换,3.3V转变为1.8V电平和CPU通信。SPS3232起到变压器的作用。
PC一端和Tinny4412要设置相同的串口配置,如:波特率115200bit/s,停止位为1,数据位宽8位,无奇偶校验
四、实验结果
用串口调试助手给开发板发送1时,开发板接收到数据并回送2且显示在串口调试助手的接收缓冲区中,此时点亮开发板上的全部LED灯。用串口调试助手给开发板发送0时,开发板接收到数据并回送1且显示在串口调试助手的接收缓冲区中,此时开发板上的全部LED灯被熄灭。
五、结果分析
设置UART0对应的GPIO位UART功能
设置MPLL 输出800MHz。
在数据手册中可以依次找到这些寄存器并对这些寄存器进行设置,配置UART1的属性波特率,停止位,校验位等。详情见实验源代码
在主函数中
用rec变量接收一个字符,若字符为1则点亮LED灯,若为0则熄灭LED灯,自增后返回。
六、附录:实验源代码
1 #define GPA0CON (*(volatile unsigned int *) 0x11400000) //GPIO
3 #define MPLL_CON0 (*(volatile unsigned int *) 0x10040108)
4 #define CLK_SRC_DMC (*(volatile unsigned int *) 0x10040200)
5 #define CLK_SRC_TOP1 (*(volatile unsigned int *) 0x1003C214)
7 #define CLK_SRC_PERIL0 (*(volatile unsigned int *) 0x1003C250)
8 #define CLK_DIV_PERIL0 (*(volatile unsigned int *) 0x1003C550)
11 #define UFCON0 (*(volatile unsigned int *) 0x13800008)
12 #define ULCON0 (*(volatile unsigned int *) 0x13800000) //设置数据帧格式
13 #define UCON0 (*(volatile unsigned int *) 0x13800004)
14 #define UBRDIV0 (*(volatile unsigned int *) 0x13800028) //设置波特率(整数)
15 #define UFRACVAL0 (*(volatile unsigned int *) 0x1380002C) //设置波特率(小数)
16 #define UTXH0 (*(volatile unsigned int *) 0x13800020) //发送的数据
17 #define URXH0 (*(volatile unsigned int *) 0x13800024) //接收的数据
19 #define UTRSTAT0 (*(volatile unsigned int *) 0x13800010) //状态寄存器 位0判断20 是否收到数据,位1判断发送缓冲区是否允许发送数据
21
22 #define GPM4CON (*(volatile unsigned long *) 0x110002E0)
23 #define GPM4DAT (*(volatile unsigned long *) 0x110002E4)
24
25 void UartInit()
26 {
27 unsigned long tmp=0;
28 tmp=GPA0CON;
29 tmp &=~(0xff);
30 tmp |=0x22;
31 GPA0CON=tmp;
32
33
34 MPLL_CON0=(1<<31 | 0X64<<16 | 0X3<<8 | 0X0);
35 //设置MPLL 输出800MHz
36 CLK_SRC_DMC = 0X00011000;
37 //bit[12]即MUX_MPLL_SEL=1,SCLKMPLLL使用MPLL的输出
38 CLK_SRC_TOP1 = 0X01111000;
//bit[12] 即MUX_MPLL_USER_SEL_T=1,MUXMPLL使用SCLXMPLLL
39 CLK_SRC_PERIL0 =((0<<24) | (0<<20) | (6<<16) | (6<<12) | (6<<8) | (6));
40 CLK_DIV_PERIL0 =((7<<20) | (7<<16) | (7<<12) | (7<<8) | (7<<4) | (7));
41 /*设置串口0相关 设置FIFO中断触发阈值 使能FIFO*/
42 UFCON0=0X111;
43 //设置数据格式,8n1 即8个数据位,没有校验位,1个停止位*/
44 ULCON0=0X3;
45 /*工作于中断模式*/
46 UCON0=0X5;
47 /*SCLK_UART0=100MHz,波特率设置为115200,
寄存器的值如下计算:
DIV_VAL=1000000000/(115200*16)-1=53.25
UBRDIVn0=整数部分=53
UFRACVAL0 =小数部分 *16=0.25*16=4*/
48 UBRDIV0=53;
49 UFRACVAL0=4;
50
51 }
52
53
54 char getc_1(void)
55 {
56 char c;
57 while(!(UTRSTAT0 & (1<<0)));
58
59 c=URXH0;
60
61 return c;
62 }
63
64
65 void putc_1(char c)
66 {
67 while(!(UTRSTAT0 & (1<<2)));
68
69 UTXH0=c;
70
71 return;
72 }
73
74 void puts_1(char *s)
75 {
76 while(*s)
77 {
78 putc_1(*s);
79 s++;
80 }
81 }
82
83 int main(void)
84 {
85 char rec;
86 GPM4CON = 0x00001111;
87 GPM4DAT = 0XFF;
88 UartInit();
89
90 while(1)
91 {
92 rec = getc_1();
93
94 if(rec=='1')
95 {
96 GPM4DAT=0X00;
97 }
98 if(rec=='0')
99 {
100 GPM4DAT=0X0F;
101 }
102 rec++;
103 putc_1('\r');
104 putc_1('\n');
105 putc_1(rec);
106 }
107
108 return 0;
109 }