前言
开发过程中遇到一个问题,需要单线的串口协议。平时使用串口一直都是基本的全双工模式。查看手册才知道原来USART还支持单线的半双工通信方式,做个记录查漏补缺。
1. USART的主要特性
USART的基本特性
主要的配置方式手册写的很清楚
- RX引脚需要被禁用,如GPIO的配置等
- TX引脚需要配置成开漏模式
- 其他所有配置和正常USART模式完全一样,所以如果在原有的USART代码中只需要禁用RX的GPIO配置,然后将USART_CR3中的 HDSEL位置1就可以完成配置了。
查看固件库中的usart.h
看看这个函数的定义正是进行了上述操作
2. 示例代码
GPIO_InitTypeDef m_gpio;
// USART1_TX_IO_CLK_EN();
// USART1_RX_IO_CLK_EN();
// RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA|RCC_AHBPeriph_GPIOB, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
m_gpio.GPIO_Mode = GPIO_Mode_AF;
m_gpio.GPIO_Mode = GPIO_Mode_OUT;
m_gpio.GPIO_OType = GPIO_OType_PP;
m_gpio.GPIO_Pin = GPIO_Pin_3;
m_gpio.GPIO_PuPd = GPIO_PuPd_UP;
m_gpio.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOA, &m_gpio);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_1);
//将原有的RX引脚的配置注释掉
// m_gpio.GPIO_Mode = GPIO_Mode_AF;
// m_gpio.GPIO_OType = GPIO_OType_PP;
// m_gpio.GPIO_Pin = GPIO_Pin_4;
// m_gpio.GPIO_PuPd = GPIO_PuPd_NOPULL;
// m_gpio.GPIO_Speed = GPIO_Speed_10MHz;
// GPIO_Init(GPIOB, &m_gpio);
// GPIO_PinAFConfig(GPIOB,GPIO_PinSource4,GPIO_AF_1);
USART_InitTypeDef m_usart;
USART_GPIO_Configurature(USART_OUT);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
m_usart.USART_BaudRate = baud;
m_usart.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
m_usart.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
m_usart.USART_Parity = USART_Parity_No;
m_usart.USART_StopBits = USART_StopBits_1;
m_usart.USART_WordLength = USART_WordLength_8b;
USART_Init(USART1, &m_usart);
USART_HalfDuplexCmd(USART1, ENABLE);//注意这个函数 配置半双工模式
USART_Cmd(USART1, ENABLE);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
USART_NVIC_Configurature();