21ic问答首页 - GD32F450ZIT6 串口使用问题
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,数据接收编程有啥区别?
我用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,数据接收编程有啥区别?

问答
赞0
评论
2025-11-03
赞0
UART3是没有USART_INT_FLAG_RT这个标志的:
用IDLE空闲中断好像倒是可以。
评论
2025-10-28
赞0
RBNE字节级接收,进入中断太频繁了,我需要帧级别接收。
评论
2025-10-28
赞0
那试试看,没有用这个进中断
评论
2025-10-28
赞0
串口接收中断程序一般用USART_INT_FLAG_RBNE这个不就可以了吗?为什么还要用RT或者IDLE呀?有什么特殊用途?
评论
2025-10-28
赞0
USART_INT_FLAG_RBNE这个也进不了中断吗?
评论
2025-10-28
赞0
没有问题,所有串口上的电路都是一样的
评论
2025-10-27
赞0
请大家看这里,不一一回复了,我后面又改成另外一个中断,但是不能再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();
}
评论
2025-10-27
赞0
终端服务程序:(无法进中断,一直接收数据)
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();
}
评论
2025-10-27
好的,今天空了帮你看下。
您需要登录后才可以回复 登录 | 注册