硬汉嵌入式论坛

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

STM32V6之基于STM32CubeMX程序框架HAL库之ADC+DMA+TIMER+MultiBuffer定时器触发采样DMA双缓冲区采样(非半传输方式)

  [复制链接]

5

主题

192

回帖

212

积分

高级会员

积分
212
发表于 2020-12-13 14:54:03 | 显示全部楼层 |阅读模式
老规矩先把代码挂上

STM32V6_ADC.rar (655.16 KB, 下载次数: 374)

ADC采样这里使用ADC1通道的 温度TEMP和参考电压VREF作为本次讲解,其中温度和电池电压不能同时选择,这里使用温度通道
首先打开STM32CubeMX,选择ADC1,①勾选温度和VREF这2个通道,②选择DMA,③Add ADC的DMA通道,④DMA传输选择Circular
1.jpg

选择NVIC Settings, 勾选ADC中断
2.jpg

对于不同的触发方式,软件和定时触发方式配置上有2处不同,需要注意
3.jpg
4.jpg

定时器触发选择TIM2 update作为触发,STM32CubeMX不会主动开启TIM2,在配置时需要选择一个定时器和触发模式
这里使用Timer 2 Trigger Out Event,定时器触发需要关闭连续转换模式
定时器2里面设置看下图
5.jpg

如果想看定时器的定时时间可以开启中断,通过EVR查看定时时间
6.jpg

7.jpg

EVR的开启方式看下图
8.jpg

EVR需要设置调试器的 Core Clock,这个就是系统时钟大小
10.jpg

定时器设置和定时时间的看下图,通过EVR监控可以看到,定时器2配置的时间是1ms
EVR里面计算的时间也是1ms,符合我们预先的配置时间
12.jpg
13.jpg

接下来说明来看看软件触发模式下的注意点,设置的ADC采样次数是120.
14.jpg

软件触发模式下,采样120次 可以看到时间大改为3.13ms,那温度和参考电压2个通道采样只需要26μs
程序体量大了以后,很难在26μs来执行一次缓冲区处理,软件触发方式代表着在进入cplt完全传输后,
立马又进行下一次传输,这个时间是26μs,为了可以在一次ADC DMA采样完成对数据进行处理时不被
覆盖,这里对ADC DMA通道做关闭处理,当数据处理完成后再次开启传输
15.jpg

16.jpg

17.jpg

在对2个通道的数据进行均值计算和换算后可以得出当前MCU工作温度和VREF参考电压值(2位小数)
CT为打印的DMA双BUF的转换通道值,没启用双缓冲区的时候CT==0
18.jpg

下来进入双buffer模式,这个模式使用的是DMA的双区间接收模式(非传输模式和完全传输模式)
在stm32f4xx_hal_dma_ex.c可以看到查询和中断2种模式的函数原型
HAL_DMAEx_MultiBufferStart
HAL_DMAEx_MultiBufferStart_IT
虽然有这2个函数,但是这2个函数并没有在HAL库的.c内调用(很难受)

在我例程的bsp_adc.c内最下面
BSP_ADC_MultiBufferStart_DMA有2种方式实现的DMA双BUFFER

第一种方式简单不需要增加函数但是不是很正规。
注意在重新设置寄存器的时候需要__HAL_DMA_DISABLE(hadc->DMA_Handle);
然后在设置完成后__HAL_DMA_ENABLE(hadc->DMA_Handle);

第二种方式被我屏蔽的是根据ST HAL库的写法规规矩矩的写的代码,就是需要增加3个函数,这3个函数
也是我从HAL_ADC_Start_DMA实现方式里面copy过来的,在源代码里面是 static 定义的函数,
所以即使重复了也没问题

具体的代码实现小伙伴们参考代码自行了解吧,
接下来进入DEBUG看看双BUF是不是真的。

在watch区里面里面添加双BUF进行监控,点开2个区间查看,可以发现2个区间的都在被DMA更新,
同时CT的值也在改变,根据CT的值可以获知DMA正在使用的目标缓冲区,可以合理避开DMA区间
使用DMA没有使用的另外一块区间进行计算处理。这里可以看到
定时器定时1ms【slot=4】,
采样8次的DMA时间为8ms【slot=1】

120的采样次数有点卡哈,可以改成小一点比如8,这样2个缓冲区都可以观察,定时器定时时间为
ADC_Multi_buffer.gif

总结:
1.软件触发模式简单好用,对于一些ADC采样不需要根据时间来分析波形的场合适合用软件触发,
比如内部通道的温度和参考电压等,我们只是需要获取当前时间的AD值.软件触发的好处还有就是
可以不用开DMA双BUF。因为采样完一次我们就可以先暂时关闭DMA,处理完再开启。

2.定时器触发模式的好处在于我们可以根据采样时间固定的间隔来分析ADC采样值和时间变化的关系,
比如温度的变化趋势,获取一个通道的波形变化,适合于示波器类等应用场合,配置DMA的双BUF
传输,可以大大减轻MCU的负担






11.jpg
9.jpg

评分

参与人数 2金币 +120 收起 理由
hqgboy + 20 很给力!
eric2013 + 100 很给力!

查看全部评分

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2020-12-14 01:25:25 | 显示全部楼层
谢谢楼主分享。
回复

使用道具 举报

1

主题

14

回帖

17

积分

新手上路

积分
17
发表于 2021-8-2 17:15:22 | 显示全部楼层
谢谢分享!
回复

使用道具 举报

0

主题

5

回帖

5

积分

新手上路

积分
5
发表于 2022-1-17 11:38:20 | 显示全部楼层
谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-18 07:30 , Processed in 0.219249 second(s), 32 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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