使用DMA实现串口发送。当我不使能DMA传输完成中断时能够正常发送,但是当我使能DMA全部发送完成中断时,串口就无法发送数据。这是什么问题呢。我串口这边接收到40个0。如果正常的话应该是50个字符。
void DMA_Initial(void)
{
DMA_InitTypeDef DMA_InitStruct;
DMA_DeInit(DMA1_Channel4);
DMA_InitStruct.DMA_PeripheralBaseAddr=0x40013804; //USART->DR
DMA_InitStruct.DMA_MemoryBaseAddr=(uint32_t)TransBuffer;
DMA_InitStruct.DMA_DIR=DMA_DIR_PeripheralDST;
DMA_InitStruct.DMA_BufferSize=50;
DMA_InitStruct.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
DMA_InitStruct.DMA_MemoryInc=DMA_MemoryInc_Enable;
DMA_InitStruct.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;
DMA_InitStruct.DMA_MemoryDataSize=DMA_MemoryDataSize_Byte;
DMA_InitStruct.DMA_Mode=DMA_Mode_Normal;
DMA_InitStruct.DMA_Priority=DMA_Priority_High;
DMA_InitStruct.DMA_M2M=DMA_M2M_Disable;
DMA_Init(DMA1_Channel4,&DMA_InitStruct);
DMA_ITConfig(DMA1_Channel4,DMA_IT_TC,ENABLE);
}
以上是DMA配置函数。加上最后一句就出问题了。请问这是什么问题呢?
经过测试发现了如果使用半传输中断的话,串口可以正常发送,读取DMA发送数据的剩余个数返回正确的25。但是这样中断处理函数中的代码执行就有误了(中断里是使小灯闪烁)不灯不闪了。而配置成全部完成中断时,中断可以进,如果是循环模式数据剩余个数读出值为50,为正常模式时为0。也很正常,并且中断服务程序的代码可以正常执行,小灯闪烁。但是数据无法发送了。
我就纳闷了啊。这是怎么了啊。难不成中断占了系统总线使DMA无法传输?可是我先传输后中断的啊。还是DMA使中断服务程序无法执行? |