三、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 异步串行通信