DMA中断问题

[复制链接]
3860|3
 楼主| yanggexiaosa 发表于 2013-1-1 21:33 | 显示全部楼层 |阅读模式

使用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使中断服务程序无法执行?
 楼主| yanggexiaosa 发表于 2013-1-2 09:48 | 显示全部楼层
又要沉了,没人回答。自己再摸索下。。
csuzzp 发表于 2013-1-12 16:37 | 显示全部楼层
顶下  虽然我不会
pattywu 发表于 2013-1-12 17:22 | 显示全部楼层
本帖最后由 pattywu 于 2013-1-12 17:23 编辑

    USART1的发送是否使能了?
    USART1的发送引脚是否正确配置了?
    USART1是否配置正确了?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

21

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部