[APM32F0] APM32F0xx串口单线半双工模式

[复制链接]
 楼主| Alden 发表于 2024-10-21 10:39 | 显示全部楼层 |阅读模式
#申请原创# #技术资源#
APM32F0xx系列微控制器是一款基于ARM Cortex-M0+内核的高性能单片机,广泛应用于物联网、工业控制和智能家居等领域。为了实现设备间的高效通信,APM32F0xx系列微控制器支持多种串口通信模式,其中包括单线半双工模式。
dc31090851438600b6edc47a79113ca.png
单线半双工通信:单线半双工通信是指在同一信号线上进行双向数据传输,但在同一时刻只能发送或接收数据。该模式通常用于节省布线成本和提高通信可靠性。单线半双工模式常见于RS-485、1-Wire等协议。


APM32F030的用户手册中有描述如何配置单线半双工模式:
149e8f2ef6ba2500d20e92506c798e1.png

而在代码中,APM32F030 SDK中已经有一份串口的配置,我们在哪个基础上进行修改:
  1. void APM_MINI_COMInit(COM_T COM)
  2. {
  3.     GPIO_Config_T gpioConfig;
  4.     USART_Config_T usartConfigStruct;
  5.     /* Enable GPIO clock */
  6.     RCM_EnableAHBPeriphClock(COM_TX_PORT_CLK[COM] | COM_RX_PORT_CLK[COM]);

  7.     /* Enable COM1 or COM2 clock */
  8.     if (COM == COM1)
  9.     {
  10.         RCM_EnableAPB2PeriphClock(COM_USART_CLK[COM]);
  11.     }
  12.     else
  13.     {
  14.         RCM_EnableAPB1PeriphClock(COM_USART_CLK[COM]);
  15.     }

  16.     /* Connect PXx to USARTx_Tx */
  17.     GPIO_ConfigPinAF(COM_TX_PORT[COM], COM_TX_PIN_SOURCE[COM], COM_TX_AF[COM]);

  18.     /* Connect PXx to USARTx_Rx */
  19.   //  GPIO_ConfigPinAF(COM_RX_PORT[COM], COM_RX_PIN_SOURCE[COM], COM_RX_AF[COM]);

  20.     /* Configure USART Tx as alternate function push-pull */
  21.     gpioConfig.mode = GPIO_MODE_AF;
  22.     gpioConfig.pin = COM_TX_PIN[COM];
  23.     gpioConfig.speed = GPIO_SPEED_50MHz;
  24.     gpioConfig.outtype = GPIO_OUT_TYPE_OD;
  25.     gpioConfig.pupd = GPIO_PUPD_NO;
  26.     GPIO_Config(COM_TX_PORT[COM], &gpioConfig);

  27.     /* Configure USART Rx as input floating */
  28. //    gpioConfig.pin = COM_RX_PIN[COM];
  29. //    GPIO_Config(COM_RX_PORT[COM], &gpioConfig);

  30.     /* MINI_USARTs configured as follow:
  31.     - BaudRate = 115200 baud
  32.     - Word Length = 8 Bits
  33.     - One Stop Bit
  34.     - No parity
  35.     - Hardware flow control disabled (RTS and CTS signals)
  36.     - Receive and transmit enabled
  37.     */

  38.     usartConfigStruct.baudRate = 115200;
  39.     usartConfigStruct.mode     = USART_MODE_TX_RX;
  40.     usartConfigStruct.hardwareFlowCtrl = USART_FLOW_CTRL_NONE;
  41.     usartConfigStruct.parity   = USART_PARITY_NONE;
  42.     usartConfigStruct.stopBits =  USART_STOP_BIT_1;
  43.     usartConfigStruct.wordLength = USART_WORD_LEN_8B;
  44.     USART_Config(COM_USART[COM], &usartConfigStruct);
  45.                
  46.                 USART_EnableHalfDuplex(COM_USART[COM]);
  47.     /* Enable USART_Interrupt_RXBNEIE */
  48.     USART_EnableInterrupt(COM_USART[COM], USART_INT_RXBNEIE);

  49.     if (COM_USART[COM] == USART1)
  50.     {
  51.         NVIC_EnableIRQRequest(USART1_IRQn, 2);
  52.     }
  53.     else if (COM_USART[COM] == USART2)
  54.     {
  55.         NVIC_EnableIRQRequest(USART2_IRQn, 3);
  56.     }

  57.     /* Enable USART */
  58.     USART_Enable(COM_USART[COM]);
  59. }
主要注意单线半双工通讯TX引脚要哦配置成开漏输出,要靠外部上拉来输出高电平.
RX引脚会在内部连在TX引脚,不用外部接线。

初始化配置后,串口就能正常使用了,但需注意软件做好收发的互斥配置,防止数据冲突。
我们可以通过USART的控制寄存器来控制串口的收发使能。
38023ac67276eab70a8cc61a85324c4.png
库函数没有单独控制这两个位的函数我们可以自己进行定义。
  1. void EnableRX(USART_T* usart)
  2. {
  3.         usart->CTRL1_B.TXEN = BIT_RESET;
  4.         usart->CTRL1_B.RXEN = BIT_SET;
  5. }
  6. void EnableTX(USART_T* usart)
  7. {
  8.         usart->CTRL1_B.TXEN = BIT_SET;
  9.         usart->CTRL1_B.RXEN = BIT_RESET;
  10. }
需要发送时调用
  1. EnableTX(USART1);
  2. printf("\n APM32F030 USART demo!!!\n");
  3. while((USART_ReadStatusFlag(USART1, USART_FLAG_TXC) == RESET));
  4. EnableRX(USART1);
需注意切到接受时需要读下发送完成标志位,确保没有数据冲突再切换到接收。
切到接收模式后的处理与正常串口配置相同。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

49

主题

113

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部

49

主题

113

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部