yunhuisog 发表于 2018-6-24 21:55:54

Cubemx中如何关闭DMA半传输中断

本帖最后由 yunhuisog 于 2018-6-24 21:59 编辑

在Cubemx中使用DMA时发现半传输中断、传输完成中断、传输错误中断 都被打开了。
其实我只需要使用传输完成中断,如何关闭半传输中断关断呢?

跟踪发现初始化时在HAL_ADC_Start_DMA函数中定义了回调函数hadc->DMA_Handle->XferHalfCpltCallback = ADC_DMAHalfConvCplt;
在HAL_DMA_Start_IT函数中,判断(NULL != hdma->XferHalfCpltCallback)后就打开了半传输中断。
/* Enable the transfer complete interrupt */
    /* Enable the transfer Error interrupt */
    if(NULL != hdma->XferHalfCpltCallback)
    {
      /* Enable the Half transfer complete interrupt as well */
      __HAL_DMA_ENABLE_IT(hdma, (DMA_IT_TC | DMA_IT_HT | DMA_IT_TE));
    }
    else
    {
      __HAL_DMA_DISABLE_IT(hdma, DMA_IT_HT);
      __HAL_DMA_ENABLE_IT(hdma, (DMA_IT_TC | DMA_IT_TE));
    }这样岂不是要多进很多中断,请问应该如何使半传输中断不使能呢?

这厢有你了 发表于 2019-8-23 15:38:45

说说我的理解:
1、楼主用cubemx工具生成的工程是基于HAL库的。
2、HAL库是把所有的接口都提供给用户了,所以你可以看到传输一半中断、传输完成中断、传输错误中断都打开了。但是你仔细看的话,会发现,传输一半和传输完成中断都是给你提供了回调函数的。你如果不想用传输一半中断,那在回调函数里面不做任何处理就是。
3、其实DMA中断处理函数里面,HAL库的做法是 每次都会先有传输一半完成中断,然后才是传输完成中断的,只是你可以根据自己应用需求选择是否在传输一半完成中断的回调函数里面做处理。

wolfgang2015 发表于 2018-6-26 12:48:14

去掉 DMA_IT_HT

流水不争先 发表于 2018-6-26 14:00:57

尝试一下去掉第6行和第10行中的DMA_IT_HT

馒头弟 发表于 2018-6-27 08:51:44

DMA_IT_TC 传输完成
DMA_IT_TE 错误
DMA_IT_HT 半中断
失能半中断不就行了啊。。

yunhuisog 发表于 2018-6-28 09:14:03

馒头弟 发表于 2018-6-27 08:51
DMA_IT_TC 传输完成
DMA_IT_TE 错误
DMA_IT_HT 半中断


回复楼上的各位。
可能我没说清楚,由于使用的Cubemx,这些代码是自动生成的。如果直接修改这些代码,那Cubemx重新生成代码后会被覆盖掉。这样好像就违背使用Cubemx的初衷了。

有没有哪种方法是不修改Cubemx自动生成的代码,又能达到目的?

馒头弟 发表于 2018-6-28 09:48:28

yunhuisog 发表于 2018-6-28 09:14
回复楼上的各位。
可能我没说清楚,由于使用的Cubemx,这些代码是自动生成的。如果直接修改这些代码,那C ...

你中断函数不处理,影响也不大吧~
你可以在USER code里面写一句关闭的,就不会被覆盖了→_→

generalcircuits 发表于 2019-8-23 16:16:16

你是说用cubemx工具生成的工程是基于HAL库的,不知道怎么修改文件对吗?
可以参考一下这个帖子 https://www.stmcu.org.cn/module/forum/thread-616488-1-1.html
页: [1]
查看完整版本: Cubemx中如何关闭DMA半传输中断