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

DMA 传输一半中断

[复制链接]
飞儿 提问时间:2016-11-7 10:57 /
阅读主题, 点击返回1楼
收藏 2 评论44 发布时间:2016-11-7 10:57
44个回答
飞儿 回答时间:2016-11-7 16:10:40
安 发表于 2016-11-7 16:08
楼主想实现的是输出一半进行一次中断,传输完成产生一次中断,是吗?
进入中断后,不要先关闭DMA,等处理完 ...

TC正常   HT第一次是在传输一半中断后面就变成一直是全部传输中断。
飞儿 回答时间:2016-11-7 16:13:20
安 发表于 2016-11-7 16:08
楼主想实现的是输出一半进行一次中断,传输完成产生一次中断,是吗?
进入中断后,不要先关闭DMA,等处理完 ...

还是一样,   变成了每次都全部传输
7S26825SM0ISZ[T))@F4W49.png
飞儿 回答时间:2016-11-7 16:19:41
安 发表于 2016-11-7 16:08
楼主想实现的是输出一半进行一次中断,传输完成产生一次中断,是吗?
进入中断后,不要先关闭DMA,等处理完 ...

最开始发现问题是这样的,   我设置AD采样,采样周期2.2us采样一次, 然后用DMA的方式,结果发现没中断一次需要920us,  而我只设置了传输一半中断,buff大小500,也就是采250个AD就中断, 时间应该=250*2.2us=500多us。   时间上差了一倍。然后我就改成全部传输完成中断, 结果时间还是920us,明显出问题了
废鱼 回答时间:2016-11-7 16:22:23
清除中断的时候,单独清除试试。
飞儿 回答时间:2016-11-7 16:31:31
安 发表于 2016-11-7 16:22
清除中断的时候,单独清除试试。

还是不行,我跑下Cube的例程吧
废鱼 回答时间:2016-11-7 16:40:33
等我找个板子测试一下103下面,DMA的采集。
飞儿 回答时间:2016-11-7 17:22:44
安 发表于 2016-11-7 16:40
等我找个板子测试一下103下面,DMA的采集。

有结果了吗
zbber 回答时间:2016-11-7 18:11:46
楼主用的哪个CPU
assssdz 回答时间:2016-11-7 19:21:07
飞儿 回答时间:2016-11-8 08:09:06
zbber 发表于 2016-11-7 18:11
楼主用的哪个CPU

STM32f072C8
飞儿 回答时间:2016-11-8 08:13:54
安 发表于 2016-11-7 16:40
等我找个板子测试一下103下面,DMA的采集。

我用F439的DMA例程  改
就改了这么一句 DMA_ITConfig(DMA_STREAM, DMA_IT_HT, ENABLE);

void DMA_STREAM_IRQHANDLER(void)
{
  /* Test on DMA Stream Transfer Complete interrupt */
  if(DMA_GetITStatus(DMA_STREAM, DMA_IT_HTIF0))
  {
                if((DST_Buffer[0]!=0xffffffff)&&(DST_Buffer[BUFFER_SIZE-1]!=0xffffffff))
                {
                        Errno=1;
                }
                DST_Buffer[0]=0xffffffff;
                DST_Buffer[BUFFER_SIZE-1]=0xffffffff;
                if((DST_Buffer[0]!=0xffffffff)&&(DST_Buffer[BUFFER_SIZE-1]!=0xffffffff))
                {
                        Errno=2;
                }               
    /* Clear DMA Stream Transfer Complete interrupt pending bit */
    DMA_ClearITPendingBit(DMA_STREAM, DMA_IT_HTIF0);
         
    printf("\n\rwww.armjishu.com STM32 DMAÊý¾Ý´«ÊäÍê³É\r\n");
    /* Turn LED3 on: End of Transfer */
    STM_EVAL_LEDOn(LED3);
  }
}

执行结果,还是每次中断,整个buff都更新,Errno始终等于1,实在没办法理解了

飞儿 回答时间:2016-11-8 08:32:38
安 发表于 2016-11-7 16:40
等我找个板子测试一下103下面,DMA的采集。

今天有测试了一下,
u8 Test_Flag=0,Errno=0;
u32 DataCnt=0;
void DMA1_Channel1_IRQHandler(void)          
{           
        DataCnt = DMA_GetCurrDataCounter(DMA1_Channel1);
        Errno=0;
        if(DataCnt>250)
        {
                Errno=1;
        }       
        if(DMA_GetITStatus(DMA_IT_HT)==SET)
        {                               
                DMA_ClearITPendingBit(DMA1_IT_HT1);                                   
                if(Test_Flag)
                {
                        Test_Flag=0;
                        SDA_H;
                }
                else
                {
                        Test_Flag=1;
                        SDA_L;                       
                }
        }

}
结果发现DataCnt每次都等于250,BUFF的一半,也就是说是传输个半个BUFF,但是却发现,每次中断的时间,和全部传输完成的中断时间是一样的,而且数组里面仍然是全部更新。实际上还是全部传输中断,这到底为什么.
五哥1 回答时间:2016-11-8 11:24:22
根据楼主的情况,结合以往,绝大多数的问题都是提出问题的楼主自行解决的,因为所有发言的人都是在你提供的非常有限的信息里凭经验猜。这个猜,或许能给你一些启发,最终解决问题的还是你自己。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

wdshuang09 回答时间:2016-11-8 12:14:11
五哥1 发表于 2016-11-8 11:24
根据楼主的情况,结合以往,绝大多数的问题都是提出问题的楼主自行解决的,因为所有发言的人都是在你提供的 ...

同意这个说法
废鱼 回答时间:2016-11-8 14:12:29
103测试,ADC采集1000个数据,当HT产生时CNDTR值为491,TC产生时CNDTR的值为0。
如果在HT产生时加了中断,总是看到TC的产生的中断,这样测试并不准确,DMA处理数据速度快,导致仿真中断时,数据已经处理完成,才看到TC的中断产生,建议楼主用串口调试输出,这样准确一些。

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版