tylercppt 发表于 2025-10-23 15:35

GD32F450ZIT6 串口使用问题

本帖最后由 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中断状态没有检测到,进入不了中断程序,会一直接收数据。


这个是啥意思,使用USART和UART,数据接收编程有啥区别?

onlycook 发表于 2025-10-24 12:25

检查硬件连接

classroom 发表于 2025-10-24 12:26

检查波特率设置是否与发送端匹配

cr315 发表于 2025-10-24 13:26

UART4中断是否已在NVIC中使能,且优先级是否合理。

duo点 发表于 2025-10-24 14:27

在初始化时清除历史中断标志,避免残留标志导致无法触发。

jcky001 发表于 2025-10-24 15:27

在调试时直接读取UART_STAT0(UART4)寄存器,检查RBNE标志是否置位。

powerantone 发表于 2025-10-24 19:28

NVIC、UART中断使能、标志清除。

powerantone 发表于 2025-10-24 12:32

是不是PA11/PA12被复用为其他功能了

probedog 发表于 2025-10-24 14:33

看看RX线有无短路、开路或干扰。

solty 发表于 2025-10-24 19:33

清除中断标志

dffzh 发表于 2025-10-24 13:35

下面这些功能对UART4的正常收发数据不会产生影响:

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

tylercppt 发表于 2025-10-27 10:57

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();       
}

tylercppt 发表于 2025-10-27 10:59

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();       
}

tylercppt 发表于 2025-10-27 11:00

onlycook 发表于 2025-10-24 12:25
检查硬件连接

没有问题,所有串口上的电路都是一样的

dffzh 发表于 2025-10-28 10:30

tylercppt 发表于 2025-10-27 10:59
请大家看这里,不一一回复了,我后面又改成另外一个中断,但是不能再DMA里面接收数据了。
void UART3_IRQ ...

USART_INT_FLAG_RBNE这个也进不了中断吗?

dffzh 发表于 2025-10-28 10:44

tylercppt 发表于 2025-10-27 10:57
终端服务程序:(无法进中断,一直接收数据)
void USART3_IRQHAND_USART(void)
{


串口接收中断程序一般用USART_INT_FLAG_RBNE这个不就可以了吗?为什么还要用RT或者IDLE呀?有什么特殊用途?

tylercppt 发表于 2025-10-28 12:02

dffzh 发表于 2025-10-28 10:44
串口接收中断程序一般用USART_INT_FLAG_RBNE这个不就可以了吗?为什么还要用RT或者IDLE呀?有什么特殊用 ...

那试试看,没有用这个进中断

tylercppt 发表于 2025-10-28 12:31

tylercppt 发表于 2025-10-28 12:02
那试试看,没有用这个进中断

RBNE字节级接收,进入中断太频繁了,我需要帧级别接收。

dffzh 发表于 2025-10-28 17:01

本帖最后由 dffzh 于 2025-10-28 17:32 编辑

tylercppt 发表于 2025-10-28 12:31
RBNE字节级接收,进入中断太频繁了,我需要帧级别接收。你的意思是收到一帧数据后进入一次串口接收中断?
UART3是没有USART_INT_FLAG_RT这个标志的:


用IDLE空闲中断好像倒是可以。

tylercppt 发表于 2025-11-3 13:39

哦,那就麻烦了呀
页: [1]
查看完整版本: GD32F450ZIT6 串口使用问题