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

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

[复制链接]
攻城狮Melo 发布时间:2024-6-15 12:46
示波器,厚礼协好贵,但是有时候还是很想看波形怎么办?我们可以使用STM32的ADC配合DMA连续采集波形数据之后利用串口示波器来显示波形。
6 b8 X. ~$ M/ A4 E/ q# b' B0 |
+ q; \! E, i1 ^0 g" {  L) x
本期教大伙如何使用STM32 关于ADC配置以及DMA配置。& a5 Q8 `2 v: f& D' K
# }8 L! z" L( F7 k1 S
微信图片_20240615124558.png 4 A' f7 O1 K6 v: _
, V8 S4 C7 s. u  ?6 A$ n& m
1. 什么是DMA?$ k5 _6 L+ {# V
Direct Memory Access(DMA): 直接内存操作!是一种允许外设之间或外设和内存之间直接进行数据传输的技术,相当于直接把数据搬到存储区,无需CPU的干预。这提高了数据传输的效率,同时释放了CPU用于其他任务。- Q% J3 U. m5 [( Q1 D* P) V

# ?" Y0 r1 i* @1 d2. STM32中的DMA特性:
; Z( ?) P/ V6 }! E8 N* {1 w8 \多通道支持: STM32的DMA控制器通常支持多个通道,每个通道可以连接到不同的外设或内存区域。
8 @- m3 K# d) X% ?. t# Q内存到内存传输: DMA可以在两个内存区域之间传输数据,而不涉及外设。! ?! A. v5 p* |& g$ X# O
内存到外设传输: DMA可以从内存传输数据到外设,例如将数据发送到USART或SPI外设。
/ x0 |( o, q5 _& A( c% c% C外设到内存传输: DMA可以从外设接收数据并将其存储到内存中,例如从ADC获取数据。/ @/ @& n  W/ L3 q1 r" S
循环模式: DMA支持循环模式,即在传输完成后重新开始,无需重新配置。; a/ G2 L/ i# G* S( k0 Z
传输方向和数据宽度: DMA支持不同的传输方向(内存到外设、外设到内存等)和数据宽度(8位、16位、32位)。% G3 c6 N. D" Y0 \$ J. k5 i
- }0 d! P4 }& h' n( s( b- @/ r
3. DMA的工作原理:$ v+ ?1 p& d+ ~9 ?0 M2 M' L
配置: 在DMA传输之前,需要配置DMA控制寄存器,包括源地址、目的地址、数据宽度、传输方向等。
$ a& D3 y+ q9 j- T) a" @4 c) k0 V7 f2 k触发: 一旦配置完成,DMA可以由硬件或软件触发开始传输。(本期我们选择软件触发)
- y; L4 {1 A( y, P中断: DMA传输完成时,可以触发中断以通知CPU。
$ w; g( ^3 [9 d循环传输: DMA可以配置为在传输完成后自动重新开始,形成循环传输。
& ~3 X: J$ t2 N9 I
( A; d; Z% D5 ^4. 应用场景:
& q- R$ j  b* r! C" rDMA在需要大量数据传输的应用中特别有用,例如音频处理、图像处理、通信协议等。6 z, n' U. E$ Z* f2 x2 H! D
+ e9 s' \/ {1 T6 o4 {
1 L1 t2 x/ R  r+ ^" l9 p! }$ U
内容实现; R; J% ~% x( x
时钟配置
/ i$ o# b/ j* o7 K- G' Z
4 Q4 m/ q' g* u/ w) ~( J: g 微信图片_20240615124555.png
3 j0 R# e7 i% {" p1 @4 _1 V7 T
微信图片_20240615124552.png % ?1 i: N- v# Q* v
+ A2 B" U. E' v! G' Z: Y% t+ J
首先在CubeMX中选择我们的芯片,配置好时钟树以及时钟。7 W2 n$ [2 I1 Y
# Q$ A' Y! M1 Q( R
引脚配置以及DMA配置6 A  ]- D, g' O! g) i1 O( e* {) d' z
* n  A0 @+ X' [5 Q$ L2 E$ h3 o
微信图片_20240615124549.png
8 F  k' n9 T4 ]

9 `" S$ f# [8 q6 O4 {) S将PA1(或者其他IO)配置为ADC_IN以及模拟模式。
1 H1 P- n+ T6 i' o7 B, v1 g
' Z( w! j" \, ]# o9 i: e* ~. M0 w( l: a 微信图片_20240615124545.png 5 {$ U. w' ]1 [4 H2 \/ y. u( z. [) O

$ W9 N! B1 V& N' Y在ADC配置中,开启DMA传输,模式为循环模式!% s# T$ G: H! X7 @

" }; x3 l7 z% }5 F1 k; k 微信图片_20240615124519.png
7 a6 D9 p$ u/ g: ]  q+ c

2 B* E5 [/ o2 F) {开启ADC连续转换以及DMA请求~/ E) v2 M9 z$ L' ~  j+ L0 Q3 A' H
防止ADC只采样一次以及DMA只工作一次。
9 F/ A5 Y2 t" E" r+ Z6 s
$ A$ M$ J1 M: Z; J3 l: g: y
工程内容& q  `/ A! g, v" H3 C
接下来就是创建工程了。
: {3 Q/ S/ J. x3 K, z- m' R- b- B+ S: b6 C) ^% m
微信图片_20240615124515.png
+ ^) I: `: T$ X& C4 N' s
! \: D: v$ W9 e8 {9 W  R/ w+ ]
定义一个全局变量来存放DMA读取的内容+ Q+ g5 `0 m/ J" B

3 p* _7 y& F8 y8 ^, q
  1. HAL_ADC_Start_DMA(&hadc1,(uint32_t *)ADC_Value,100);
复制代码

+ \; m9 ?- N0 ^6 t0 H0 }开启DMA,传入相关参数和存储区。1 ~) _) b, \* o* O+ h& S4 b
  1. for(int i = 0;i<100;i++)9 P3 L8 y7 ]8 ~; X
  2.     {
    ' D  y+ k/ {/ L  i  m/ j+ S
  3.       printf("A:%d\r\n",ADC_Value);
    3 E9 H% G) G3 M* e# n! @
  4.     }
复制代码
$ t1 F. d5 ^! F( `) w. o
在While中打印存储区的内容,之后利用我们的串口示波器查看波形。* w2 |, A# l- w2 ~1 X
: Q* W9 b; D% d( U
微信图片_20240615124512.png
3 W, L  H2 _4 x, c$ U% f
9 p+ t+ s% @0 ~9 i7 m# A: D转载自:电路小白# \) G  H$ J4 i7 }
: z4 e' y4 ~$ X0 a9 H) f, ~+ C
如有侵权请联系删除
9 r& `! W! A& e+ e' ^  q7 t3 m- o9 N2 @! C) N9 A

  k+ N' }( R- A$ a  e  c1 v$ o' o, b4 Y3 a8 X
收藏 评论0 发布时间:2024-6-15 12:46

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版