CH32V307 进入串口空闲中断+DMA后 不能退回主程序while循环

使用芯片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!。


你好,可将完整代码发我这边测试下(yrl@wch.cn)


icon_rar.gifCH32V307VCT6.zip

1、使用的25M晶振

2、设置为:void USART1_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));

串口输入GPS0\n

返回:count=5 data=GPS0

分析:串口空闲中断每次成功,但没有进入main程序的while循环


设置为:void USART1_IRQHandler(void);

串口输入GPS0\n

返回:count=5 data=GPS0

test OK!

;GPS PRN SIGN0

分析:串口空闲中断只成功一次,进入main程序的while循环,调用USART_COM_DataReceiver()函数成功。



怎么样?



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