请选择 进入手机版 | 继续访问电脑版

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

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

[复制链接]
攻城狮Melo 发布时间:2024-6-15 12:46
示波器,厚礼协好贵,但是有时候还是很想看波形怎么办?我们可以使用STM32的ADC配合DMA连续采集波形数据之后利用串口示波器来显示波形。
) w  p; ^# U* \0 m
: t1 R+ K  i' B7 k8 K
本期教大伙如何使用STM32 关于ADC配置以及DMA配置。
1 F0 n" g" n$ w) M$ ~! l3 A7 W# N- c/ E
微信图片_20240615124558.png
9 z9 U* j2 Y$ _1 `) {) j9 j; K2 x' N
6 `5 F$ b0 s6 j
1. 什么是DMA?6 K* O# _( @0 e# H
Direct Memory Access(DMA): 直接内存操作!是一种允许外设之间或外设和内存之间直接进行数据传输的技术,相当于直接把数据搬到存储区,无需CPU的干预。这提高了数据传输的效率,同时释放了CPU用于其他任务。- k6 |8 U7 V) V2 p

  E/ J- v' b4 M2 E+ j2. STM32中的DMA特性:) H0 P% c) |1 \
多通道支持: STM32的DMA控制器通常支持多个通道,每个通道可以连接到不同的外设或内存区域。. @2 \6 f" }6 x. h; t6 e
内存到内存传输: DMA可以在两个内存区域之间传输数据,而不涉及外设。
. C0 Q  K! U8 \5 i内存到外设传输: DMA可以从内存传输数据到外设,例如将数据发送到USART或SPI外设。" I2 G5 c. i* h. e: B  D
外设到内存传输: DMA可以从外设接收数据并将其存储到内存中,例如从ADC获取数据。+ i9 {+ r0 G( S& W! T
循环模式: DMA支持循环模式,即在传输完成后重新开始,无需重新配置。
4 F. L: R0 H9 W; c( i传输方向和数据宽度: DMA支持不同的传输方向(内存到外设、外设到内存等)和数据宽度(8位、16位、32位)。
( I. n& C& ]; i& K1 V
  t$ Q& k: K0 B3. DMA的工作原理:$ Q; z2 }. G* u) _# \5 Z) @) B
配置: 在DMA传输之前,需要配置DMA控制寄存器,包括源地址、目的地址、数据宽度、传输方向等。
/ F; @' W; W. a6 }& {' `触发: 一旦配置完成,DMA可以由硬件或软件触发开始传输。(本期我们选择软件触发): j9 W3 d* Y- y2 ]- r
中断: DMA传输完成时,可以触发中断以通知CPU。3 J/ p8 k2 F- w/ t/ X6 t
循环传输: DMA可以配置为在传输完成后自动重新开始,形成循环传输。
7 j: {- k% q! S. d. c4 Z/ X4 L0 l! Z" O% a
: K5 W$ {0 u9 ?, N4 S4. 应用场景:
7 r% r7 ~  \- K9 D* CDMA在需要大量数据传输的应用中特别有用,例如音频处理、图像处理、通信协议等。1 z# i$ o. V: O1 t

, N, U, ?# g1 Q8 T" G
5 y3 z6 n: o% M5 v+ E
内容实现* ~- s2 h! }! |* U0 o
时钟配置; P' h2 J0 c* |  y5 Q" y" S
" q- d# Y. \) h
微信图片_20240615124555.png
2 i5 N/ l! _7 V! W6 c- x8 H. m( j9 g+ K% u0 g$ }
微信图片_20240615124552.png $ F/ N8 R( f0 f. q  w, r) x8 E% I. G
$ M3 J+ l" y6 K9 c. p: |
首先在CubeMX中选择我们的芯片,配置好时钟树以及时钟。
, H' a" L% o/ Q9 k+ d8 N, i8 c4 ~% i
引脚配置以及DMA配置2 N9 v8 Z4 z) j

9 t! a4 C! _3 [- D 微信图片_20240615124549.png
5 H/ Z8 h0 q6 F9 U+ j+ g. c& R
/ v9 r: o* w5 k$ c" y2 M6 a7 N
将PA1(或者其他IO)配置为ADC_IN以及模拟模式。
! J7 B' g  A/ G: n& E) L
2 z% R) J' b  j. o1 i+ H  X 微信图片_20240615124545.png 7 h! n+ n& n' }* a- c) d9 |5 \
# W* H6 e, l5 U- E: ^9 |
在ADC配置中,开启DMA传输,模式为循环模式!: j7 {7 b  W# f0 X; d. \

( D/ @( |5 X" m7 k/ G4 | 微信图片_20240615124519.png , T& l; b* T% [9 ^, M
4 H' n# O3 x4 X* e
开启ADC连续转换以及DMA请求~
' W0 @# c" ], W; M8 _' k防止ADC只采样一次以及DMA只工作一次。' |0 _, A$ T# T+ H( h: ?; D- L

  F5 z! ^& {0 D' w; u& u) u) ]( [% L) O, V
工程内容. V1 {( q7 u( N, t
接下来就是创建工程了。5 c. \' x+ c; ]9 C( q# P! J
  g$ Y) O* L! @$ [; |) \6 F$ d' X% C. }
微信图片_20240615124515.png . g% b* S& t* @

$ f; ^, H+ e# d  p  x7 d定义一个全局变量来存放DMA读取的内容
2 w& `' n- T7 B. {( M9 x
, r' z" F4 t0 F4 V3 ?
  1. HAL_ADC_Start_DMA(&hadc1,(uint32_t *)ADC_Value,100);
复制代码
7 H0 l, f6 a0 f3 b
开启DMA,传入相关参数和存储区。
$ L3 s- w3 @* Q  ~5 f% O4 ^5 q6 A
  1. for(int i = 0;i<100;i++)& Y$ e* b  u; e' G  R! F
  2.     {2 B  Q* f" G0 S) L4 R
  3.       printf("A:%d\r\n",ADC_Value);
    : B6 m/ s7 y7 P
  4.     }
复制代码
: F. n, X; \2 n% p* g3 \
在While中打印存储区的内容,之后利用我们的串口示波器查看波形。6 r. A* F4 A9 z' [! C

; z" }; o9 D( o4 V! C 微信图片_20240615124512.png 9 s( v2 \% K9 G3 G

2 D6 b# m, _* L" i2 B转载自:电路小白9 ^0 D" m: a) M4 R" r) \# m
( ~: |9 N, i; s) z5 J
如有侵权请联系删除' J+ P$ d6 n6 E" j; w4 A) _. F
8 T  Q- K9 j+ X0 ^' B3 R9 ]
- p) c+ F5 p$ y2 {$ L

, z/ u* `* U/ {' P
收藏 评论0 发布时间:2024-6-15 12:46

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版