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

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

[复制链接]
攻城狮Melo 发布时间:2024-6-15 12:46
示波器,厚礼协好贵,但是有时候还是很想看波形怎么办?我们可以使用STM32的ADC配合DMA连续采集波形数据之后利用串口示波器来显示波形。/ W5 ^* v1 l1 G6 ^4 X9 b% S

! S! l! F8 O: `6 C; Y
本期教大伙如何使用STM32 关于ADC配置以及DMA配置。
6 j/ d, d2 m8 g- H
! _9 }  l5 N" R: E 微信图片_20240615124558.png . l+ u( F. {* u( s& V+ S/ C
2 [8 K1 ^. |* ~- M: B! d! {. {5 |
1. 什么是DMA?9 C+ W1 r# X9 I: o7 j' c9 o
Direct Memory Access(DMA): 直接内存操作!是一种允许外设之间或外设和内存之间直接进行数据传输的技术,相当于直接把数据搬到存储区,无需CPU的干预。这提高了数据传输的效率,同时释放了CPU用于其他任务。5 S* I* L! k8 e9 H# [

) s5 k# s; b) a, I: `2. STM32中的DMA特性:
) a% _' R. `/ V3 Q8 }3 @! C多通道支持: STM32的DMA控制器通常支持多个通道,每个通道可以连接到不同的外设或内存区域。( C+ s: L9 ]8 x! t: h" S' d* b, \
内存到内存传输: DMA可以在两个内存区域之间传输数据,而不涉及外设。
6 R) K7 P( Y! n3 \. b% X内存到外设传输: DMA可以从内存传输数据到外设,例如将数据发送到USART或SPI外设。
, R; [& I) u5 x  ~) r& ?  D外设到内存传输: DMA可以从外设接收数据并将其存储到内存中,例如从ADC获取数据。
9 B2 f; F1 D1 [+ _7 C: r% X循环模式: DMA支持循环模式,即在传输完成后重新开始,无需重新配置。
; M  q6 V) U! A$ z/ d传输方向和数据宽度: DMA支持不同的传输方向(内存到外设、外设到内存等)和数据宽度(8位、16位、32位)。2 h6 D6 j1 P6 R+ m, a4 [

; f. |: S' v, e: q3. DMA的工作原理:6 D5 L$ A3 L. A# \, X
配置: 在DMA传输之前,需要配置DMA控制寄存器,包括源地址、目的地址、数据宽度、传输方向等。; K" ?( G4 b1 Z: y# G; p; i
触发: 一旦配置完成,DMA可以由硬件或软件触发开始传输。(本期我们选择软件触发)  ^% f( O7 Y5 v
中断: DMA传输完成时,可以触发中断以通知CPU。
! {& K1 M5 R- {( n0 r# i循环传输: DMA可以配置为在传输完成后自动重新开始,形成循环传输。5 L# q& ?  J5 \4 L! R: O

$ J5 o1 K( E) b7 s4. 应用场景:2 t. v( \6 k* ?) I: I
DMA在需要大量数据传输的应用中特别有用,例如音频处理、图像处理、通信协议等。6 q! k* J8 X. b7 m9 m

, r. ?  y# n& }
( A; S1 w  N5 Q: Z7 {3 Z
内容实现+ E8 R; v0 Y4 o8 a. z! `
时钟配置
/ l/ q4 @2 ^/ b% j5 C4 S3 a
0 W3 [/ X2 l( j4 c1 V" \ 微信图片_20240615124555.png 5 {1 ]$ v) a- D/ t0 N! ]" {
7 A  _) R( b0 j- P9 Z4 C( H
微信图片_20240615124552.png 8 J; f) r7 `% u5 i$ w! |) S
' o0 u6 b( a% s2 r( ^: V- N! b
首先在CubeMX中选择我们的芯片,配置好时钟树以及时钟。
& f. \7 ?  I1 y. {9 E% f
4 O  D8 ^& M+ e" ~+ M2 k
引脚配置以及DMA配置
' S; E" I% L1 J$ [; F6 [  Y" z- Y+ _7 f* w2 _) H
微信图片_20240615124549.png $ T# ^3 A, ~/ I

- ~4 c0 A, B& L+ e将PA1(或者其他IO)配置为ADC_IN以及模拟模式。
7 i- p8 H8 Q0 V
- v  o0 t5 K  n+ z 微信图片_20240615124545.png
7 r9 {+ R) T4 r& t" S

. M" V! ~, t; V1 k在ADC配置中,开启DMA传输,模式为循环模式!
1 v* J% e" @: H* v
* U+ x( }( T2 E" X( A' E 微信图片_20240615124519.png 7 U7 {+ z1 g8 P/ o/ \1 k, }# g
( @& o1 [5 n2 G/ K: ?) m
开启ADC连续转换以及DMA请求~; {) p2 [, E9 e6 K; C8 \3 [
防止ADC只采样一次以及DMA只工作一次。7 h, ]) }: |2 `: l; ?

  p& g7 L2 O5 G6 L- J
工程内容
! t3 U3 Y, a% u1 i' w接下来就是创建工程了。% Q) j5 S# \8 |$ c
( ~% l$ b3 l# f2 L3 a, ?4 k
微信图片_20240615124515.png
( B7 z, {3 `: G9 h7 ]; O) E; L
" i, I6 d4 m+ R+ E2 Y
定义一个全局变量来存放DMA读取的内容% z7 a1 c" k! T: Q, R1 ~2 q$ p

' L$ Z' v; R+ P  u) a$ Q8 o
  1. HAL_ADC_Start_DMA(&hadc1,(uint32_t *)ADC_Value,100);
复制代码

0 G7 @; M/ F$ |" ?. s" W5 ^3 x开启DMA,传入相关参数和存储区。1 L: @# J3 O9 [$ F1 T% ~4 p. H
  1. for(int i = 0;i<100;i++)
    4 L5 h2 Z: x4 ~* o
  2.     {9 b6 D7 I- }* V5 q3 Z' x
  3.       printf("A:%d\r\n",ADC_Value);
    $ H6 U; i, N8 k5 |
  4.     }
复制代码
. x' G% C7 C  F. U
在While中打印存储区的内容,之后利用我们的串口示波器查看波形。
% X/ [8 ^2 C" \; v0 P4 j) i7 S" ^- k9 f; T* D. v
微信图片_20240615124512.png
2 i# O9 f0 ^* W" W3 A9 `* G1 H* w5 p  A
转载自:电路小白3 H' x( @/ ?( ^. m5 z- p
+ P8 g) |8 [  y: d6 }
如有侵权请联系删除
; n; r9 c( |. A( l- G9 K: z4 N) {- d: e* d/ T
' v# h9 t1 g! U
8 G8 e# }) U& H
收藏 评论0 发布时间:2024-6-15 12:46

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版