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

基于STM32F407和Cubemx的ADC采集+DMA传输实现简易示波器经验分享

[复制链接]
攻城狮Melo 发布时间:2024-6-15 12:46
示波器,厚礼协好贵,但是有时候还是很想看波形怎么办?我们可以使用STM32的ADC配合DMA连续采集波形数据之后利用串口示波器来显示波形。
/ i$ c" M9 T' r/ }' g" ?% y& `; I+ E+ b; h/ A0 V0 b" H5 q
本期教大伙如何使用STM32 关于ADC配置以及DMA配置。  R- a$ ]/ H. ^' y4 q7 x

3 M+ x. q8 ?) k3 S7 u 微信图片_20240615124558.png 2 u0 i+ u5 s" l( V; K: M7 n3 P
. ?  I' o1 ]; [# R, p' j' j
1. 什么是DMA?) \0 W, J+ D! L/ r+ x. L
Direct Memory Access(DMA): 直接内存操作!是一种允许外设之间或外设和内存之间直接进行数据传输的技术,相当于直接把数据搬到存储区,无需CPU的干预。这提高了数据传输的效率,同时释放了CPU用于其他任务。
( O' b! P/ p1 \2 n  I' s1 z  t
+ E) _# X2 C6 D& R" E. |! t
2. STM32中的DMA特性:
' w/ D, |$ M  p8 I多通道支持: STM32的DMA控制器通常支持多个通道,每个通道可以连接到不同的外设或内存区域。
0 q1 a3 V& f# o$ z内存到内存传输: DMA可以在两个内存区域之间传输数据,而不涉及外设。
& f. `4 a4 r; p& J1 r' R3 m- {) Z内存到外设传输: DMA可以从内存传输数据到外设,例如将数据发送到USART或SPI外设。' T* A, K2 z7 }7 v$ \' ~3 ^
外设到内存传输: DMA可以从外设接收数据并将其存储到内存中,例如从ADC获取数据。' v5 ^4 N! @0 N7 S+ ]1 q- r# X' \
循环模式: DMA支持循环模式,即在传输完成后重新开始,无需重新配置。+ S( s' N, i8 d# T) R
传输方向和数据宽度: DMA支持不同的传输方向(内存到外设、外设到内存等)和数据宽度(8位、16位、32位)。) |( k/ q4 K6 D" V' n6 P
& w" w/ b- q+ Q7 V* N. P/ L2 ]
3. DMA的工作原理:
5 h0 [4 V, L% g" q* b+ y# P配置: 在DMA传输之前,需要配置DMA控制寄存器,包括源地址、目的地址、数据宽度、传输方向等。4 ^& `5 B5 @( O; p. c0 x+ t( M/ z
触发: 一旦配置完成,DMA可以由硬件或软件触发开始传输。(本期我们选择软件触发)
! ~( j% e* a5 ~3 h" z中断: DMA传输完成时,可以触发中断以通知CPU。7 ?4 Z/ h- y6 c6 I6 O/ r  `1 L
循环传输: DMA可以配置为在传输完成后自动重新开始,形成循环传输。
0 ?: G, k8 C6 H8 i9 @; N, j( Z: Q, V$ ^. H3 ^- j- |# c
4. 应用场景:# Q# }" y. |5 E" l. ]. e+ B; k
DMA在需要大量数据传输的应用中特别有用,例如音频处理、图像处理、通信协议等。) M) V. {/ q* f2 V

: M+ Y6 W0 R3 Y8 L& k& k4 I0 q
' z$ L2 z2 }* ]/ o) x
内容实现1 q) O! |: \; }% X  x
时钟配置$ Y$ Z& w  w* c5 w

+ t3 |# s$ ^8 f! O% L5 b 微信图片_20240615124555.png
/ Y+ l# E+ ~/ [, {4 Q, d/ ?% x5 x" v  D/ |- U1 Y
微信图片_20240615124552.png $ c' S  U9 z1 `- t6 E

" Y5 W# F) t) }, H0 e首先在CubeMX中选择我们的芯片,配置好时钟树以及时钟。
* J% ^3 l. x& b6 x1 q- ?' x! P& z4 L! O! B0 R
引脚配置以及DMA配置" u' e6 Z8 r6 x; u& E( z
4 h7 B! d0 E! E8 O1 d. r
微信图片_20240615124549.png
5 |6 y8 j0 d; l. ^- n4 N0 N( P! H

7 q7 |. U1 z" b% d将PA1(或者其他IO)配置为ADC_IN以及模拟模式。
7 P: k* s+ w0 P0 R  W' Q2 [1 Y$ X! K2 |- I, j4 J) R/ t
微信图片_20240615124545.png " m7 e8 c7 K! q  w9 r( a
  k* m2 o. l) U  r0 D6 h( M
在ADC配置中,开启DMA传输,模式为循环模式!9 a) G- \* c5 v6 C" f3 g" m2 X
6 e0 V; u! k' O, k
微信图片_20240615124519.png
' I+ h7 G3 z' V: B% H3 s8 b

2 L: ^5 o" q" k7 M开启ADC连续转换以及DMA请求~, u+ B8 z" P- Y# j. q* @8 y2 u; [
防止ADC只采样一次以及DMA只工作一次。
* ]) Z, f  {2 o" Q+ B( r/ h6 R0 Z  v7 S2 a* P' `
工程内容
: S+ R) p) n8 J5 P( G4 P' K5 t接下来就是创建工程了。) v' F8 l4 n; O) q+ A

! P* N$ w8 v5 a- n6 j( `: H; f0 J1 P 微信图片_20240615124515.png 2 H% o$ M7 Q: B

$ g" S  b8 H4 d0 t2 F6 L定义一个全局变量来存放DMA读取的内容. q+ I( z4 I( F! j( ]" x; N
" U8 P4 x) |0 v; `/ r
  1. HAL_ADC_Start_DMA(&hadc1,(uint32_t *)ADC_Value,100);
复制代码
3 n4 A! u% l- Y$ q* m/ B
开启DMA,传入相关参数和存储区。7 x. m& D( N8 h& T
  1. for(int i = 0;i<100;i++)& i& b" x- p+ ]+ O1 \
  2.     {% f+ s# o; p3 \/ `, g2 |- c9 j' I
  3.       printf("A:%d\r\n",ADC_Value);
    5 F2 ]4 K5 o& W/ t
  4.     }
复制代码
3 }6 \/ ]8 T- u4 S' z
在While中打印存储区的内容,之后利用我们的串口示波器查看波形。) R5 z9 m+ }5 |+ q) `( N

2 `4 E& I: i: \! y/ s' V6 |1 y 微信图片_20240615124512.png , E( X& w# k& n8 z) O. _! p2 p
$ m7 U3 e2 U* k5 ?4 `4 ~; R
转载自:电路小白6 s# t6 p% S. s- H

* K/ J' z9 c6 u# i$ C: U3 d如有侵权请联系删除
1 x+ q0 \) V, j, F8 h8 A1 a
! t/ \8 H% y/ c8 V0 z* e; P+ G1 }: A  U  a$ M; r
3 T/ Z+ I, _$ y: I) o* E# L
赞 收藏 评论0 发布时间:2024-6-15 12:46

举报

0个回答

所属标签

相似技术帖

官网相关资源

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