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

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

[复制链接]
攻城狮Melo 发布时间:2024-6-15 12:46
示波器,厚礼协好贵,但是有时候还是很想看波形怎么办?我们可以使用STM32的ADC配合DMA连续采集波形数据之后利用串口示波器来显示波形。# C+ p# [" p' t/ ?5 S
; A1 o4 w" N3 h. s( d% s
本期教大伙如何使用STM32 关于ADC配置以及DMA配置。  H: o. n( l7 Z

! ~; j' q. Q# u- _4 ~, g$ \ 微信图片_20240615124558.png ( v6 s$ g/ P& s' [" i: O* J! ?
, R$ G, H# H9 M" l5 O& T1 o' B
1. 什么是DMA?
/ Z& Z( @4 K* I1 }Direct Memory Access(DMA): 直接内存操作!是一种允许外设之间或外设和内存之间直接进行数据传输的技术,相当于直接把数据搬到存储区,无需CPU的干预。这提高了数据传输的效率,同时释放了CPU用于其他任务。
$ I- ?% r: H. d+ ^- v" z" z7 t

# ^$ f" L% V3 n, R+ g2. STM32中的DMA特性:" F& h7 N4 J4 Z3 y* C% |2 r
多通道支持: STM32的DMA控制器通常支持多个通道,每个通道可以连接到不同的外设或内存区域。
- l, d. q/ F# h5 g内存到内存传输: DMA可以在两个内存区域之间传输数据,而不涉及外设。+ Z3 }+ y) E7 z2 j, v
内存到外设传输: DMA可以从内存传输数据到外设,例如将数据发送到USART或SPI外设。
$ ~0 t3 e6 E5 ^外设到内存传输: DMA可以从外设接收数据并将其存储到内存中,例如从ADC获取数据。
6 I4 b8 {% ]( H: y. D1 c循环模式: DMA支持循环模式,即在传输完成后重新开始,无需重新配置。
( x( o6 \! N( H9 c3 [( g9 X& C传输方向和数据宽度: DMA支持不同的传输方向(内存到外设、外设到内存等)和数据宽度(8位、16位、32位)。7 s7 t$ S. [% b; x
  ?2 \; C  F2 B( J7 M
3. DMA的工作原理:( F' \! P+ r" x8 [. h
配置: 在DMA传输之前,需要配置DMA控制寄存器,包括源地址、目的地址、数据宽度、传输方向等。
7 l% S+ ?5 Q7 w+ c* J6 k触发: 一旦配置完成,DMA可以由硬件或软件触发开始传输。(本期我们选择软件触发)/ W2 c8 y2 j' m9 R
中断: DMA传输完成时,可以触发中断以通知CPU。
( f* e. p; \. M! o! R+ I循环传输: DMA可以配置为在传输完成后自动重新开始,形成循环传输。
+ m' F9 Y; E1 m; ~
: `: ?8 g8 b( @# Q4. 应用场景:
& N! b% s& E+ S/ q: ?' T! EDMA在需要大量数据传输的应用中特别有用,例如音频处理、图像处理、通信协议等。
" u. `/ y/ l$ D& f4 }) y4 h) r! c* q4 D. L& y0 q# \4 r* [. \
1 N) A  S* q, I% j/ u+ s
内容实现
8 t$ P! k9 Y% S2 p4 b时钟配置
, p* R( L: D1 S  a  K9 J4 a/ x$ _, t! t  ~# }  x5 C/ b  ?* ]7 _
微信图片_20240615124555.png # V5 z! Q, q1 \$ [( P  l

& V, j0 U+ ]1 B 微信图片_20240615124552.png
/ ?; p! |2 ~$ e5 o( y- |5 M& J% L; }% k/ S. ^8 Y7 x2 B
首先在CubeMX中选择我们的芯片,配置好时钟树以及时钟。
( X% G3 h/ b  j
" K: @8 `# d/ _
引脚配置以及DMA配置, V9 t  k9 C- R1 }7 ~/ H
. x* S3 F; c, T+ o; N! h
微信图片_20240615124549.png 4 ^! O( S4 @9 B5 ]* K' z# n, _
# ?2 u7 Q7 B: g
将PA1(或者其他IO)配置为ADC_IN以及模拟模式。
; Y- o. M2 t! T. T9 {: m( B2 [6 i% Y5 ?6 N' J5 i
微信图片_20240615124545.png / o8 x3 V+ t/ J, o; r- x$ t

2 _; h/ Y+ Q% p( f1 x/ ^在ADC配置中,开启DMA传输,模式为循环模式!! h, D3 b( E! [) g

$ I+ Q. |" S9 @: n, H: b 微信图片_20240615124519.png
1 q- r  ]& J" c: U7 R0 d

% |9 S4 T6 Y7 M- D7 D3 o  K开启ADC连续转换以及DMA请求~
- H0 t! l) `1 U2 U  {防止ADC只采样一次以及DMA只工作一次。
* I; H3 e7 q9 ^& i4 @6 @6 i. c
. b1 r7 ^+ \: p
工程内容
0 e% c8 E- u* v9 u7 ~接下来就是创建工程了。2 ?% i+ H. a8 B, g! M

2 x1 `( ]4 L; m( h; Q! ~. ]6 K 微信图片_20240615124515.png 6 O. ?( k0 g  L- n& z1 ?

* \, g% |; t: S4 z定义一个全局变量来存放DMA读取的内容: E' A; u! D2 w8 |
5 r/ k4 U4 B5 P% G6 U
  1. HAL_ADC_Start_DMA(&hadc1,(uint32_t *)ADC_Value,100);
复制代码
* w) U7 ~* K- t. E
开启DMA,传入相关参数和存储区。
5 e# q( k) u, L& k
  1. for(int i = 0;i<100;i++)
    6 \/ a6 ?3 ?" t
  2.     {
    . I) Q2 z$ S1 y- Z5 B7 f: W
  3.       printf("A:%d\r\n",ADC_Value);- L8 ~8 [/ \" M( \% j& L0 }' |8 i
  4.     }
复制代码
* f: f# N& s+ e2 M
在While中打印存储区的内容,之后利用我们的串口示波器查看波形。6 @: @4 M$ k6 W. _4 H. W2 k3 f

. `' B* k4 @* K6 Y9 D 微信图片_20240615124512.png
) a8 i+ r1 Y, F+ d4 n% _! q" @. @, P0 F9 s+ j2 X
转载自:电路小白
0 y6 z* \6 F, Y) f1 H* m" B8 m
" \, J. c$ r( d. ]8 e如有侵权请联系删除$ h2 F- i7 W; ^$ D
: k  t6 e9 d* c0 p

/ m6 o. V' U( a
6 X3 K; f8 K/ A- ~
收藏 评论0 发布时间:2024-6-15 12:46

举报

0个回答

所属标签

相似技术帖

官网相关资源

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