#申请原创# #技术资源#
APM32F0xx系列微控制器是一款基于ARM Cortex-M0+内核的高性能单片机,广泛应用于物联网、工业控制和智能家居等领域。为了实现设备间的高效通信,APM32F0xx系列微控制器支持多种串口通信模式,其中包括单线半双工模式。
单线半双工通信:单线半双工通信是指在同一信号线上进行双向数据传输,但在同一时刻只能发送或接收数据。该模式通常用于节省布线成本和提高通信可靠性。单线半双工模式常见于RS-485、1-Wire等协议。
APM32F030的用户手册中有描述如何配置单线半双工模式:
而在代码中,APM32F030 SDK中已经有一份串口的配置,我们在哪个基础上进行修改:
void APM_MINI_COMInit(COM_T COM)
{
GPIO_Config_T gpioConfig;
USART_Config_T usartConfigStruct;
/* Enable GPIO clock */
RCM_EnableAHBPeriphClock(COM_TX_PORT_CLK[COM] | COM_RX_PORT_CLK[COM]);
/* Enable COM1 or COM2 clock */
if (COM == COM1)
{
RCM_EnableAPB2PeriphClock(COM_USART_CLK[COM]);
}
else
{
RCM_EnableAPB1PeriphClock(COM_USART_CLK[COM]);
}
/* Connect PXx to USARTx_Tx */
GPIO_ConfigPinAF(COM_TX_PORT[COM], COM_TX_PIN_SOURCE[COM], COM_TX_AF[COM]);
/* Connect PXx to USARTx_Rx */
// GPIO_ConfigPinAF(COM_RX_PORT[COM], COM_RX_PIN_SOURCE[COM], COM_RX_AF[COM]);
/* Configure USART Tx as alternate function push-pull */
gpioConfig.mode = GPIO_MODE_AF;
gpioConfig.pin = COM_TX_PIN[COM];
gpioConfig.speed = GPIO_SPEED_50MHz;
gpioConfig.outtype = GPIO_OUT_TYPE_OD;
gpioConfig.pupd = GPIO_PUPD_NO;
GPIO_Config(COM_TX_PORT[COM], &gpioConfig);
/* Configure USART Rx as input floating */
// gpioConfig.pin = COM_RX_PIN[COM];
// GPIO_Config(COM_RX_PORT[COM], &gpioConfig);
/* MINI_USARTs configured as follow:
- BaudRate = 115200 baud
- Word Length = 8 Bits
- One Stop Bit
- No parity
- Hardware flow control disabled (RTS and CTS signals)
- Receive and transmit enabled
*/
usartConfigStruct.baudRate = 115200;
usartConfigStruct.mode = USART_MODE_TX_RX;
usartConfigStruct.hardwareFlowCtrl = USART_FLOW_CTRL_NONE;
usartConfigStruct.parity = USART_PARITY_NONE;
usartConfigStruct.stopBits = USART_STOP_BIT_1;
usartConfigStruct.wordLength = USART_WORD_LEN_8B;
USART_Config(COM_USART[COM], &usartConfigStruct);
USART_EnableHalfDuplex(COM_USART[COM]);
/* Enable USART_Interrupt_RXBNEIE */
USART_EnableInterrupt(COM_USART[COM], USART_INT_RXBNEIE);
if (COM_USART[COM] == USART1)
{
NVIC_EnableIRQRequest(USART1_IRQn, 2);
}
else if (COM_USART[COM] == USART2)
{
NVIC_EnableIRQRequest(USART2_IRQn, 3);
}
/* Enable USART */
USART_Enable(COM_USART[COM]);
}
主要注意单线半双工通讯TX引脚要哦配置成开漏输出,要靠外部上拉来输出高电平.
RX引脚会在内部连在TX引脚,不用外部接线。
初始化配置后,串口就能正常使用了,但需注意软件做好收发的互斥配置,防止数据冲突。
我们可以通过USART的控制寄存器来控制串口的收发使能。
库函数没有单独控制这两个位的函数我们可以自己进行定义。
void EnableRX(USART_T* usart)
{
usart->CTRL1_B.TXEN = BIT_RESET;
usart->CTRL1_B.RXEN = BIT_SET;
}
void EnableTX(USART_T* usart)
{
usart->CTRL1_B.TXEN = BIT_SET;
usart->CTRL1_B.RXEN = BIT_RESET;
}
需要发送时调用
EnableTX(USART1);
printf("\n APM32F030 USART demo!!!\n");
while((USART_ReadStatusFlag(USART1, USART_FLAG_TXC) == RESET));
EnableRX(USART1);
需注意切到接受时需要读下发送完成标志位,确保没有数据冲突再切换到接收。
切到接收模式后的处理与正常串口配置相同。
|