借鉴了网上串口代码在ch32v上编写了串口接收中断,发现只能执行一次,后参考了沁恒官方代码,发现需要加上属性声明解决

void USART1_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));

这个问题可能从stm32转过来的朋友会遇到,stm32串口编程中无此声明,__attribute__应该是gcc编译器所需,告诉编译器此为中断函数,进出需要设置清除中断标志位。

以上写成void USART1_IRQHandler(void) __attribute__((interrupt()));也能够执行,但要充分利用沁恒快速中断优势最好写成上面那句。