又碰到一个问题,请教各位大侠:在使用DMA发送UART的时候,需要等待上一次发送完成后,才能进行下一次发送。但是出了问题了。
这是测试代码:
UART1_User = DMA0_Use_UART1;//设置UART1为DMA在使用
SYSUARTAPP = true ;//UART1在使用状态
SendCCDMA(C_SysInf);//DMA发送数据
U1TXREG = 0x58;//完成DMA设置(此时没有完成发送),发送一个"X"作为标志
while (SYSUARTAPP ){}//等待发送完成
U1TXREG = 0x59; //发送完成后再发送一个"Y"作为标志
DMA中断程序:
void __attribute__ ( ( interrupt, no_auto_psv ) ) _DMA0Interrupt ( void )
{
IFS0bits.DMA0IF = 0;//清除DMA0中断
if (DMAINT0bits.HALFIF == 1) //半满中断
{
DMAINT0bits.HALFEN = 0;//下次全满中断
DMAINT0bits.HALFIF = 0;//清除半满中断标志
}
else
{
UART1_User = 0 ;//结束DMA使用UART1状态
SYSUARTAPP = false ;
DMACH0bits.CHEN = 0; //关闭DMA0中断
// DMAINT0bits.HALFEN = 1;//下次半满中断
U1TXREG = 0x38;
U1TXREG = 0x38;
U1TXREG = UART1_User;
U1TXREG = 0x38;
}
}
可以看到,在DMA完成全部发送的时候,将UART1_User 设置为0,代表DMA使用UART1完成了,不再占用,同时设置了SYSUARTAPP为fales,也代表了UART1空了。同时还输出了四个字符作为标志,标志确实完成了DMA。
然后结果是这样的:
1X973312021Echo0020211188*8
可以看到x发送成功了,代表了DMA发送成功,进入到了等待发送完成状态,同时最后也出现了标志DMA完成的四个字符,代表发送完成了,也就是说UART1_User 设置为0,SYSUARTAPP为fales,这两个设置设置都过了。但"Y"没有出现,也就是说这个while (SYSUARTAPP ){} 没有出来?啥情况呢?
这两个标志最后加的,程序其他地方没有也检查过了,不会有其他地方改变它们。我试了很多次了,原来就用UART1_User作为判断标志的,后来不行,没办法再加个布尔型试试,但还是不行。我这编程水平有大问题了么?急急急