首页 > 其他分享 >UART

UART

时间:2024-09-03 22:51:57浏览次数:11  
标签:UART RX 奇偶校验 init 串口 GPIO

UART协议帧

  在 UART中,传输模式为数据包形式。数据包由起始位、数据帧、奇偶校验位和停止位组成。

  数据帧

起始位

  当不传输数据时, UART 数据传输线通常保持高电压电平。若要开始数据传输,发送UART 会将传输线从高电平拉到低电平并保持1 个时钟周期。当接收 UART 检测到高到低电压跃迁时,便开始以波特率对应的频率读取数据帧中的位。

  起始位

数据位

  数据帧包含所传输的实际数据。如果使用奇偶校验位,数据帧长度可以是5 位到 8 位。如果不使用奇偶校验位,数据帧长度可以是9 位。在大多数情况下,数据以最低有效位优先方式发送。

  数据位

奇偶校验位

  校验位可以配置成 1 位偶校验或 1 位奇校验或无校验位。接收UART 读取数据帧后,将统计数值为 1 的位,检查总数是偶数还是奇数。如果奇偶校验位为0 (偶数奇偶校验),则数据帧中的1或逻辑高位总计应为偶数。如果奇偶校验位为 1 (奇数奇偶校验),则数据帧中的1 或逻辑高位总计应为奇数。当奇偶校验位与数据匹配时,UART 认为传输未出错。但是,如果奇偶校验位为0 ,而总和为奇数,或者奇偶校验位为 1 ,而总和为偶数,则UART 认为数据帧中的位已改变

  校验位

停止位

  为了表示数据包结束,发送 UART 将数据传输线从低电压驱动到高电压并保持1到2位时间。

  停止位

串口工作过程

  1. 当串口信号处于空闲位时,不需要发送数据,串口一直处于高电平状态
  2. 当需要发送数据时,将串口电平拉低一位,此时串口处于起始位,表示需要发送数据
  3. 发送完8位数据后(可以选择无校验),接着有一位停止位将电平拉高表示发送结束,再留一个空闲位,空闲位过后发送下一个数据帧
  4. 所以串口发送数据的效率只有80%

串口配置 

 //在使用串口通信之前需要先配置串口,在使用串口同时也要使用引脚,所以也要配置端口工作模式,需要使用引脚时配置引脚工作模式永远排在第一位
//配置GPIO端口工作模式函数
void GPIO_Config(){
    GPIO_InitTypeDef init;
    init.Mode = GPIO_PullUp;
    init.Pin = GPIO_Pin_0 | GPIO_Pin_0;//我们使用的引脚是P30和P31
    GPIO_Inilize(GPIO_P3,&init);//我们使用的端口是第3组
}
//串口配置函数
void UART_Config(){
    COMx_InitDefine init;
    init.UART_Mode = UART_8bit_BRTx;//传输模式配置
    init.UART_BRT_Use = BRT_Timer1;//波特率发生器
    init.UART_BaudRate = 115200;//波特率配置
    init.UART_RxEnable = ENABLE;//允许接收
    init.Morecommunicate = DISABLE;//多机通讯允许, ENABLE,DISABLE
    init.BaudRateDouble = DISABLE;//波特率加倍
    UART_Configuration(UART1,&init);//这里的UART1是指支持UART协议的端口分组
    NVIC_UART1_Init(ENABLE,Priority_1);//配置UART1的中断使能,配置中断优先级
    UART1_SW(UART1_SW_P30_P31);//引脚切换配置
}
void main(){
    GPIO_Config();
    UART_Config();
    //打开全局中断开关
    EA = 1;
    TX1_write2buff(97);//MCU使用串口1发送97给PC,对应字符a
    while(1);
}
//现在已经配置好了串口,PC和单片机已经可以互相发送数据了,但是由于单片机不能像PC一样给用户一个直观的反馈所以我们需要通过串口通信将PC发送给单片机的数据发送回电脑,来验证能互相通信
//需要在while循环内加上以下代码
//单片机每个串口都有数据寄存器SBUF和存放数据的数组RX1_Buffer[128],当PC发送数据过来时,串口会用SBUF将数据移动到数组中,所以检验PC发送个单片机数据有没有成功,就看数组中有没有发送的数据即可
if(COM1.RX_Cnt > 0 && --COM1.RX_TimeOut == 0){
    //COM1.RX_Cnt是单片机中存放数据的数组的已经存放的长度标志,COM1.RX_TimeOut是一个计数功能,能够保证发送数据的连续性
    for(i = 0;i < COM1.RX_Cnt;i++){
        //遍历单片机中存放数据的数组,通过串口1发送回给PC
		TX1_write2buff(RX1_Buffer[i]);
	}
	COM1.RX_Cnt = 0;
    //取完数据之后将数组中长度标志置零,如果不置零,下次PC发送过来的数据就会继续往后存
}

多机通信

