已经解决,需要添加声明:?void USART1_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));?
各位前辈,现在调试CH32V307VCT6 串口驱动回环测试.
用串口中断RX接收后TX返回数据,发现RX进入中断接收第一个字符后就停止接收,芯片复位后还是只能接收RX第一个字符.
串口1和串口2一样现象,开IDLE也没有区别.试过EVT的中断范例也是一样只接收第一个字符,尝试用其他的clear函数没作用.
现将测试代码贴上麻烦帮看下,谢谢!
void USART1_Configuration(void)
{
? ? ? ? NVIC_InitTypeDef NVIC_InitStructure;
? ? ? ? GPIO_InitTypeDef GPIO_InitStructure;
? ? ? ? USART_InitTypeDef USART_InitStructure;
? ? ? ? RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
? ? ? ? RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,? ENABLE);
? ? ? ? //USART1_TX? ?GPIOA.9
? ? ? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
? ? ? ? GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
? ? ? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
? ? ? ? GPIO_Init(GPIOA, &GPIO_InitStructure);
? ? ? ? //USART1_RX? ?GPIOA.10初始化
? ? ? ? GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
? ? ? ? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
? ? ? ? GPIO_Init(GPIOA, &GPIO_InitStructure);
? ? ? ? ?// 配置波特率
? ? ? ? USART_InitStructure.USART_BaudRate = 115200;
? ? ? ? // 配置 针数据字长
? ? ? ? USART_InitStructure.USART_WordLength = USART_WordLength_8b;
? ? ? ? // 配置停止位
? ? ? ? USART_InitStructure.USART_StopBits = USART_StopBits_1;
? ? ? ? // 配置校验位
? ? ? ? USART_InitStructure.USART_Parity = USART_Parity_No ;
? ? ? ? // 配置硬件流控制
? ? ? ? USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
? ? ? ? // 配置工作模式,
? ? ? ? USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
? ? ? ?// 完成串口的初始化配置
? ? ? ? USART_Init(USART1, &USART_InitStructure);
? ? ? ? // 使能串口接收中断
? ? ? ? USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
? ? ? ? //USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);
? ? ? ? USART_Cmd(USART1, ENABLE);
? ? ? ? // 清除发送完成标志
? ? ? ? NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
? ? ? ? NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0X06;
? ? ? ? NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0X00;
? ? ? ? NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
? ? ? ? NVIC_Init(&NVIC_InitStructure);
}
void USART1_IRQHandler(void)
{
? ? if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
? ? {
? ? ? ? Res = USART_ReceiveData(USART1);
? ? ? ? USART_ClearITPendingBit(USART1, USART_IT_RXNE);
? ? ? ? USART_SendData(USART1, Res);
? ? }
}
以下是串口助手接收数据状态;
[10:41:12.615]收←◆SystemClk:144000000
USBHS HOST MTP Test
这是一个串口中断接收回显实验
[10:41:15.950]发→◇3333□
[10:41:15.953]收←◆3
[10:41:17.397]发→◇3333□
[10:43:06.322]收←◆SystemClk:144000000
USBHS HOST MTP Test
这是一个串口中断接收回显实验
[10:43:09.605]发→◇3333□
[10:43:09.607]收←◆3
[10:43:10.293]发→◇3333□
[10:43:10.932]发→◇3333□
[10:43:11.517]发→◇3333□
[10:51:16.159]收←◆SystemClk:144000000
USBHS HOST MTP Test
这是一个串口中断接收回显实验
[10:51:22.365]发→◇123456789□
[10:51:22.367]收←◆1
[10:51:28.973]发→◇987654321□
[10:51:36.581]发→◇234567890□
[10:51:45.869]发→◇3456789012□