你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

采用STM32cube完成ADC的DMA功能  

[复制链接]
feiante 发布时间:2015-1-8 08:51

" I; R2 o1 ~" l! g- G$ u
5 E( u+ n. H. L2 S  k  D+ a# z( @% U. T  y' f4 Z+ [
1 V0 v2 k" W2 O4 v1 u
试验目的:
完成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个数都是这一个通道的值。
6 j* t& F7 x& G- |2 D: `
4、             DMA配置中,如果选择Normal模式,那么只执行一次DMA就停止了,如果设置成Circular模式,就可以连续开启DMA。数据宽度设置为Word,外设地址不变,存储器地址加1。

: d9 B2 |2 A$ E# K' S# J, {3 L& h6 l: d4 p9 L

评分

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

查看全部评分

赞 收藏 6 评论38 发布时间:2015-1-8 08:51

举报

38个回答
dark_ness 回答时间:2018-5-13 20:47:01
1.在ADC的DMA设置里,DMA字宽设置为半字:
6 O# F( R! R4 B4 W5 ]9 M6 t! {/* ADC1 DMA Init */
' I  L8 x& \1 Q" p    /* ADC1 Init */
, B0 y. `2 |" ^* H% K    hdma_adc1.Instance = DMA1_Channel1;) ?9 ]! O: E& b+ A
    hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;1 j! j9 R% i  `
    hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;+ N- L; B/ t+ K2 b
    hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
6 O( U0 p0 D( U, V* k    hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;- O5 I, n, G8 i7 g
    hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;- a+ i2 Y. t& K
    hdma_adc1.Init.Mode = DMA_NORMAL;( I& S, S1 v/ k7 T  @# e5 t
    hdma_adc1.Init.Priority = DMA_PRIORITY_HIGH;7 X& [$ }/ D3 Z7 `
    if (HAL_DMA_Init(&hdma_adc1) != HAL_OK)$ H) g$ h# A1 v1 W# x4 k
    {
2 [- k4 j  `! Y% Q/ t+ i4 C1 ^      _Error_Handler(__FILE__, __LINE__);
. h5 S& A+ j8 P) X. f6 R9 p    }1 f  r/ A. o+ ^5 d$ X! S

6 c" B. ?: v7 l* ^: s" f6 a; L    __HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc1);6 S2 i  q. B. o# e

2 T* h1 ^7 m7 b& E: z8 ?" I, p0 w( ^0 {2.存储的空间可以定义成uint32_t,word的数量可以要采集次数的一半:
3 q' o  F  P  ?uint32_t uhADCxConvertedValue[131];( y7 v* b2 U0 ^% u1 L; v8 h
3.启动DMA的时候,传入缓冲区的地址按(uint32_t *)传入。
: g' W. Z5 U8 p" o2 V. SHAL_ADC_Start_DMA(&hadc1, (uint32_t*)&uhADCxConvertedValue, 262);
2 J6 }" y2 I/ x! _  j* m" z* K4.这样进行了262次采样后,存放在uhADCxConvertedValue区域内的数据就是按16bit连续放过去的。9 b. ?  l# P/ u: D" r3 s
测亲的结果分享的。
sunlite 回答时间:2015-1-29 17:59:06
dsjsjf 发表于 2015-1-11 22:54
! @& Q4 `0 x& X% u8 r1 u还有一点疑问:ADC是12位的,其实DMA只需要用Half Word就可以了,但实际中HAL_ADC_Start_DMA(ADC_HandleTyp ...

2 L+ j$ G' e) n0 [/ `pData不能是uint16_t的,因为DMA理论上是要有能力把数据“搬运”4GB地址空间里的任何位置,所以必须要uint32_t, 虽然pData是uint32_t 但是DMA从ADC的数据寄存器里搬运数据并不一定是按照32bit来复制的,而是根据Periphral 和Memory 的data width设置的,比如如果Memory 的数据宽度是Half Word那么dma就按照16bit递增地址来写数据
sunlite 回答时间:2015-1-31 13:08:55
本帖最后由 sunlite 于 2015-1-31 15:28 编辑
0 w7 ]% ~& U+ u4 ?  v
dsjsjf 发表于 2015-1-30 11:46
0 |  Q6 }) q1 ?" J5 x! C' ^比如如果Memory 的数据宽度是Half Word那么dma就按照16bit递增地址来写数据
% r0 ]  R% _2 _/ ~: ]2 a7 u! u8 L# \9 ]
如果我要把AD值搬到一组16bi ...
  1. uint16_t ADC_ConvertedValue[2];% Z# q* }2 C: \- n9 \# G
  2. HAL_ADC_Start_DMA(&hadc, (uint32_t *)ADC_ConvertedValue, 2);
复制代码
你需要传给它memory的地址,那个地址必须是uint32_t的,  其实第一次看到这里我也傻眼了,我的buffer是uint16_t的咋办呢?后来发现它的memory 那边地址递增并不一定是按照word递增的* f; L; F  x/ b7 I5 d/ K5 A9 {! ]
kevin0129 回答时间:2015-1-8 08:54:59
谢谢分享,cube的ADC还没搞,一直用的标准库的ADC_DMA
埃斯提爱慕 回答时间:2015-1-11 22:54:20
提示: 作者被禁止或删除 内容自动屏蔽
feiante 回答时间:2015-1-11 23:36:57
dsjsjf 发表于 2015-1-11 22:54
6 G2 G4 t2 A" D# ?6 r7 t) J还有一点疑问:ADC是12位的,其实DMA只需要用Half Word就可以了,但实际中HAL_ADC_Start_DMA(ADC_HandleTyp ...

& m' f8 ~- q' w6 [6 M 恩,是这样的           
smcdh 回答时间:2015-1-12 06:56:44
feiante 发表于 2015-1-11 23:36
1 L& ~  R$ n9 C3 ]' i恩,是这样的
5 K2 n( a: Y# }! c$ v1 H; B
我当时做ADC_DMA也有这个困惑,从函数原型来看是用32bit
埃斯提爱慕 回答时间:2015-1-13 19:54:27
提示: 作者被禁止或删除 内容自动屏蔽
feiante 回答时间:2015-1-14 15:30:14
dsjsjf 发表于 2015-1-13 19:54' ?. I, M# ?. F6 A" h- n4 a
有没有用过硬件IIC,HAL库
* f2 o9 s% O; X1 T" ?7 v/ H
论坛有一个人发过,你可以找找
埃斯提爱慕 回答时间:2015-1-30 11:46:44
提示: 作者被禁止或删除 内容自动屏蔽
wyxy163@126.com 回答时间:2015-1-30 13:08:29
提示: 作者被禁止或删除 内容自动屏蔽
逍遥李 回答时间:2015-1-31 10:28:59
DMA了解不多,这个只能外设和内存之间传送是吗?外设和外设之间有办法实现吗?
时光碎了天 回答时间:2015-1-31 12:02:30
感觉很不错的,学习了的
拼命三郎 回答时间:2015-1-31 13:41:51
stm32.jpg
埃斯提爱慕 回答时间:2015-2-1 11:46:09
提示: 作者被禁止或删除 内容自动屏蔽
123下一页

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版