最近我在使用沁恒CH32V307VCT6芯片进行项目开发,本文旨在记录我在开发过程中遇到的问题及其解决方案。
1.ch32使用中断串口接收,只能接收一个字符,之后卡死整个程序。
现象:使用以下代码接收字符串,仅能输出1次c,之后程序卡死。
//串口2中断
void USART2_IRQHandler(void)
{
u8 temp;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
{
temp=USART_ReceiveData(USART2);
switch(rfid_index)
{
case 0:
if(temp == 0x04)
rfid_index++;
printf("c\r\d");//调试,输出c
break;
case 1:
if(temp == 0x0c)
rfid_index++;
else
rfid_index = 0;
printf("d\r\d");//调试,输出d
break;
case 2:
if(temp == 0x02)
rfid_index++;
else
rfid_index = 0;
break;
case 3:
if(temp == 0x30)
rfid_index++;
else
rfid_index = 0;
break;
case 4:
if(temp == 0x00)
rfid_index++;
else
rfid_index = 0;
break;
case 5://5和6卡的类型
if(temp == 0x04)
rfid_index++;
else
rfid_index = 0;
break;
case 6:
if(temp == 0x00)
rfid_index++;
else
rfid_index = 0;
break;
case 7://7~9为卡号
rfid_temp[0]=temp;
rfid_index++;
break;
case 8:
rfid_temp[1]=temp;
rfid_index++;
break;
case 9:
rfid_temp[2]=temp;
rfid_index++;
break;
case 10:
rfid_temp[3]=temp;
rfid_index = 0;
break;
}
}
USART_ClearITPendingBit(USART2, USART_IT_RXNE);
}
解决方法:在main.c文件前加入对应的快速中断函数。
例如:
void USART3_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));//串口3快速中断
void USART2_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));//串口2快速中断
2.ch32使用printf,不输出数据
解决办法:看是不是打印数据最后没有\r\n。如果是添加上去即可输出。
例如:
printf("hello\r\n");