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

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

[复制链接]
攻城狮Melo 发布时间:2024-6-15 12:46
示波器,厚礼协好贵,但是有时候还是很想看波形怎么办?我们可以使用STM32的ADC配合DMA连续采集波形数据之后利用串口示波器来显示波形。
2 J$ F# L+ I; k/ x3 J& [- p8 W! _* s& Y
" S3 o% K9 S+ C1 ^
本期教大伙如何使用STM32 关于ADC配置以及DMA配置。
7 O' W1 |9 ~1 i. ]. `
, ~' h: l, D" N1 ^' c, p5 k 微信图片_20240615124558.png 9 ~7 T% s* U! U! n( C/ c
% w( t* B# _) R9 M8 E/ c
1. 什么是DMA?2 Y: ?' C( @, p
Direct Memory Access(DMA): 直接内存操作!是一种允许外设之间或外设和内存之间直接进行数据传输的技术,相当于直接把数据搬到存储区,无需CPU的干预。这提高了数据传输的效率,同时释放了CPU用于其他任务。% X$ W9 w$ x8 B5 @( ^8 j

. z6 T; |' h4 Y; m2. STM32中的DMA特性:0 f, `# t6 q. n, E7 U
多通道支持: STM32的DMA控制器通常支持多个通道,每个通道可以连接到不同的外设或内存区域。
+ d, J: i3 K) p. A; M内存到内存传输: DMA可以在两个内存区域之间传输数据,而不涉及外设。& j1 G# Z# p! O- B6 a) h
内存到外设传输: DMA可以从内存传输数据到外设,例如将数据发送到USART或SPI外设。  u  {8 ~: \2 O% [
外设到内存传输: DMA可以从外设接收数据并将其存储到内存中,例如从ADC获取数据。
# a! t4 D* @* V+ v8 q5 Q循环模式: DMA支持循环模式,即在传输完成后重新开始,无需重新配置。
; z8 A, P; Y& W$ R" }4 E/ W传输方向和数据宽度: DMA支持不同的传输方向(内存到外设、外设到内存等)和数据宽度(8位、16位、32位)。7 O0 a) v4 r9 t2 X) T/ T# |8 @
+ V; H  p2 I6 E% m; x- z
3. DMA的工作原理:& _  b- m, ~& s  f
配置: 在DMA传输之前,需要配置DMA控制寄存器,包括源地址、目的地址、数据宽度、传输方向等。; b2 l( r& S3 |& L) g
触发: 一旦配置完成,DMA可以由硬件或软件触发开始传输。(本期我们选择软件触发)
) A  K! O2 z$ t中断: DMA传输完成时,可以触发中断以通知CPU。0 O5 ]* P/ {- _- o3 y
循环传输: DMA可以配置为在传输完成后自动重新开始,形成循环传输。( _, P# \! j4 y

+ a, R  g& F/ q4. 应用场景:% D9 Y3 l! e! m! h- E8 `
DMA在需要大量数据传输的应用中特别有用,例如音频处理、图像处理、通信协议等。
" ~3 u4 H/ B- v3 }! r) p6 p/ [! Y6 K$ L. G8 M

+ H; X; P( H( r+ Z) ^; s内容实现
' x7 [: U& N' P' p5 j8 `时钟配置
$ P. q+ }  [9 l; y: H6 r& u+ j
! ]: V1 }" w- e0 P+ p$ S 微信图片_20240615124555.png 8 Z. D: f$ h# F$ Z) T" V, E6 Q' `
/ E6 [: n& g0 G* H1 C/ U( C
微信图片_20240615124552.png + `, G8 B. r* J/ `  y9 ~# b$ G0 h! ]

$ V! W2 q& N: h首先在CubeMX中选择我们的芯片,配置好时钟树以及时钟。
0 o" u6 L! q7 y2 N  ?2 Z% g2 |- u& g
引脚配置以及DMA配置+ {1 s  S; Z; ]8 k
% S1 P8 C% N9 R5 }
微信图片_20240615124549.png
8 y2 j9 S( i9 g
' ?* O4 P6 ^0 k0 I6 q
将PA1(或者其他IO)配置为ADC_IN以及模拟模式。
' B0 l3 W+ F6 ^7 E' e
# s$ m7 ~( g1 d3 r* ~& q 微信图片_20240615124545.png ( y, R! g9 v2 s* l. N7 d# G- Q

' p) o# s: c0 h! L4 h  p在ADC配置中,开启DMA传输,模式为循环模式!
; {) g$ y: R" R" z3 f0 Z0 }) [5 v2 }. k3 a2 T
微信图片_20240615124519.png $ j- ~  u( ~& o! f( F5 P
" W4 E5 k9 Z/ i/ t" T2 B+ u$ D- f
开启ADC连续转换以及DMA请求~" d; C! m5 z  L$ T; t! ]' _
防止ADC只采样一次以及DMA只工作一次。
/ d& C% ]% U7 b8 a; G2 C
& J+ A% a6 n, X% ^
工程内容  W0 S& T; Z+ n! t4 Y
接下来就是创建工程了。. E3 M$ O8 X( K6 R" Y7 q7 E8 Q

2 ~# r+ K' P/ n- H, | 微信图片_20240615124515.png
& B0 z4 v+ C# W$ q

/ z- m0 ^- O4 t定义一个全局变量来存放DMA读取的内容
  n6 \; x- j+ a) P) b1 E
6 V' M. `+ l; Z- c
  1. HAL_ADC_Start_DMA(&hadc1,(uint32_t *)ADC_Value,100);
复制代码
* O7 H$ S* q8 Q5 v& ^4 D/ c
开启DMA,传入相关参数和存储区。' \, E. |0 \1 _7 ~* ?" q* j; A3 l
  1. for(int i = 0;i<100;i++)
    & q/ q4 }3 r& g: M/ R5 I  i
  2.     {, T' R  W+ L7 {' N5 L# o
  3.       printf("A:%d\r\n",ADC_Value);! Z6 H- z! o- K1 K- h' p  E
  4.     }
复制代码

9 `9 j8 O; ~% t在While中打印存储区的内容,之后利用我们的串口示波器查看波形。
1 f8 S' Z' M7 g" L: C/ _- z: F3 Z0 p! k6 B5 s) b1 U/ i4 t
微信图片_20240615124512.png
* p& w6 i5 Q0 u; S. r2 `( k# [6 Q( d/ ^9 N
转载自:电路小白
# N8 J. w; k$ B; m6 l8 |- f+ d' S/ _% F6 U
如有侵权请联系删除4 r) a# j9 _9 U1 J; \

: m4 ]+ k8 t8 }: e/ K% `: k9 \/ K. M

! F' O+ v  C, F3 F
收藏 评论0 发布时间:2024-6-15 12:46

举报

0个回答

所属标签

相似分享

官网相关资源

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