天天看點

各種總線協定彙總(三)- 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 異步串行通信

繼續閱讀