你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
隐者-423522 提问时间:2013-10-8 11:24 /
 我根据库例程在配置UART和DMA之后,想在主程序中能用DMA进行多次UART的发送,
        调用           USART_DMACmd(UART4, USART_DMAReq_Tx, ENABLE);
                   DMA_Cmd (DMA2_Channel5,ENABLE);  能成功发送一次数据,但是接下来就不能正常发送了。
而DMA_GetFlagStatus(DMA2_FLAG_TC5)==SET始终不能满足,不管是用中断去判断还是循环去读。是什么地方出错了呢?

收藏 评论6 发布时间:2013-10-8 11:24

举报

6个回答
Hiker 回答时间:2013-10-9 15:19:17

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

DMA_SetCurrDataCounter(COM_DMA_TX_CHANNEL[COM], 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[0] = 1;
Uart_Send_Buffer[1] = 2;
Uart_Send_Buffer[2] = 3;
Uart_Send_Buffer[3] = 4;
Uart_Send_Buffer[4] = 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[0] = 1;
Uart_Send_Buffer[1] = 2;
Uart_Send_Buffer[2] = 3;
Uart_Send_Buffer[3] = 4;
Uart_Send_Buffer[4] = 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

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版