CH32V103串口RTS引脚控制不了,硬件软件驱动都有问题
  1. 请问有那位使用过CH32V103R8的串口2 RTS 引脚,想使用该引脚驱动485换向。按照例程的配置,硬件驱动下RTS引脚在发送时没有变化,一直都是低电平。有没有代码可以贴出参考参考。


  1. 使用软件驱动RTS引脚,必须要加个延时,否则未发送完成就RST就拉低了,是什么情况呢?

    2.1 代码:

    (usart2 配置)


    /******************************** define **********************/

  1. #define RTS_PIN_USART2  GPIO_Pin_1

  2. #define TX_PIN_USART2   GPIO_Pin_2

  3. #define RX_PIN_USART2   GPIO_Pin_3


  4. /*

  5.  * usart2 init

  6.  * PA1 -> RTS_USART2  接485DE脚 使用硬件流控

  7.  * PA2 -> TX_USART2

  8.  * PA3 -> RX_USART3

  9.  */

  10. void USART2_Init(uint32_t baudrate)

  11. {

  12.     GPIO_InitTypeDef  GPIO_InitStructure;

  13.     USART_InitTypeDef USART_InitStructure;


  14.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);

  15.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);


  16.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;


  17.     /* RTS config*/

  18.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

  19.     GPIO_InitStructure.GPIO_Pin = RTS_PIN_USART2;

  20.     GPIO_Init(GPIOA, &GPIO_InitStructure);


  21.     /* TX config*/

  22.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

  23.     GPIO_InitStructure.GPIO_Pin = TX_PIN_USART2;

  24.     GPIO_Init(GPIOA, &GPIO_InitStructure);


  25.     /* RX config*/

  26.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

  27.     GPIO_InitStructure.GPIO_Pin = RX_PIN_USART2;

  28.     GPIO_Init(GPIOA, &GPIO_InitStructure);


  29.     /* RTS pin set low */

  30.     GPIO_WriteBit(GPIOA,RTS_PIN_USART2,Bit_RESET);


  31.     USART_InitStructure.USART_BaudRate =                      baudrate;

  32.     USART_InitStructure.USART_WordLength =                  USART_WordLength_8b;

  33.     USART_InitStructure.USART_StopBits =                        USART_StopBits_1;

  34.     USART_InitStructure.USART_Parity =                            USART_Parity_No;

  35.     USART_InitStructure.USART_HardwareFlowControl =    USART_HardwareFlowControl_None;   //此处和none差不多 经测试硬件驱动RTS是不行的

  36.     USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;


  37.     USART_Init(USART2, &USART_InitStructure);

  38.     USART_Cmd(USART2, ENABLE);

  39. }


(usart2 485发送)

/*

 * RS485 发送数据 usart2

 * 说明:RTS引脚软件驱动

 */

  1. void RS485_Usart2_Senddata(uint8_t *ptr,int size)

  2. {

  3.     uint16_t cnt;


  4.     /* RTS pin set 1 */

  5.     GPIO_WriteBit(GPIOA,RTS_PIN_USART2,Bit_SET);


  6.     for(cnt = 0; cnt < size; cnt++)

  7.     {

  8.         while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);

  9.         USART_SendData(USART2, *ptr++);

  10.     }


  11.     /* ch32v103 一定要加 否则未发送完成就跳到下一句 */

  12.     Delay_Ms(2);


  13.     /* RTS pin set 0 */

  14.     GPIO_WriteBit(GPIOA,RTS_PIN_USART2,Bit_RESET);

  15. }


(usart2 485发送 测试)


  1. int main(void)

  2. {

  3.     char test[3] = "abc";


  4.     rt_kprintf(" SysClk: %dHz\r\n", SystemCoreClock);

  5.     /*空闲钩子*/

  6.     rt_thread_idle_sethook(idle_hook_handler);


  7.     for(;;)

  8.     {

  9.         /* 测试RTS流控 */

  10.         RS485_Usart2_Senddata( test, sizeof(test)/sizeof(char) );

  11.         rt_thread_mdelay(500);

  12.     }

  13. }


(usart2 485发送 不加延时)

1661404284727.png

您好,首先关于“使用软件驱动RTS引脚,必须要加个延时,否则未发送完成就RST就拉低了”的问题,应该是你的程序代码问题,可将你发送函数中的for循环发送函数修改一下,将while循环放在下面试一下,如下图

image.png

image.png

关于硬件驱动下RTS引脚没有变化,我这边使用EVT例程测试RTS引脚应该是没问题的,如下图

image.png

对于MCU来说:

RTS为输出信号,用于表示MCU串口是否准备好接收数据,若输出信号为低电平,则说明MCU串口可以接收数据,请求发送数据。当接收寄存器已满时,RTS将被设置为高电平



谢谢。对于RTS的功能是我理解有问题。最后问一下,我是从F030更换过来的,030是支持485 DE信号硬件驱动,接RTS引脚就好;所以32v103按我的理解是不支持此功能的?要实现只能软件驱动?


您好,是的


只有登录才能回复,可以选择微信账号登录