硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4312|回复: 8
收起左侧

[有问必答] 求教如何计算DMA的中断周期?

[复制链接]

9

主题

19

回帖

46

积分

新手上路

积分
46
发表于 2021-5-25 19:11:22 | 显示全部楼层 |阅读模式
void dma_init(void)
{
    DMA_InitTypeDef     DMA_InitStructure;

    ADC_DMACmd(ADC1, DISABLE);
    DMA_Cmd(DMA1_Channel1, DISABLE);

    DMA_DeInit(DMA1_Channel1);
    DMA_InitStructure.DMA_PeripheralBaseAddr = BASE_Address;  u32[]
    DMA_InitStructure.DMA_MemoryBaseAddr = BASE_DATA;  u32[]
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
    DMA_InitStructure.DMA_BufferSize = 2048;
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
    DMA_Init(DMA1_Channel1, &DMA_InitStructure);

    DMA_ITConfig(DMA1_Channel1, DMA1_IT_TC1, ENABLE); // DMA传输完成中断
    DMA_ITConfig(DMA1_Channel1, DMA1_IT_HT1, ENABLE); // DMA过半完成中断

    ADC_DMACmd(ADC1, ENABLE);
    DMA_Cmd(DMA1_Channel1, ENABLE);
}

如上的程序,很容易理解,没什么难的。我不明白的地方是DMA的中断周期是如何计算的。
实测DMA传输完成中断周期是40ms , DMA过半完成中断周期是20ms 。
如果要计算的话,怎么样计算才能得到DMA传输完成/半完成中断的周期呢?
非常感谢。


回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2021-5-26 07:25:28 | 显示全部楼层
定时器触发ADC + DMA才有相对稳定的周期.

或者你大概换算出来每次ADC转换需要时间,半传输完成和传输完成时间基本也就出来了。
回复

使用道具 举报

9

主题

19

回帖

46

积分

新手上路

积分
46
 楼主| 发表于 2021-5-26 09:34:42 | 显示全部楼层
eric2013 发表于 2021-5-26 07:25
定时器触发ADC + DMA才有相对稳定的周期.

或者你大概换算出来每次ADC转换需要时间,半传输完成和传输完 ...

我这个的确是定时器触发ADC,然后DMA传输数据。
定时器触发ADC,采样频率12800,一次采样产生4个数据。
DMA传输2048个数据,2048/4=512,512个采样周期
512/12800=40ms 刚好与实测的DMA传输中断周期一样。
但是,我把ADC初始化函数屏蔽掉了,DMA传输中断还是这个周期。


请问DMA传输和ADC转换有关系吗?
还是说ADC产生一个数据,DMA传输一个数据,直到传输了2048个数据,产生传输中断?
抑或是,DMA只管无脑传输(DMA_Mode_Circular),不管ADC有没有产生有效数据?


谢谢




回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2021-5-26 09:44:16 | 显示全部楼层
mtk1625 发表于 2021-5-26 09:34
我这个的确是定时器触发ADC,然后DMA传输数据。
定时器触发ADC,采样频率12800,一次采样产生4个数据。
...

这里关键的区别就是定时器触发DMA,还是ADC触发DMA
回复

使用道具 举报

9

主题

19

回帖

46

积分

新手上路

积分
46
 楼主| 发表于 2021-5-26 16:44:37 | 显示全部楼层
eric2013 发表于 2021-5-26 09:44
这里关键的区别就是定时器触发DMA,还是ADC触发DMA

是啊  我也想知道这个。从源码里为啥看不到是谁触发了DMA呢???
回复

使用道具 举报

9

主题

19

回帖

46

积分

新手上路

积分
46
 楼主| 发表于 2021-5-26 16:47:15 | 显示全部楼层
eric2013 发表于 2021-5-26 09:44
这里关键的区别就是定时器触发DMA,还是ADC触发DMA

您说的这个,是谁触发了DMA,是不是指的是 DMA1_Channelx ???
回复

使用道具 举报

9

主题

19

回帖

46

积分

新手上路

积分
46
 楼主| 发表于 2021-5-26 16:56:32 | 显示全部楼层
好像是的 ,我把DMA1_Channel1 改成DMA1_Channel2 后,DMA中断就没了
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117564
QQ
发表于 2021-5-26 17:26:54 | 显示全部楼层
mtk1625 发表于 2021-5-26 16:56
好像是的 ,我把DMA1_Channel1 改成DMA1_Channel2 后,DMA中断就没了

跟这个没关系。

我前面的这句话:“这里关键的区别就是定时器触发DMA,还是ADC触发DMA”

这个才是关键,如果你不初始化ADC,显然就是定时器在触发。如果你停止DMA触发,依然可以使用ADC转换完成触发DMA,这个才是本质。
回复

使用道具 举报

9

主题

19

回帖

46

积分

新手上路

积分
46
 楼主| 发表于 2021-5-27 10:01:42 | 显示全部楼层
eric2013 发表于 2021-5-26 17:26
跟这个没关系。

我前面的这句话:“这里关键的区别就是定时器触发DMA,还是ADC触发DMA”

emmm 我看DMA的channel1 上对应的有:ADC1 / TIM2_CH3 /TIM4_CH1 。应该是ADC1触发了DMA传输,为什么我把ADC初始化屏蔽掉了,还会有DMA中断呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-14 21:33 , Processed in 0.042079 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表