三、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、資料幀
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 異步串行通信