CH32V103串口RTS引腳控制不了,硬件軟件驅(qū)動(dòng)都有問題
  1. 請問有那位使用過CH32V103R8的串口2 RTS 引腳,想使用該引腳驅(qū)動(dòng)485換向。按照例程的配置,硬件驅(qū)動(dòng)下RTS引腳在發(fā)送時(shí)沒有變化,一直都是低電平。有沒有代碼可以貼出參考參考。


  1. 使用軟件驅(qū)動(dòng)RTS引腳,必須要加個(gè)延時(shí),否則未發(fā)送完成就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差不多 經(jīng)測試硬件驅(qū)動(dòng)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發(fā)送)

/*

?* RS485 發(fā)送數(shù)據(jù) usart2

?* 說明:RTS引腳軟件驅(qū)動(dòng)

?*/

  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 一定要加 否則未發(fā)送完成就跳到下一句 */

  12. ? ? Delay_Ms(2);


  13. ? ? /* RTS pin set 0 */

  14. ? ? GPIO_WriteBit(GPIOA,RTS_PIN_USART2,Bit_RESET);

  15. }


(usart2 485發(fā)送 測試)


  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發(fā)送 不加延時(shí))

1661404284727.png

您好,首先關(guān)于“使用軟件驅(qū)動(dòng)RTS引腳,必須要加個(gè)延時(shí),否則未發(fā)送完成就RST就拉低了”的問題,應(yīng)該是你的程序代碼問題,可將你發(fā)送函數(shù)中的for循環(huán)發(fā)送函數(shù)修改一下,將while循環(huán)放在下面試一下,如下圖

image.png

image.png

關(guān)于硬件驅(qū)動(dòng)下RTS引腳沒有變化,我這邊使用EVT例程測試RTS引腳應(yīng)該是沒問題的,如下圖

image.png

對于MCU來說:

RTS為輸出信號(hào),用于表示MCU串口是否準(zhǔn)備好接收數(shù)據(jù),若輸出信號(hào)為低電平,則說明MCU串口可以接收數(shù)據(jù),請求發(fā)送數(shù)據(jù)。當(dāng)接收寄存器已滿時(shí),RTS將被設(shè)置為高電平



謝謝。對于RTS的功能是我理解有問題。最后問一下,我是從F030更換過來的,030是支持485 DE信號(hào)硬件驅(qū)動(dòng),接RTS引腳就好;所以32v103按我的理解是不支持此功能的?要實(shí)現(xiàn)只能軟件驅(qū)動(dòng)?


您好,是的


只有登錄才能回復(fù),可以選擇微信賬號(hào)登錄

国产91精品新入口,国产成人综合网在线播放,九热这里只有精品,本道在线观看,美女视频a美女视频,韩国美女激情视频,日本美女pvp视频