//PC1,PC2
void main(){
	int i = 0;
	GPIO_Config();
	UART_Config();
	EA = 1;
	while(1){
		if(COM1.RX_Cnt > 0 && --COM1.RX_TimeOut == 0){
			for(i = 0;i < COM1.RX_Cnt;i++){
				TX2_write2buff(RX1_Buffer[i]);
                //使用串口2将串口1的数组里面的数据拷贝到串口2的数组中
                TX1_write2buff(RX2_Buffer[i]);
                //同步输出串口1数组中的数据,可以随时打印对方PC发送给单片机的数据
			}
			COM1.RX_Cnt = 0;
		}
		delay_ms(20);
	}
}
void GPIO_Config(){
	GPIO_InitTypeDef init;
	init.Mode = GPIO_PullUp;
	init.Pin = GPIO_Pin_0 | GPIO_Pin_1;
	GPIO_Inilize(GPIO_P3,&init);
	GPIO_Inilize(GPIO_P1,&init);
}
void UART_Config(){
	COMx_InitDefine init; 
	init.UART_Mode = UART_8bit_BRTx;
	init.UART_BRT_Use = BRT_Timer1;
	init.UART_BaudRate = 115200;
	init.Morecommunicate = ENABLE;
	init.UART_RxEnable = ENABLE;
	init.BaudRateDouble = DISABLE;
	UART1_SW(UART1_SW_P30_P31);
	NVIC_UART1_Init(ENABLE,Priority_0);
	UART_Configuration(UART1,&init);
	init.UART_BRT_Use = BRT_Timer2;
	NVIC_UART2_Init(ENABLE,Priority_0);
	UART_Configuration(UART2,&init);
}

 

 

标签:UART,RX,奇偶校验,init,串口,GPIO
From: https://www.cnblogs.com/izxw/p/18393527

相关文章

  • 2分钟搞懂如何计算uart速率
    一、前言1960年代,DEC(DigitalEquipmentCorp)公司的GordonBell采用大约50个分离元件设计了一个电路板,发明了UART。时至今日,已经60多年,虽然在个人消费类电子产品中,UART已近乎绝迹;但在工业、科研、国防、航空/航天等领域,UART却无处不在。很多从事多年嵌入式开发的老铁居然还不会......
  • 《DNK210使用指南 -CanMV版 V1.0》第二十一章 machine.UART类实验
    第二十一章machine.UART类实验1)实验平台:正点原子DNK210开发板2)章节摘自【正点原子】DNK210使用指南-CanMV版V1.03)购买链接:https://detail.tmall.com/item.htm?&id=7828013987504)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/k210/ATK-DNK210.html......
  • 【STM32 Blue Pill编程】-UART数据发送与接收(DMA模式)
    UART数据发送与接收(DMA模式)文章目录UART数据发送与接收(DMA模式)1、DMA介绍2、STM32的UART端口3、硬件准备及接线4、UART配置5、代码实现在本文中,我们将展示如何使用STM32BluePillUART通过直接内存访问(DMA)来发送和接收数据。这一过程而无需涉及CPU。......
  • 【STM32 Blue Pill编程】-UART数据接收与发送(轮询模式)
    UART数据接收与发送(轮询模式)文章目录UART数据接收与发送(轮询模式)1、STM32的UART端口2、串口数据发送2.1硬件准备及接线2.2串口配置2.3串口数据发送实现3、串口数据接收4、printf函数重定向每当我们进行嵌入式系统应用程序开发时,我们都需要使用串......
  • FPGA第 7 篇,FPGA开发环境搭建,Altrea开发环境搭建,Quartus几个版本之间的区别,以Quartus/
    前言我们知道FPGA的应用领域非常广泛,包括但不限于以下,请看,而且未来应用前景也可以,几乎涵盖了所有涉及数字信号处理和技术实现的领域。上期我们介绍了FPGA的基础知识数字电路,请看,FPGA与数字电路https://blog.csdn.net/weixin_65793170/article/details/141363656?spm=10......
  • verilog-UART驱动流程
    目录1.理论介绍       2.verilog代码实现 1.理论介绍               UART(Universalasynchronousreceivers-transmitter,通用异步收发器)数据帧结构如下图,zynq7020-PL侧的时钟频率fclk一般设置为50MHz,假设串口波特率为115200bps,则一个1bit传输需......
  • Renesa Version Board开发RT-Thread 之UART驱动应用
    目录概述1硬件介绍2软件配置2.1RT-ThreadStudio配置参数 2.2FSP配置MCU3RT-Thread中UART的接口介绍3.1RT-ThreadUART简介3.2  RT-Thread下的UART接口4 UART的应用4.1应用功能实现 4.2源代码文件5测试程序下载地址:RenesaVersionBoard开发RT-Th......
  • 【RTT-Studio】详细使用教程十三:UART的DMA 接收及轮询发送
    文章目录一、简介二、RTT配置三、使用信号量接收四、使用消息队列接收五、测试验证一、简介  串口是指数据一位一位地顺序传送,其特点是通讯线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速......
  • Spring Boot整合Quartz框架
    说明:Quartz是一个定时器框架,可以实现定时任务,本文介绍如何在SpringBoot项目中整合Quartz框架,Quartz介绍参看下面这篇文章:【Quartz】Quartz定时任务框架创建Demo首先,创建一个SpringBoot项目,pom文件如下:<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://......
  • 利用Quartz实现复杂的任务调度
    原文地址:java-利用Quartz实现复杂的任务调度-宋小黑-SegmentFault思否  第一章:引言大家好,我是小黑,任务调度,简而言之,就是按照预定计划自动执行任务的过程。不管是数据库备份、报表生成还是发送定时邮件,它们都需要一个可靠的任务调度系统来保证按时完成。那么,为什么......