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,数据接收编程有啥区别?
检查硬件连接 检查波特率设置是否与发送端匹配 UART4中断是否已在NVIC中使能,且优先级是否合理。 在初始化时清除历史中断标志,避免残留标志导致无法触发。 在调试时直接读取UART_STAT0(UART4)寄存器,检查RBNE标志是否置位。 NVIC、UART中断使能、标志清除。 是不是PA11/PA12被复用为其他功能了 看看RX线有无短路、开路或干扰。 清除中断标志 下面这些功能对UART4的正常收发数据不会产生影响:
你上传一下接收中断服务程序,我帮你看下。
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-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();
} onlycook 发表于 2025-10-24 12:25
检查硬件连接
没有问题,所有串口上的电路都是一样的 tylercppt 发表于 2025-10-27 10:59
请大家看这里,不一一回复了,我后面又改成另外一个中断,但是不能再DMA里面接收数据了。
void UART3_IRQ ...
USART_INT_FLAG_RBNE这个也进不了中断吗? tylercppt 发表于 2025-10-27 10:57
终端服务程序:(无法进中断,一直接收数据)
void USART3_IRQHAND_USART(void)
{
串口接收中断程序一般用USART_INT_FLAG_RBNE这个不就可以了吗?为什么还要用RT或者IDLE呀?有什么特殊用途? dffzh 发表于 2025-10-28 10:44
串口接收中断程序一般用USART_INT_FLAG_RBNE这个不就可以了吗?为什么还要用RT或者IDLE呀?有什么特殊用 ...
那试试看,没有用这个进中断 tylercppt 发表于 2025-10-28 12:02
那试试看,没有用这个进中断
RBNE字节级接收,进入中断太频繁了,我需要帧级别接收。 本帖最后由 dffzh 于 2025-10-28 17:32 编辑
tylercppt 发表于 2025-10-28 12:31
RBNE字节级接收,进入中断太频繁了,我需要帧级别接收。你的意思是收到一帧数据后进入一次串口接收中断?
UART3是没有USART_INT_FLAG_RT这个标志的:
用IDLE空闲中断好像倒是可以。
哦,那就麻烦了呀
页:
[1]