嵌入式实验: TINY4412 UART 程序设计

嵌入式实验: TINY4412 UART 程序设计

一、实验目的

熟悉UART通信相关的寄存器的功能和设置方法,设置引脚复用,选择UART接收和发送对应的引脚用于UART通信,数据流格式设置,设置UART通信的数据帧格式,波特率等,设置UART部件的工作模式等。

二、设计要求

实现用串口助手给开发板发送一个数字,开发板接收这个数字并加一后回送,并在此基础上实现主机发送不同的数字控制开发板上的LED亮灭。

三、实验原理
电路原理如图所示:
嵌入式实验: TINY4412 UART 程序设计_第1张图片
嵌入式实验: TINY4412 UART 程序设计_第2张图片
嵌入式实验: TINY4412 UART 程序设计_第3张图片
通过SP3232的TXD0 RXD0引脚实现TTL3.3V电平转换,3.3V转变为1.8V电平和CPU通信。SPS3232起到变压器的作用。
PC一端和Tinny4412要设置相同的串口配置,如:波特率115200bit/s,停止位为1,数据位宽8位,无奇偶校验

四、实验结果

用串口调试助手给开发板发送1时,开发板接收到数据并回送2且显示在串口调试助手的接收缓冲区中,此时点亮开发板上的全部LED灯。用串口调试助手给开发板发送0时,开发板接收到数据并回送1且显示在串口调试助手的接收缓冲区中,此时开发板上的全部LED灯被熄灭。

五、结果分析
嵌入式实验: TINY4412 UART 程序设计_第4张图片
嵌入式实验: TINY4412 UART 程序设计_第5张图片
设置UART0对应的GPIO位UART功能
嵌入式实验: TINY4412 UART 程序设计_第6张图片
在这里插入图片描述
设置MPLL 输出800MHz。
在数据手册中可以依次找到这些寄存器并对这些寄存器进行设置,配置UART1的属性波特率,停止位,校验位等。详情见实验源代码
在主函数中
嵌入式实验: TINY4412 UART 程序设计_第7张图片
用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 }                                               

你可能感兴趣的:(嵌入式实验: TINY4412 UART 程序设计)