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

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

[复制链接]
攻城狮Melo 发布时间:2024-6-15 12:46
示波器,厚礼协好贵,但是有时候还是很想看波形怎么办?我们可以使用STM32的ADC配合DMA连续采集波形数据之后利用串口示波器来显示波形。
; D0 g7 u  [+ s% c6 p# P4 @+ m, z- N0 Y7 N
本期教大伙如何使用STM32 关于ADC配置以及DMA配置。
. `7 M" C( n: w- A& s4 X2 T7 a. G+ O7 l. C7 v: Z4 G0 x; {4 b" c
微信图片_20240615124558.png
; w& s) W; s' V

4 H- E( A* p, Q! r7 @" c: _1. 什么是DMA?4 X2 C7 `; \6 M9 h! \
Direct Memory Access(DMA): 直接内存操作!是一种允许外设之间或外设和内存之间直接进行数据传输的技术,相当于直接把数据搬到存储区,无需CPU的干预。这提高了数据传输的效率,同时释放了CPU用于其他任务。: ?; N& }( \4 v, a
0 ]- j3 Y& }% @  c
2. STM32中的DMA特性:$ F8 _, a, v7 A1 y& K- o
多通道支持: STM32的DMA控制器通常支持多个通道,每个通道可以连接到不同的外设或内存区域。
$ O7 f' z$ f- I内存到内存传输: DMA可以在两个内存区域之间传输数据,而不涉及外设。" H; s" ~2 \# [0 A
内存到外设传输: DMA可以从内存传输数据到外设,例如将数据发送到USART或SPI外设。
( |7 N$ v# N1 k, }# j+ G/ {/ u- W! e外设到内存传输: DMA可以从外设接收数据并将其存储到内存中,例如从ADC获取数据。4 y5 c* j3 R1 V8 J0 T; [- [
循环模式: DMA支持循环模式,即在传输完成后重新开始,无需重新配置。' [! g- ?+ Z$ H: j$ c9 f
传输方向和数据宽度: DMA支持不同的传输方向(内存到外设、外设到内存等)和数据宽度(8位、16位、32位)。
; m* W" T: c) {4 G
  [- u' g2 y2 C' y3. DMA的工作原理:9 C! G; z$ A. _$ T9 k4 r- Y
配置: 在DMA传输之前,需要配置DMA控制寄存器,包括源地址、目的地址、数据宽度、传输方向等。" W5 a2 i+ J# G# V
触发: 一旦配置完成,DMA可以由硬件或软件触发开始传输。(本期我们选择软件触发)
  N5 x% D" \7 ?0 ?0 Z' \中断: DMA传输完成时,可以触发中断以通知CPU。
! v  v+ U, p5 Y& ^* Z) z循环传输: DMA可以配置为在传输完成后自动重新开始,形成循环传输。9 M# |" q; k/ T/ [/ Z1 ^( i
$ z7 b  v2 g$ G  q8 }5 c& |& W! i
4. 应用场景:
9 h1 v8 p$ l" O# K  E- KDMA在需要大量数据传输的应用中特别有用,例如音频处理、图像处理、通信协议等。
- g* [/ i+ C3 p$ V* {
% h1 w7 M  P" h5 S4 z

0 g+ d6 P- P6 d! S. {- c内容实现
: A; x6 B1 M$ D* H1 P+ ]时钟配置6 v8 r; N, K% {7 f& h2 ^

( j$ R& s9 E2 A: W+ Y+ r' K+ c 微信图片_20240615124555.png ' L. g- c2 k; D6 m! F9 B

3 K4 H2 b/ \" _0 k" d 微信图片_20240615124552.png ( b9 j/ D. W# `9 K' k

4 j4 i0 H5 F6 g首先在CubeMX中选择我们的芯片,配置好时钟树以及时钟。% n4 G! |3 ~) A0 s+ ^3 C9 T
/ ^; R: A: M8 b) m+ f. ~: e
引脚配置以及DMA配置+ {8 ?- C, v' C  c1 y

. |& e% R, a6 h" z- a 微信图片_20240615124549.png
& s4 V% k; Q; m

0 Z$ N0 t6 R# _% I  [将PA1(或者其他IO)配置为ADC_IN以及模拟模式。
* d/ h4 Q2 [. W; a- |5 P
! b% A6 N; W/ \5 W 微信图片_20240615124545.png
; ~( G* T1 I- M+ c
6 e5 X. E( d5 T& d4 p* u
在ADC配置中,开启DMA传输,模式为循环模式!7 s% `: ]# Z, S! V5 z
" m8 @- y3 F# V
微信图片_20240615124519.png 2 }& [' J  v! h1 D* J
4 m/ G( b; }2 b: v0 n, t; H) A( n
开启ADC连续转换以及DMA请求~/ v6 A/ `. y3 l# K
防止ADC只采样一次以及DMA只工作一次。: p" T8 C5 j9 A% ^% A* Q
) e  r& r7 v  ?
工程内容  H" B) P/ f8 s6 A1 b1 M
接下来就是创建工程了。$ J" |0 x8 h" x# L

+ S1 X7 f% J' j6 ` 微信图片_20240615124515.png * I! W: H5 q, k3 {

  H' F' C& a0 Y/ z8 e% D2 t; N8 J定义一个全局变量来存放DMA读取的内容
/ O9 N/ n3 `8 C; P3 `4 [5 [, z. X9 V" h) e9 D- g
  1. HAL_ADC_Start_DMA(&hadc1,(uint32_t *)ADC_Value,100);
复制代码

& M% t0 O+ S) Y$ ?5 g- T开启DMA,传入相关参数和存储区。) B! Y6 P" Z9 U; y6 H: p6 s+ n
  1. for(int i = 0;i<100;i++)5 L/ G. G& f# P
  2.     {$ V, @" a! O* p% V5 \9 ?
  3.       printf("A:%d\r\n",ADC_Value);! o. T* {+ j$ v; L, I4 |
  4.     }
复制代码
. p1 S' W1 {0 D" w* ^; v2 i+ J
在While中打印存储区的内容,之后利用我们的串口示波器查看波形。* T* g" c: w1 I. N
; v7 T4 D/ r( i  u3 r
微信图片_20240615124512.png * Y+ I4 R- L  p

: Y% z1 B& }; J9 _* @0 a转载自:电路小白
! ^/ D4 O$ M! R8 L9 Z% |! T( [8 }: D8 \" V6 ?
如有侵权请联系删除
! K" @* p3 w+ a6 P8 ?  ]& ^7 x! z2 R5 ~- P( x* N2 j9 [

  A) L: B' D. d, u8 }% o( S  [( \4 l6 D% v
收藏 评论0 发布时间:2024-6-15 12:46

举报

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