隐者-423522 发表于 2013-10-8 11:24:40

UART如何使用DMA发送多次数据

 我根据库例程在配置UART和DMA之后,想在主程序中能用DMA进行多次UART的发送,
        调用         USART_DMACmd(UART4, USART_DMAReq_Tx, ENABLE);
                 DMA_Cmd (DMA2_Channel5,ENABLE);  能成功发送一次数据,但是接下来就不能正常发送了。
而DMA_GetFlagStatus(DMA2_FLAG_TC5)==SET始终不能满足,不管是用中断去判断还是循环去读。是什么地方出错了呢?

:o

Hiker 发表于 2013-10-9 15:19:17

RE:UART如何使用DMA发送多次数据

DMA_SetCurrDataCounter(COM_DMA_TX_CHANNEL, resLen);

Hiker 发表于 2013-10-8 13:18:29

RE:UART如何使用DMA发送多次数据

第二次发送的时候要 重新配置长度。

dzc2001 发表于 2013-10-8 16:16:56

RE:UART如何使用DMA发送多次数据

//串口DMA发送测试
Uart_Send_Buffer = 1;
Uart_Send_Buffer = 2;
Uart_Send_Buffer = 3;
Uart_Send_Buffer = 4;
Uart_Send_Buffer = 5;
i = 1;
while (1)
{
        //检查串口是否可以发送
        while (Flag_Uart_Send);
        Flag_Uart_Send = 1;
        //设置传输数据长度
        DMA_SetCurrDataCounter(DMA1_Channel4,i);
        //打开DMA
        DMA_Cmd(DMA1_Channel4,ENABLE);
        i++;
        if (i > 5)
        {
                i = 1;
        }
}

发表于 2013-10-8 21:35:59

RE:UART如何使用DMA发送多次数据

这是发送的中断处理函数,你看看自己有没有哪里弄错了
//串口1DMA方式发送中断
void DMA1_Channel4_IRQHandler(void)
{
    //清除标志位
    DMA_ClearFlag(DMA1_FLAG_TC4);
    //DMA_ClearITPendingBit(DMA1_FLAG_TC4);
    //DMA1->IFCR |= DMA1_FLAG_TC4;
    //关闭DMA
    DMA_Cmd(DMA1_Channel4,DISABLE);
    //DMA1_Channel4->CCR &= ~(1

隐者-423522 发表于 2013-10-11 10:18:12

回复:UART如何使用DMA发送多次数据

主循环里面不需要去调用USART_DMACmd(UART4, USART_DMAReq_Tx, ENABLE);
直接就不发送数据了呢。。。
 
回复第 3 楼 于2013-10-08 16:16:56发表:
//串口DMA发送测试
Uart_Send_Buffer = 1;
Uart_Send_Buffer = 2;
Uart_Send_Buffer = 3;
Uart_Send_Buffer = 4;
Uart_Send_Buffer = 5;
i = 1;
while (1)
{
//检查串口是否可以发送
while (Flag_Uart_Send);
Flag_Uart_Send = 1;
//设置传输数据长度
DMA_SetCurrDataCounter(DMA1_Channel4,i);
//打开DMA
DMA_Cmd(DMA1_Channel4,ENABLE);
i++;
if (i > 5)
{
i = 1;
}
}
 

隐者-423522 发表于 2013-10-11 10:28:24

回复:UART如何使用DMA发送多次数据

<div style="padding:5px;border:1px dashed #ccc;">不去判断DMA1_FLAG_TC4标志,直接给清除了么?
为什么要关闭DMA呢?
在主循环再送数据长度和开启DMA_Cmd么?
需要调用USART_DMACmd么?
 

回复第 4 楼 于2013-10-08 21:35:59发表:
这是发送的中断处理函数,你看看自己有没有哪里弄错了
//串口1DMA方式发送中断
void DMA1_Channel4_IRQHandler(void)
{
//清除标志位
DMA_ClearFlag(DMA1_FLAG_TC4);
//DMA_ClearITPendingBit(DMA1_FLAG_TC4);
//DMA1->IFCR |= DMA1_FLAG_TC4;
//关闭DMA
DMA_Cmd(DMA1_Channel4,DISABLE);
//DMA1_Channel4->CCR &= ~(1
页: [1]
查看完整版本: UART如何使用DMA发送多次数据