使用芯片CH32V307VCT6 裸系统
int main(void)
{
while(1)
{
if(G_usart1_Rsign == 1)
{
printf("test OK!\n");
G_usart1_Rsign = 0;
}
}
}
void USART1_IRQHandler(void);
void USART1_IRQHandler(void)
{
int k, temp;
if(USART_GetITStatus(USART1,USART_IT_IDLE) == SET)
{
temp = USART1->STATR;
temp = USART1->DATAR; //清USART_IT_IDLE标志
temp = usart_max - DMA_GetCurrDataCounter(DMA1_Channel5); //得到真正接收数据个数
for (k = 0; k < temp; k++)
{
usart1_rxbuf[k] = usart1_rx[k];
usart1_rx[k] = 0;
}
printf("count=%d data=%s\n",temp,usart1_rxbuf);
DMA_Cmd(DMA1_Channel5,DISABLE); //关闭DMA
DMA1_Channel5->CNTR= usart_max;//重新设置接收数据个数
DMA_Cmd(DMA1_Channel5,ENABLE); //开启DMA
G_usart1_Rsign=1;
}
}
以上程序,可以进入一次空闲中断,语句printf("count=%d data=%s\n",temp,usart1_rxbuf);正确执行,主程序可以打印 test OK! 但对以后的串口输入没有反应。只能进入一次串口空闲中断。
修改函数声明:
void USART1_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
修改后:每次都可以进入空闲中断,语句printf("count=%d data=%s\n",temp,usart1_rxbuf);正确执行。但main程序没有打印 test OK!。