打印
[APM32F0]

APM32F0xx串口单线半双工模式

[复制链接]
213|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Alden|  楼主 | 2024-10-21 10:39 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
#申请原创# #技术资源#
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);
需注意切到接受时需要读下发送完成标志位,确保没有数据冲突再切换到接收。
切到接收模式后的处理与正常串口配置相同。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

36

主题

83

帖子

1

粉丝