天天看点

各种总线协议汇总(三)- UART

三、UART(Universal Asynchronous Receiver/Transmitter)

文章目录

      • 三、UART(Universal Asynchronous Receiver/Transmitter)
        • (一)、UART接口
        • (二)、UART结构原理
          • 1、数据帧
          • 2、接收器
          • 3、发送器
          • 4、应用
        • (三)、UART总线设置程序
UART是通用异步收发器(异步串行通信口)的英文缩写,它包括了RS232、RS449、RS423、RS422和RS485等接口标准规范和总线标准规范,即UART是异步串行通信口的总称。

(一)、UART接口

TX(transmit):发送数据接口

RX(receive):接收数据接口

通信时数据接口要交叉连接 :  TX1->RX2   RX1->TX2

和SPI相比,UART需要收发方都有准确的波特率(时钟源)。

(二)、UART结构原理

1、数据帧
各种总线协议汇总(三)- UART

idle status:high (确保线路没损坏)–>

start bit:low –>

data size:8 bits(通常先传最低位数据bit,可选奇偶检验bit) –>

stop bit:high

2、接收器
接收器在每个时钟脉冲时测试接收到的信号状态是否为开始比特。如果开始比特的低电平持续传输1个比特所需时间的一半以上,则认为开始了一个数据帧的传输;否则,则认为是毛刺脉冲并忽略。到了下一个比特时间后,线路状态被采样并送入移位寄存器。
3、发送器
UART把一个字符放入移位寄存器,就开始产生一个数据帧。对于全双工通信,发送与接受使用不同的移位寄存器。使用更大的FIFO使得主机处理器或DMA放置多个字节后由UART自主完成传输。
4、应用

接收与发送的UART必须达成数据帧协议。如果接收方发现这方面错误,会向主机报告"framing error"标志。

典型的连接moderm的串口,使用8个比特表示一个字节,没有奇偶校验位,1个停止位。比特率除以10就是发送ASCII字符的传输速率。

超低成本的嵌入式系统没有UART而是用处理器来实现异步串行通信。

(三)、UART总线设置程序

  //如果要用USART实现发送并回传的话就定义NVIC(Nested Vectored Interrupt Controller)
  /*initialize NVIC*/
   static void NVIC_Config(void){
	NVIC_InitTypeDef NVIC_InitStructure;
	
	/*嵌套中断向量控制组的选择*/
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	/*配置USART为中断源*/
	NVIC_InitStructure.NVIC_IRQChannel = 	USART1_IRQn ;
	/*抢占优先级为1*/
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	/*子优先级为1*/
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
	/*使能中断*/
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	/*initializatio*/
	NVIC_Init(&NVIC_InitStructure);
}

  /*initialize USART*/
   void USART_Config(void){
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	
	//打开串口GPIO和USART的时钟和功能复用 IO 时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE);
	
	//将USART Tx的GPIO配置为推挽复用模式
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	//将USART Rx的GPIO配置
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	/*配置串口的工作参数*/
	//配置波特率
	USART_InitStructure.USART_BaudRate = 115200;
	//配置帧数据字长
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	//配置停止位
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	//配置校验位
	USART_InitStructure.USART_Parity = USART_Parity_No;
	//配置硬件流控制
	USART_InitStructure.USART_HardwareFlowControl =USART_HardwareFlowControl_None;
	//配置工作模式,收发
	USART_InitStructure.USART_Mode =  USART_Mode_Rx|USART_Mode_Tx;
	//完成串口的初始化配置
	USART_Init(USART1,&USART_InitStructure);
	//串口中断优先级配置
	NVIC_Config();
	//使能串口接收中断
	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
	//使能串口
	USART_Cmd(USART1,ENABLE);
}

// 使用的时候需要包含stdio.h 然后用printf
// 重定向c库函数printf到USART1
int fputc(int ch, FILE *f)
{
                /* 发送一个字节数据到USART1 */
                USART_SendData(USART1, (uint8_t) ch);
                /* 等待发送完毕 */
                while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);         
                return (ch);
}

//接收中断
 void USART1_IRQHandler(void){
	 uint8_t ucTempt;
	 if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET){
     //接收寄存器满了以后 发送数据给缓冲区再将数据发送出去
		 ucTempt = USART_ReceiveData(USART1);
		 USART_SendData(USART1,ucTempt);
	 }
 }
           

参考资料:

Wikipedia UART

Wikipedia 异步串行通信

继续阅读