搜索
查看: 40551|回复: 38

[原创] 采用STM32cube完成ADC的DMA功能

  [复制链接]

该用户从未签到

19

主题

954

帖子

27

蝴蝶豆

论坛元老

最后登录
2019-7-29
发表于 2015-1-8 08:51:26 | 显示全部楼层 |阅读模式




试验目的:
完成2路ADC采样(PA1,PA2)通过DMA的方式,转换结果放入uint32_tADC_ConvertedValue[2]数组中。ADC_ConvertedValue[1]放PA1(ADC第一通道的值),ADC_ConvertedValue[2]放PA2(ADC第二通道的值)
具体配置:
捕获.JPG
捕获.JPG
捕获.JPG
捕获.JPG
捕获.JPG
程序分析:
首先定义数组存放ADC转换的值          uint32_t ADC_ConvertedValue[2];
在主程序中加入HAL_ADC_Start_DMA(&hadc, ADC_ConvertedValue,2);开启ADC的DMA功能。
疑问及需要注意的地方:
1、             ADC配置中,由于时钟是48MHz,所以ClockPrescaler为Synchronous clock mode divided by 4,这样ADC的时钟为12MHz(ADC时钟不能超过14MHz)
2、             End of Conversion Selection配置没有试出是什么功能。
3、             ADC_Regular_ConversionMode配置转换的通道数及采样周期,此处如果设成1,那么ADC_ConvertedValue[2]的2个数都是这一个通道的值。

4、             DMA配置中,如果选择Normal模式,那么只执行一次DMA就停止了,如果设置成Circular模式,就可以连续开启DMA。数据宽度设置为Word,外设地址不变,存储器地址加1。


评分

参与人数 1ST金币 +2 收起 理由
努力的人 + 2

查看全部评分

回复

使用道具 举报

该用户从未签到

1

主题

41

帖子

0

蝴蝶豆

初级会员

最后登录
2015-1-19
发表于 2015-1-8 08:54:59 | 显示全部楼层
谢谢分享,cube的ADC还没搞,一直用的标准库的ADC_DMA
回复 支持 反对

使用道具 举报

该用户从未签到

41

主题

2582

帖子

282

蝴蝶豆

论坛元老

最后登录
2021-4-1
发表于 2015-1-11 22:54:20 | 显示全部楼层
还有一点疑问:ADC是12位的,其实DMA只需要用Half Word就可以了,但实际中HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length);
该函数中pData为32位的,也就是DMA必须配置为Word才可以
回复 支持 反对

使用道具 举报

该用户从未签到

19

主题

954

帖子

27

蝴蝶豆

论坛元老

最后登录
2019-7-29
 楼主| 发表于 2015-1-11 23:36:57 | 显示全部楼层
dsjsjf 发表于 2015-1-11 22:54
还有一点疑问:ADC是12位的,其实DMA只需要用Half Word就可以了,但实际中HAL_ADC_Start_DMA(ADC_HandleTyp ...

恩,是这样的           
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

156

帖子

0

蝴蝶豆

金牌会员

最后登录
2020-2-11
发表于 2015-1-12 06:56:44 | 显示全部楼层

我当时做ADC_DMA也有这个困惑,从函数原型来看是用32bit
回复 支持 反对

使用道具 举报

该用户从未签到

41

主题

2582

帖子

282

蝴蝶豆

论坛元老

最后登录
2021-4-1
发表于 2015-1-13 19:54:27 | 显示全部楼层
有没有用过硬件IIC,HAL库
回复 支持 反对

使用道具 举报

该用户从未签到

19

主题

954

帖子

27

蝴蝶豆

论坛元老

最后登录
2019-7-29
 楼主| 发表于 2015-1-14 15:30:14 | 显示全部楼层
dsjsjf 发表于 2015-1-13 19:54
有没有用过硬件IIC,HAL库

论坛有一个人发过,你可以找找
回复 支持 反对

使用道具 举报

该用户从未签到

2

主题

13

帖子

0

蝴蝶豆

初级会员

最后登录
2017-9-10
发表于 2015-1-29 17:59:06 | 显示全部楼层
dsjsjf 发表于 2015-1-11 22:54
还有一点疑问:ADC是12位的,其实DMA只需要用Half Word就可以了,但实际中HAL_ADC_Start_DMA(ADC_HandleTyp ...

pData不能是uint16_t的,因为DMA理论上是要有能力把数据“搬运”4GB地址空间里的任何位置,所以必须要uint32_t, 虽然pData是uint32_t 但是DMA从ADC的数据寄存器里搬运数据并不一定是按照32bit来复制的,而是根据Periphral 和Memory 的data width设置的,比如如果Memory 的数据宽度是Half Word那么dma就按照16bit递增地址来写数据
回复 支持 反对

使用道具 举报

该用户从未签到

41

主题

2582

帖子

282

蝴蝶豆

论坛元老

最后登录
2021-4-1
发表于 2015-1-30 11:46:44 | 显示全部楼层
sunlite 发表于 2015-1-29 17:59
pData不能是uint16_t的,因为DMA理论上是要有能力把数据“搬运”4GB地址空间里的任何位置,所以必须要uin ...

比如如果Memory 的数据宽度是Half Word那么dma就按照16bit递增地址来写数据

如果我要把AD值搬到一组16bit的数组中,应该怎么实现呢?
回复 支持 反对

使用道具 举报

该用户从未签到

53

主题

3438

帖子

61

蝴蝶豆

论坛元老

最后登录
2024-3-19
发表于 2015-1-30 13:08:29 | 显示全部楼层
学习学习
回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-19 14:51 , Processed in 0.186939 second(s), 43 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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