硬汉嵌入式论坛

 找回密码
 立即注册
查看: 464|回复: 2
收起左侧

[有问必答] GD32E230F4串口与RS485的相关配置问题

[复制链接]

1

主题

0

回帖

3

积分

新手上路

积分
3
发表于 2025-4-2 21:26:01 | 显示全部楼层 |阅读模式
最近在学习32系MCU编程,在学习中遇到了一些问题,就是gd32e230的rs485问题。
原本硬件上使用了一颗自动换向RS485PHY,就是RE和DE脚直接拉高就行了,现在新硬件换回了常规的需要控制方向的RS485 PHY,然后我看了固件库使用指南,发现有个rs485 driver的相关代码。但是串口一直没有数据发送
自动换向的代码:
  1. void rs485_config(void) {
  2.     rcu_periph_clock_enable(RS485_GPIO_RCU);
  3.     rcu_periph_clock_enable(RS485_RCU);

  4.     gpio_af_set(RS485_GPIO_PORT, GPIO_AF_1, RS485_TX_PIN | RS485_RX_PIN);

  5.     /* configure USART Tx&Rx as alternate function push-pull */
  6.     gpio_mode_set(RS485_GPIO_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP, RS485_TX_PIN | RS485_RX_PIN);
  7.     gpio_output_options_set(RS485_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, RS485_TX_PIN | RS485_RX_PIN);

  8.     /* configure RS485 EN Pin */
  9.     gpio_mode_set(RS485_GPIO_PORT, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, RS485_EN_PIN);
  10.     gpio_output_options_set(RS485_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, RS485_EN_PIN);
  11.     gpio_bit_write(RS485_GPIO_PORT, RS485_EN_PIN, RESET);

  12.     /* USART configure */
  13.     usart_deinit(RS485_PHY);
  14.     usart_baudrate_set(RS485_PHY, RS485_BAUDRATE);
  15.     usart_parity_config(RS485_PHY, USART_PM_NONE);
  16.     usart_word_length_set(RS485_PHY, USART_WL_8BIT);
  17.     usart_stop_bit_set(RS485_PHY, USART_STB_1BIT);
  18.     usart_receive_config(RS485_PHY, USART_RECEIVE_ENABLE);
  19.     usart_transmit_config(RS485_PHY, USART_TRANSMIT_ENABLE);

  20.     // usart_driver_assertime_config(RS485_PHY, 0x01);
  21.     // usart_driver_deassertime_config(RS485_PHY, 0x01);

  22.     // usart_depolarity_config(USART0, USART_DEP_HIGH);
  23.     // usart_depolarity_config(USART0, USART_DEP_LOW);

  24.     usart_enable(RS485_PHY);
  25.     // usart_rs485_driver_enable(RS485_PHY);

  26.     nvic_irq_enable(USART0_IRQn, 0);
  27.     usart_interrupt_enable(RS485_PHY, USART_INT_RBNE);
  28.     usart_interrupt_enable(RS485_PHY, USART_INT_IDLE);
  29. }
复制代码


然后尝试了使用usart_rs485_driver_enable(RS485_PHY);来使能rs485 driver,具体代码如下
  1. void rs485_config(void) {
  2.     rcu_periph_clock_enable(RS485_GPIO_RCU);
  3.     rcu_periph_clock_enable(RS485_RCU);

  4.     gpio_af_set(RS485_GPIO_PORT, GPIO_AF_1, RS485_TX_PIN | RS485_RX_PIN | RS485_EN_PIN);

  5.     /* configure USART Tx&Rx as alternate function push-pull */
  6.     gpio_mode_set(RS485_GPIO_PORT, GPIO_MODE_AF, GPIO_PUPD_PULLUP, RS485_TX_PIN | RS485_RX_PIN);
  7.     gpio_output_options_set(RS485_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ, RS485_TX_PIN | RS485_RX_PIN);

  8.     /* configure RS485 EN Pin */
  9.     gpio_mode_set(RS485_GPIO_PORT, GPIO_MODE_AF, GPIO_PUPD_NONE, RS485_EN_PIN);
  10.     gpio_output_options_set(RS485_GPIO_PORT, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, RS485_EN_PIN);
  11.     // gpio_bit_write(RS485_GPIO_PORT, RS485_EN_PIN, RESET);

  12.     /* USART configure */
  13.     usart_deinit(RS485_PHY);
  14.     usart_baudrate_set(RS485_PHY, RS485_BAUDRATE);
  15.     usart_parity_config(RS485_PHY, USART_PM_NONE);
  16.     usart_word_length_set(RS485_PHY, USART_WL_8BIT);
  17.     usart_stop_bit_set(RS485_PHY, USART_STB_1BIT);
  18.     usart_receive_config(RS485_PHY, USART_RECEIVE_ENABLE);
  19.     usart_transmit_config(RS485_PHY, USART_TRANSMIT_ENABLE);

  20.     usart_driver_assertime_config(RS485_PHY, 0x01);
  21.     usart_driver_deassertime_config(RS485_PHY, 0x01);

  22.     usart_depolarity_config(USART0, USART_DEP_HIGH);
  23.     // usart_depolarity_config(USART0, USART_DEP_LOW);

  24.     // usart_enable(RS485_PHY);
  25.     usart_rs485_driver_enable(RS485_PHY);

  26.     nvic_irq_enable(USART0_IRQn, 0);
  27.     usart_interrupt_enable(RS485_PHY, USART_INT_RBNE);
  28.     usart_interrupt_enable(RS485_PHY, USART_INT_IDLE);
  29. }
复制代码


让后串口没有一点输出,用示波器看了tx,什么都没有

还有,只要加入了usart_rs485_driver_enable(RS485_PHY);这一行就tx就没有输出,不管rs485 driver的配置相关的其他代码是否在,只要一开driver_enable就不行。

实在没理解哪里配置有问题,麻烦大佬们指点一二
回复

使用道具 举报

1

主题

0

回帖

3

积分

新手上路

积分
3
 楼主| 发表于 2025-4-3 01:03:24 | 显示全部楼层
已经解决,找到了问题所在,通过debug发现usart_enable寄存器没置位
其实如果详细观察也能发现

[C] 纯文本查看 复制代码
/*!
    \brief      enable RS485 driver
    \param[in]  usart_periph: USARTx(x=0,1)
    \param[out] none
    \retval     none
*/
void usart_rs485_driver_enable(uint32_t usart_periph)
{
    /* disable USART */
    USART_CTL0(usart_periph) &= ~(USART_CTL0_UEN);

    USART_CTL2(usart_periph) |= USART_CTL2_DEM;
}


这里usart_rs485_driver_enable函数里面第一句就是usart的使能寄存器复位,应该把
[C] 纯文本查看 复制代码
    usart_enable(RS485_PHY);
    usart_rs485_driver_enable(RS485_PHY);

这两句换一下顺序,就好了
[C] 纯文本查看 复制代码
usart_rs485_driver_enable(RS485_PHY);
    usart_enable(RS485_PHY);


解决!!!
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117529
QQ
发表于 2025-4-4 12:04:08 | 显示全部楼层
yelvlab 发表于 2025-4-3 01:03
已经解决,找到了问题所在,通过debug发现usart_enable寄存器没置位
其实如果详细观察也能发现

谢谢告知最终原因
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-12 13:50 , Processed in 0.038289 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表