网站的安全建设或者解决方案,北京seo费用是多少,旅游网站框架, 上色软件免费直播间目录 1 UART帧格式详解
1.1 UART简介
1.2 通信基础 - 并行和串行
1.3 通信基础 - 单工和双工
1.4 通信基础 - 波特率
1.5 UART帧格式
2 Exynos4412下的UART控制器
2.1 引脚功能设置
2.2 阅读芯片手册
3 UART寄存器详解
3.1 引脚寄存器
3.2 串口寄存器概览
3.3 ULC…目录 1 UART帧格式详解
1.1 UART简介
1.2 通信基础 - 并行和串行
1.3 通信基础 - 单工和双工
1.4 通信基础 - 波特率
1.5 UART帧格式
2 Exynos4412下的UART控制器
2.1 引脚功能设置
2.2 阅读芯片手册
3 UART寄存器详解
3.1 引脚寄存器
3.2 串口寄存器概览
3.3 ULCONn帧格式
编辑 3.4 UCONn控制寄存器串口模式轮询、中断、DMA
3.5 状态寄存器
3.6 接收数据发送数据的寄存器
3.7 设置波特率
4 UART编程
4.1 interface.c实验代码
4.2 printf重定向
4.3 练习 1 UART帧格式详解
1.1 UART简介
Universal Asynchronous Receiver Transmitter 即 通用异步收发器是一种通用的串行、异步通信总线 该总线有两条数据线可以实现全双工的发送和接收 在嵌入式系统中常用于主机与辅助设备之间的通信
1.2 通信基础 - 并行和串行
并行通讯多个数据线一起发送 串行通信一个个字节发送 1.3 通信基础 - 单工和双工 半双工要不能同时发送和接收全双工可以同时发送和接收。
1.4 通信基础 - 波特率
波特率用于描述UART通信时的通信速度其单位为bps(bit per second)即每秒钟传送的bit的数量
1.5 UART帧格式 串口协议中规定先发低位再发高位
例数据0x55 二进制01010101-发送顺序10101010
校验位很少使用多发了一位数据会使得通讯速度变慢
如果发送多个字节重复上面的动作必须一个一个字节发送附带停止位和起始位否则发送0xFF这种数据全是高电平无法得知是发送了还是没发送。
串口发送的速率是根据自身的时钟速率掐时间计算。如A主机发送速率1s1个但是接收方可能接收的数据对于A来说是0.9S1个时间一长数据会乱。所以一般规定每次最多发8位之后重新获取起始位避免误差增大。 2 Exynos4412下的UART控制器 一般情况下处理器中都会集成UART控制器 我们使用UART进行通信时候只需对其内部的相 关寄存器进行设置即可
2.1 引脚功能设置
查看扩展板原理图 SP3232EEA芯片的作用是把串口发出来的TTL信号转换成232信号增加了串口的通讯距离
查看核心板原理图 2.2 阅读芯片手册
芯片手册4412一共包含了5个串口通道包含一个可以与GPS通讯的Ch4。串口控制器的时钟是100Mhz支持DMA串口中断每个串口包含FIFO。 功能框图 总线是CPU与串口芯片相连发送、接收及访问控制单元。
红外GPS暂不详细介绍
3 UART寄存器详解
3.1 引脚寄存器 3.2 串口寄存器概览
5个串口寄存器内部是一样的使用串口2基地址0x1382_0000 3.3 ULCONn帧格式 3.4 UCONn控制寄存器串口模式轮询、中断、DMA 接收串口数据一般有3种方式
1.轮询定期CPU去访问FIFO
2.中断有数据来了通知CPU去读取
3.DMA有数据来了直接由DMA搬到内存中不需要CPU去干涉
3.5 状态寄存器
状态寄存器中一般为只读寄存器可用于判断串口接收发送的状态 3.6 接收数据发送数据的寄存器 3.7 设置波特率 波特率公式案例用的时钟频率是40Mhz我们开发板的串口时钟寄存器是100Mhz UBRDIVn 20整数部分
UFRACVAL 0.7小数部分*16 ≈ 11四舍五入因为串口按位发送会校准所以可以忽略
4 UART编程 引脚寄存器 帧格式 接收和发送模式为轮询 100000000/115200 *16)-1 ≈ 53.25
UBDIV2 取整 53
UFRAVVAL2 0.25 * 16 4
4.1 interface.c实验代码 #include exynos_4412.hvoid UART_Init(void)
{/*1.将GPA1_0和GPA1_1设置成UART2的接收和发送引脚 GPA1CON[7:0]*/GPA1.CON GPA1.CON (~(0xFF 0)) | (0x22 0);/*2.设置UART2的帧格式 8位数据位 1位停止位 无校验 正常模式 ULCON2[6:0]*/UART2.ULCON2 UART2.ULCON2 (~(0x7F 0)) | (0x3 0);/*3.设置UART2的接收和发送模式为轮询模式 UCON2[3:0]*/UART2.UCON2 UART2.UCON2 (~(0xF 0)) | (0x5 0);/*4.设置UART2的波特率为115200 UBRDIV2/UFRACVAL2*/UART2.UBRDIV2 53;UART2.UFRACVAL2 4;
}void UART_Send_Byte(char Dat)
{/*等待发送寄存器为空即上一个数据已经发送完成 UTRSTAT2[1]*/while(!(UART2.UTRSTAT2 (1 1)));/*将要发送的数据写入发送寄存器 UTXH2*/UART2.UTXH2 Dat;
}char UART_Rec_Byte(void)
{char Dat 0;/*判断接收寄存器是否接收到了数据 UTRSTAT2[0]*/if(UART2.UTRSTAT2 1){/*从接收寄存器中读取接收到的数据 URXH2*/Dat UART2.URXH2;return Dat;}else{return 0;}
}void UART_Send_Str(char * pstr)
{while(*pstr ! \0)UART_Send_Byte(*pstr);
}int main()
{char RecDat 0;UART_Init();while(1){RecDat UART_Rec_Byte();if(RecDat 0){}else{RecDat RecDat 1;UART_Send_Byte(RecDat);}UART_Send_Str(Hello World\n);//重定向的printfprintf(Hello World\n);}return 0;
}注
寄存器只能显示字符无法显示数字如果需要发送和接收数字要转换为对应的字符的ASCII码
如果CPU写入的速度过快超过串口发送器发送的速度会使得接收端的数据错乱。需要对发送状态寄存器进行判断后进行发送和接收。 4.2 printf重定向 printf的功能实现已经再src中实现了函数比较复杂不做详细介绍
printf调用了putsputs内部调用了putc我们修改了putc的程序实现了重定向
定向功能在uart.c中实现。 printf的区别
1来源:没有操作系统在printf.c中而有操作系统是调用的C库的区别
2输出定向不一样:重定向输出到串口输出到linux终端
4.3 练习
1.若使用UART协议发送一个字节的数据0x63画出信号线上的时序图 注8位数据位、无校验位、一位停止位
略 2.编程实现电脑远程控制LED状态 注在终端上输入‘2’LED2点亮再次输入‘2’LED2熄灭... ... #include exynos_4412.hvoid LED_Init(void)
{GPX2.CON GPX2.CON (~(0xF 28)) | (0x1 28); //LED2 GPX2_7 output//GPX1.CON GPX1.CON (~0xF) | 0x1; //LED3 GPX1_0 output//GPF3.CON GPF3.CON (~(0xF 16)) | (0x1 16); //LED4 GPF3_4 output//GPF3.CON GPF3.CON (~(0xF 20)) | (0x1 20); //LED5 GPF3_5 output
}void Led_on(int num){switch(num){case 2:GPX2.DAT GPX2.DAT | (1 7);case 3:GPX1.DAT GPX1.DAT | (1 0);case 4:GPF3.DAT GPF3.DAT | (1 4);case 5:GPF3.DAT GPF3.DAT | (1 5);default:break;}}void Led_off(int num){switch(num){case 2:GPX2.DAT GPX2.DAT ~(1 7);case 3:GPX1.DAT GPX1.DAT ~(1 0);case 4:GPF3.DAT GPF3.DAT ~(1 4);case 5:GPF3.DAT GPF3.DAT ~(1 5);default:break;}}void UART_Init(void)
{/*1.将GPA1_0和GPA1_1设置成UART2的接收和发送引脚 GPA1CON[7:0]*/GPA1.CON GPA1.CON (~(0xFF 0)) | (0x22 0);/*2.设置UART2的帧格式 8位数据位 1位停止位 无校验 正常模式 ULCON2[6:0]*/UART2.ULCON2 UART2.ULCON2 (~(0x7F 0)) | (0x3 0);/*3.设置UART2的接收和发送模式为轮询模式 UCON2[3:0]*/UART2.UCON2 UART2.UCON2 (~(0xF 0)) | (0x5 0);/*4.设置UART2的波特率为115200 UBRDIV2/UFRACVAL2*/UART2.UBRDIV2 53;UART2.UFRACVAL2 4;
}void UART_Send_Byte(char Dat)
{/*等待发送寄存器为空即上一个数据已经发送完成 UTRSTAT2[1]*/while(!(UART2.UTRSTAT2 (1 1)));/*将要发送的数据写入发送寄存器 UTXH2*/UART2.UTXH2 Dat;
}char UART_Rec_Byte(void)
{char Dat 0;/*判断接收寄存器是否接收到了数据 UTRSTAT2[0]*/if(UART2.UTRSTAT2 1){/*从接收寄存器中读取接收到的数据 URXH2*/Dat UART2.URXH2;return Dat;}else{return 0;}
}void UART_Send_Str(char * pstr)
{while(*pstr ! \0)UART_Send_Byte(*pstr);
}int main()
{char RecDat 0;int toggle 0;UART_Init();LED_Init();while(1){RecDat UART_Rec_Byte();if(RecDat 2){if(toggle 0){Led_on(2);toggle 1;}else{Led_off(2);toggle 0;}}/*UART_Send_Str(Hello World\n);*/}return 0;
}