GD32F103VET6的USART2、UART3、UART4不能正常发送

[复制链接]
8677|17
手机看帖
扫描二维码
随时随地手机跟帖
42923277|  楼主 | 2021-7-27 08:25 | 显示全部楼层 |阅读模式
使用GD32F103VET6替代STM32F103VET6时,发现GD32F103VET6的usart2 uart3 uart4 工作不正常。
void Uart3_Init(void)
{
        /* enable GPIO clock */
        rcu_periph_clock_enable(RCU_GPIOC);
  /* enable USART clock */
  rcu_periph_clock_enable(RCU_UART3);

  /* connect port to USARTx_Tx */
  gpio_init(GPIOC, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_10);

  /* connect port to USARTx_Rx */
  gpio_init(GPIOC, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_11);
      
        usart_deinit(UART3);
        usart_baudrate_set(UART3, 115200U);
        usart_word_length_set(UART3, USART_WL_8BIT);
        usart_stop_bit_set(UART3, USART_STB_1BIT);
        usart_parity_config(UART3, USART_PM_NONE);
        usart_hardware_flow_rts_config(UART3, USART_RTS_DISABLE);
        usart_hardware_flow_cts_config(UART3, USART_CTS_DISABLE);
        usart_receive_config(UART3, USART_RECEIVE_ENABLE);
        usart_transmit_config(UART3, USART_TRANSMIT_ENABLE);
        usart_enable(UART3);
}

{
                        //usart_data_transmit(UART3, 0X5A);
                        //usart_flag_clear(UART3, USART_FLAG_TBE);
                        //usart_flag_clear(UART3, USART_FLAG_TC);
                        usart_data_transmit(UART3, (uint8_t)0X5A);
                         //(*(volatile uint32_t *)0x40004c04) = 0x01;
                        while(RESET == usart_flag_get(UART3, USART_FLAG_TBE));
                       
                       
                        //usart_flag_clear(USART1, USART_FLAG_TBE);
                        //usart_flag_clear(USART0, USART_FLAG_TC);
                        usart_data_transmit(USART0, 0X5A);
                        while(RESET == usart_flag_get(USART0, USART_FLAG_TBE));

在这里usart0 可以正常输出,uart3就不可以。uart3使用usart_data_transmit(UART3, (uint8_t)0X5A)发送数据时,TBE不清空,data无变化。 我测试了USART2和uart5,同样现象。

使用特权

评论回复
42923277|  楼主 | 2021-7-27 08:31 | 显示全部楼层
7379260ff53e1319bc.jpg

使用特权

评论回复
42923277|  楼主 | 2021-7-27 08:32 | 显示全部楼层
4072460ff53ecf3b3e.png

使用特权

评论回复
42923277|  楼主 | 2021-7-27 08:32 | 显示全部楼层
9780860ff541897839.png

使用特权

评论回复
42923277|  楼主 | 2021-7-27 08:33 | 显示全部楼层
void gd_eval_com_init(uint32_t com)
{
    uint32_t com_id = 0U;
    if(EVAL_COM0 == com){
        com_id = 0U;
    }else if(EVAL_COM1 == com){
        com_id = 1U;
    }
   
    /* enable GPIO clock */
    rcu_periph_clock_enable(COM_GPIO_CLK[com_id]);

    /* enable USART clock */
    rcu_periph_clock_enable(COM_CLK[com_id]);

    /* connect port to USARTx_Tx */
    gpio_init(COM_GPIO_PORT[com_id], GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, COM_TX_PIN[com_id]);

    /* connect port to USARTx_Rx */
    gpio_init(COM_GPIO_PORT[com_id], GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, COM_RX_PIN[com_id]);

    /* USART configure */
    usart_deinit(com);
    usart_baudrate_set(com, 115200U);
    usart_word_length_set(com, USART_WL_8BIT);
    usart_stop_bit_set(com, USART_STB_1BIT);
    usart_parity_config(com, USART_PM_NONE);
    usart_hardware_flow_rts_config(com, USART_RTS_DISABLE);
    usart_hardware_flow_cts_config(com, USART_CTS_DISABLE);
    usart_receive_config(com, USART_RECEIVE_ENABLE);
    usart_transmit_config(com, USART_TRANSMIT_ENABLE);
    usart_enable(com);
}


USART0 使用的这个初始化函数。

使用特权

评论回复
42923277|  楼主 | 2021-7-27 08:36 | 显示全部楼层
USART1做了测试,可以正常收发

使用特权

评论回复
42923277|  楼主 | 2021-7-27 08:56 | 显示全部楼层
有没有用过USART2 uart3 uart4的大佬,给点提示

使用特权

评论回复
yklstudent| | 2021-7-27 10:21 | 显示全部楼层
软件开发都不看看芯片参考手册和芯片用户手册?

使用特权

评论回复
42923277|  楼主 | 2021-7-27 11:37 | 显示全部楼层
103VET6确定是有USART0/1/2+UART3/4

使用特权

评论回复
mutable| | 2021-7-27 15:28 | 显示全部楼层
1都通了,其他的还叫事么

使用特权

评论回复
zeshoufx| | 2021-7-27 16:41 | 显示全部楼层

tx引脚你确定是这样配置? 6619160ffc6b135ab7.png

使用特权

评论回复
42923277|  楼主 | 2021-7-28 08:30 | 显示全部楼层
感谢zeshoufx。
现在可以了。
我开始用的是USART2,remap到这俩引脚,发现调不通,又转到了uart3,还是没调通,担心引脚或外围器件问题,又改成GPIO做测试,排除了GPIO问题和外围问题,又复制了代码去测试UART4,中间忘记改回引脚配置了。
我程序用了FREERTOS,USART0和USART1的TASK都没有问题,CAN的也可以,现在猜测应该是USART2的TASK出了问题。
再次感谢zeshoufx。

使用特权

评论回复
42923277|  楼主 | 2021-7-28 08:35 | 显示全部楼层
我的usart,用DMA接收到指定缓存区。CPU定时去查看接收缓存区的数据量,来确定是否对接收数据进行处理。

使用特权

评论回复
42923277|  楼主 | 2021-7-28 08:48 | 显示全部楼层
这样我用GD32F103VET6替代STM32F103VET6差不多就完成了。这个项目用到了1个CAN,2个SPI,3个USART,数个GPIO,读写内部FLASH,还用了FREERTOS,MDK是4.71,仿真器用的YSPROG FOR GD32MCU。功能差不多都调通了。

使用特权

评论回复
42923277|  楼主 | 2021-7-28 08:49 | 显示全部楼层
中间还测试了一下ADC功能,功能可以,精度没有认真测试。

使用特权

评论回复
yangxiaor520| | 2021-8-7 17:53 | 显示全部楼层
程序库没有更换成GD的?

使用特权

评论回复
注孤终| | 2021-8-11 11:42 | 显示全部楼层
问一下中断发送函数怎么做,我能接收到数据,但不能在串口助手上发送

使用特权

评论回复
shikk1995| | 2022-9-3 11:33 | 显示全部楼层
你好,我和你是同样的问题,你最后咋解决的。我是GD32F207,我用UART3的复用引脚PA0,PA1.

使用特权

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

本版积分规则

6

主题

81

帖子

0

粉丝