#申请原创# #技术资源#
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);
需注意切到接受时需要读下发送完成标志位,确保没有数据冲突再切换到接收。
切到接收模式后的处理与正常串口配置相同。
|