问答

汇集网友智慧,解决技术难题

21ic问答首页 - GD32F450ZIT6 串口使用问题

GD32F450ZIT6 串口使用问题

tylercppt2025-10-23
本帖最后由 tylercppt 于 2025-10-24 09:15 编辑

我用GD32F450ZIT6做了一个项目:
用了5个串口外设,分别如下:
1、USART0(136/137脚)
2、USART1(36/37脚)
3、USART2(69/70脚)
4、USART5(96/97脚)
5、UART4(111/112脚)
调试过程中,USART0/USART1/USART2/USART5均可以正常接收发送,没有什么问题;
但是UART4发送数据没有问题,但是接收数据有问题,RT中断状态没有检测到,进入不了中断程序,会一直接收数据。

1317568fad2cf1c665.png
这个是啥意思,使用USART和UART,数据接收编程有啥区别?
回答 +关注 4
4773人浏览 19人回答问题 分享 举报
19 个回答
  • 哦,那就麻烦了呀
  • 本帖最后由 dffzh 于 2025-10-28 17:32 编辑
    tylercppt 发表于 2025-10-28 12:31
    RBNE字节级接收,进入中断太频繁了,我需要帧级别接收。
    你的意思是收到一帧数据后进入一次串口接收中断?
    UART3是没有USART_INT_FLAG_RT这个标志的:
    6321869008adb2d972.png

    用IDLE空闲中断好像倒是可以。
  • tylercppt 发表于 2025-10-28 12:02
    那试试看,没有用这个进中断

    RBNE字节级接收,进入中断太频繁了,我需要帧级别接收。
  • dffzh 发表于 2025-10-28 10:44
    串口接收中断程序一般用USART_INT_FLAG_RBNE这个不就可以了吗?为什么还要用RT或者IDLE呀?有什么特殊用 ...

    那试试看,没有用这个进中断
  • tylercppt 发表于 2025-10-27 10:57
    终端服务程序:(无法进中断,一直接收数据)
    void USART3_IRQHAND_USART(void)
    {

    串口接收中断程序一般用USART_INT_FLAG_RBNE这个不就可以了吗?为什么还要用RT或者IDLE呀?有什么特殊用途?
  • tylercppt 发表于 2025-10-27 10:59
    请大家看这里,不一一回复了,我后面又改成另外一个中断,但是不能再DMA里面接收数据了。
    void UART3_IRQ ...

    USART_INT_FLAG_RBNE这个也进不了中断吗?

  • 没有问题,所有串口上的电路都是一样的
  • dffzh 发表于 2025-10-24 13:35
    下面这些功能对UART4的正常收发数据不会产生影响:

    你上传一下接收中断服务程序,我帮你看下。

    请大家看这里,不一一回复了,我后面又改成另外一个中断,但是不能再DMA里面接收数据了。
    void UART3_IRQHandler(void)
    {
            OSIntEnter();
            if(RESET != usart_interrupt_flag_get(UART3_PERIPH_USART, USART_INT_FLAG_RBNE))
            {
                    uint8_t data = usart_data_receive(UART3_PERIPH_USART);
                    if((UART3_ReceiveFlag&0x7FFF) < UART3_LENGTH_RECEIVEBUFFER)
                    {
                            UART3_ReceiveBuffer[(UART3_ReceiveFlag++)&0x7FFF]=data;
                           
    //                        printf("%02X ",data);
                    }
                    else
                    {
                            usart_data_receive(UART3_PERIPH_USART);
                    }
                    usart_interrupt_flag_clear(UART3_PERIPH_USART,USART_INT_FLAG_RBNE);
      }
            else if(RESET != usart_interrupt_flag_get(UART3_PERIPH_USART, USART_INT_FLAG_IDLE))
            {
                   
                   
                    volatile uint32_t stat = USART_STAT0(UART3_PERIPH_USART);
                    volatile uint32_t data = usart_data_receive(UART3_PERIPH_USART);
                    (void)stat; (void)data; // 避免编译器警告
                   
                    if(UART3_ReceiveFlag) UART3_ReceiveFlag |= 0x8000;
    //                printf("UART3_ReceiveFlag = %d\r\n",UART3_ReceiveFlag&0x7fff);
    //                for(uint8_t i = 0;i<(UART3_ReceiveFlag&0x7fff);i++){
    //                        printf("%02X ",UART3_ReceiveBuffer);
    //                }
    //                printf("\r\n");
                    //usart_interrupt_flag_clear(UART3_PERIPH_USART,USART_INT_FLAG_IDLE);
            }
           
            OSIntExit();       
    }
  • dffzh 发表于 2025-10-24 13:35
    下面这些功能对UART4的正常收发数据不会产生影响:

    你上传一下接收中断服务程序,我帮你看下。

    终端服务程序:(无法进中断,一直接收数据)
    void USART3_IRQHAND_USART(void)
    {
            OSIntEnter();
           
            if(RESET != usart_interrupt_flag_get(USART3_PERIPH_USART, USART_INT_FLAG_RBNE))
            {
                    uint8_t data = usart_data_receive(USART3_PERIPH_USART);
                    if((USART3_ReceiveFlag&0x7FFF) < USART3_LENGTH_RECEIVEBUFFER)
                    {
                            USART2_ReceiveBuffer[(USART3_ReceiveFlag++)&0x7FFF]=data;
    //                        printf("%02X\r\n",data);
                    }
                    else
                    {
                            usart_data_receive(USART3_PERIPH_USART);
                    }
                    usart_interrupt_flag_clear(USART3_PERIPH_USART,USART_INT_FLAG_RBNE);
      }
            else if(RESET != usart_interrupt_flag_get(USART3_PERIPH_USART, USART_INT_FLAG_RT))
            {
                    if(USART3_ReceiveFlag) USART3_ReceiveFlag |= 0x8000;
                    usart_interrupt_flag_clear(USART3_PERIPH_USART,USART_INT_FLAG_RT);
            }
           
            OSIntExit();       
    }
    dffzh 2025-10-27 11:15 回复TA
    好的,今天空了帮你看下。 
12下一页

您需要登录后才可以回复 登录 | 注册