CH32V307VCT6 串口调试回环测试异常. ---已经解决

已经解决,需要添加声明:?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□


之前使用CH32F103直接用STM32F103代码串口通讯没有问题.


//串口1中断和接收

void USART1_IRQHandler(void)

{

? ? if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //一个字符中断

? ? {

? ? ? ? USART1_REC[REC1_NUM++] = USART1 -> DR ; //储存一个字符到数组

? ? }

? ? else if(USART_GetITStatus(USART1, USART_IT_IDLE) != RESET)//一段字符中断

? ? {

? ? ? ? USART1 -> SR? ;?

? ? ? ? USART1 -> DR? ;?

? ? ? ? USART1_STR = 1 ; //段接收完成标示

? ? ? ? if (USART1_REC[0] == 83 && USART1_REC[1] == 84? )? ?//判断接收数据以"ST"开始

? ? ? ? {

? ? ? ? ? ? while((USART1->SR & (1<<7)) == 0 ) ; //判断串口空闲标志位

? ? ? ? ? ? USART1->DR = 83 ;

? ? ? ? }

? ? ? ? REC1_NUM = 0? ;? ?//接收数组位归零

? ? }

}



只有登录才能回复,可以选择微信账号登录