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

【经验分享】STM32Cube 数模转换AD/DA

[复制链接]
STMCU小助手 发布时间:2022-4-25 21:48
8.1 新建Analog工程
( u" p- b) o% Z" D8.1.1 新建工程文件

. ?. Z* s1 V3 T) b在桌面新建文件夹,命名为“Analog _Project”(根据实际需求选择文件夹存放路径和命名,其中路径不能包含中文),用于存放串口实验的工作空间。打开STM32CubeIDE软件,点击“Browse…”按钮,选择 “Analog _Project”文件夹路径作为工作空间存放路径,然后点击“Launch”按钮,启动运行STM32CubeIDE。
% ^) I: O6 e6 i/ e* Q& r0 s/ l+ V
0 L- ^! M1 x& q) C: I U1V8VYJN2[44K3]52)J4BAW.png
4 b2 c5 W% k  K7 O; y
; ^0 f$ Q( o5 _7 \点击“Start New STM32 project”按钮。8 j3 M, _9 x, X2 u3 U+ J% B

2 ]' t/ Q5 x, c5 x8 O4 k 2UF8G[T_GR{8N3TE4@]U16K.png
/ ~( V) P8 l) d0 H* n, E. Y6 o4 k
: q) I+ I, C% ^( K' h在搜索栏中输入需要配置的STM32芯片名称进行搜索,例如本文使用的芯片就输入“STM32H743II”,并单击选择对应封装“ LQFP176”,即可进入下一步。
! o0 P: ], S4 [! }% M# j, ~( s0 ?4 \4 y! P0 @: N
`OMOD{3L[))2L4U%QQ}%2LA.png   d9 J# x! M- ^+ C

4 x6 W) U8 d% `. J7 w- F在进入芯片详细页面后,可以点击“Block Diagram”或者“Datasheet”对芯片进行概览。在确认芯片信息与手头的芯片一致后,点击Next下一步开始配置芯片。+ n: J  f* E( E+ N  j) y

9 j: g; J' m9 o: ~% P 434a9d60cfb0447cbd43f27d738747c6.png # e9 A$ d1 \7 W# k
% q0 p' }$ h1 j, y# A( |
输入工程名,其余选型默认,点击“Finish”按钮。操作该步骤前需要保证网络正常,因为STM32CubeIDE需要下载对应芯片的数据包,也可以到STM官网上下载可离线安装的数据包。
# e5 a, h& W' A  w# Z1 C6 ^
5 s- E$ ^$ D# e( }1 @ )}8WO]}YJ(3IW)%{Y~V}R3P.png 7 u, m/ P) A  \4 O1 D. t
% Z( @- W# E1 \/ k8 J6 I* ]
点击“Yes”按钮。
! v6 [; X7 F2 h8 ]
9 d  P: }3 u$ H. { HGFK4FPB}`]@Y4H[P5T`CIL.png ) ~" |! O9 W1 L

) O% f! G, l3 [- H( E+ {点击“Project Manager->Code Generator”,将“Generated files”第1和第2选项勾选,其余默认。* Y0 S' x5 J& g4 y: L1 L

. N5 |" e  j* ~/ _5 x4 i7 I 7KLD~AMLO_1KAG09UQ)SYYO.png
0 }/ c7 v# Y' Z0 V$ U7 m" }5 M1 [; g
$ b& F# I+ X2 h$ o: ]点击“Pinout & Configuration->System Core->RCC”,在“RCC Mode”中将“High Speed Clock(HSC)”设置为“Crystal/Ceramic Resonator”,其余保持默认。0 b! Z  P' j* @' a4 s$ ]& q
4 w7 u* S- U2 S; Z4 M4 _2 J
IBKB3)$~D2P$}9EUJLXGF98.png
8 Z+ L; U- z, O$ w6 y; k# T( S: J
第一个选项High Speed Clock选择Crystal/Ceramic Resonator。其余选项无特殊需求不用打开。点击“Clock Configuration”,在“Input Frequency”输入“25”,在“PLL Source Mux”选择“HSE”作为时钟输入,在“System Clock Mux”选择“PLLCLK”作为时钟输入,在“SPI1,2,3 Clock Mux”输入“480”,然后按回车键,其他暂不设置,保持默认。; V6 H: q/ e1 H6 G9 x# p
+ W5 Q8 b8 |( S6 D
CG8[UYG216PQ1[[BJO3X]FC.png . K8 s! R, D; [( O
: h! c& g. r7 X5 p, E$ c
8.1.2 配置芯片内核
% l- i& H* z. Y( Z9 @" t+ A点击左边菜单栏“System Core”的“CORTEX_M7”进入M7的配置页面。: d8 A' p( C8 o3 \3 J2 ~
: c* X# g% u" t8 o7 E
24[RSR54JZD1XK%SQY`EOAR.png
8 X2 C* P/ a0 ]/ U* {9 Q1 l. u
) `" O5 Z  b8 FCPU ICache:使能I-Cache,用来缓存指令,选择打开。
0 l9 g# P$ |  E6 kCPU DCache:使能D-Cache,用来缓存数据,选择打开,其他选项不变。" p2 j" f# U) h' @7 ^
点击左侧“Trace and Debug”,进入“DEBUG”页面,用自己所用的调试方式,选的是“Serial Wire”。下面的选项是外部触发调试,暂且不开。
2 F% l7 S! P7 ]) x: Q- R$ I7 u4 w/ V' [. T
8[9$[8NN4C`B3LG@LIQZX1W.png
) S% t9 }/ r4 @2 O
' |) ?1 M5 d+ ?$ L, E8.1.3 配置串口传输数据

* v% g" A. e% X( _0 V6 e接下来对串口进行配置,将“USART1”打开。并开启USART1全局中断。
- J, h0 Q$ T" X& x1 H+ q7 c$ h" d( y- {5 y% B: p, k/ Y. t* ~2 R
GU%[S3){%R_EJEV{CVH$R9M.png
/ d( [+ p6 \1 t
/ ~+ Q  ]% c- ]' x, A3 `7 L/ w同时进入“NVIC”中断时序管理页面中,将“USART1”的中断优先度取到3。1 |; X& w$ ^) H  d) H
3 L) Y! m! J, W% K
`D4Y$JU37O(}8JXT@5JM[JG.png
  i2 W8 }; |/ _$ Y& N% v+ Y* Z4 B4 X& h8 q' g, s( B
同时找到PA9和PA10将它们设置为USART1的RXD和TXD引脚,方便USB读取。! P0 q6 m# @- q9 F2 w

1 \) m4 M) x7 x( e1 V& ] 94ZV%LG[QY@DJRXTDA4X5GP.png
1 _! ?  [8 M, j9 I点击“Project Manager->Code Generator”,将“Generated files”第1和第2选项勾选,其余默认。
7 N$ |, y8 Q. F, }% Y9 j. e9 k  r  ?8 A- ?- P+ I7 S8 ^$ w
42KS33V0QYLQB6%9Y[NJ)(C.png
( g7 Y/ _1 K; C3 r
$ Y% e2 x% ]3 t3 l' k0 B8.2 配置模数转换AD; \/ e7 `) T/ P1 S4 }, [* f  c- }
8.2.1 配置ADC引脚设置

5 c" l5 t# G/ O) }9 G5 D& Z首先搜索“PA0”,该引脚为开发板上“KEY_UP”按键,串联接3.3V电源,同时连接AD1的第16通道,这样设置ADC能方便通过按键来观察ADC读取的变化。
# l; A/ g" n( b3 G! a, E1 ], C8 Z搜索到“PA0”后将其同时设置为“GPIO_Analog”和“ADC_INP16”模式用于ADC模数转换。注意要同时设成两个模式,否则将无法启用。7 `7 x! u- v- n; _
点击右侧“Analog”-“ADC”,找到“IN16”通道,将其设置为“Single-ended”独立模式。
6 w- o) f7 q/ k6 p# }$ u+ u' ?独立模式模式下,双ADC不能同步,每个ADC接口独立工作。所以如果不需要ADC同步或者只是用了一个ADC的时候,应该设成独立模式,多个ADC同时使用时会有其他模式,如双重ADC同步模式,两个ADC同时采集一个或多个通道,可以提高采样率。7 E# C* y7 M% Q# R9 i8 J! P
同时在ADC_Setting中确认ADC位数为16-bitADC(部分ADC只支持12位)。- y$ S% H" R1 V" s

8 G' S" U: B1 v. n S~LF~8YYDA]06(2R~U~KH.png
. L, `* J0 Y* i% {" n7 t" a
: @, `0 Y) S* C$ S接着配置ADC的DMA设置使得其能减少CPU的内存占用量。0 p2 Z) t1 O! o/ M
! @, s8 h+ p9 n; r; Z
EHA`)Z]JZS`YK0LH)H{WRB8.png ' t; Q% m' v2 W7 [

8 Z" }6 c  I2 f& \. G与串口DMA一样,AD和DA也能开启DMA使用数据直接读取来提高传输速度。
  ]; {& P6 o$ ]6 i  v' a0 rDMA(Direct Memory Access,直接内存存取),用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无需CPU干预,节省CPU资源,ADC转换出来的值直接赋值给定义好的变量中,传输速度快。3 f4 C0 d& w/ k2 P

* Q8 @# K8 t5 b6 u' x# d YX9HVBZC22MMY50YVKP3B1Z.png ; K. \# \' I4 H' [

0 B$ H1 [0 z3 f, f% X同时还需进入“NVIC Setting”将ADC的全局中断开启,以用于判断ADC中断结束的时间,方便之后对于ADC读取数据使用。
$ N* k( R/ n: T( X9 V: [, E7 N$ ^8 M2 t% G/ O$ z
bd188ff859514339883f27515d6a08f2.png
& M' K2 B4 x; r: l: |0 d
$ x) \. N1 O/ h, M& o! s! o2 V同时我们还需要开启定时器中断,来方便ADC去定时读取数值返回到串口。
, |1 P7 E9 d% Y. S* O9 V% E点击“Timers”-“TIM1”-“Clock Source”设置为“Internal Clock”将定时器1使用内部时钟。; P% O1 i/ V0 B! D7 i3 O
将下方新增的“Configuration”将“ Prescaler”分频数设为48000,将“Counter Period”计数个数设为1000。由于系统时钟为480MHZ,因此将分频数设为48000得到10KHZ频率,10KHZ一次读数记10微秒,计数1000使定时器1在100ms时中断,并打开“auto-reload”开启自动清零。( @1 G  E( r) r: ?; W
% u! P% L4 u' e# X- N9 Y7 ~
7R~AXZ58EO5Z~(VP[K}W@`8.png " K- Y7 V0 z# Q  i( s
5 E4 D! Q1 c) [, ^  M1 s
接着点击“NVIC Settings”开启定时器中断即可。
, }5 N: Q% c" T& STIM1为高级定时器,开启“ update interrupt”即可。9 m5 Y9 ~+ P( q/ y$ h
, r, a2 \; _" V4 v2 |+ q
0e0de6a9db9646c88dc69c864ff8380e.png
; A* b; _. l- ^; k  e# }
% m# A+ D  l# H6 w+ v其余普通定时器正常开启定时器即可。
* ^. k  C- V( t! S0 y. P! B+ Q  w, H4 t
200ff9e2232c4e35becf7641c7469dc1.png 7 w  c* U' p% q  [# f8 w
9 F) j$ N. l3 S# ?  v5 B
之后便可保存并生成代码,开始在代码中用定时器调用ADC了。
2 x0 y. [6 C* \4 W8 u
( _& ~) D/ G; k! r" M+ k" w8.2.2 编写定时器调用ADC代码
! L* E& p# a: i
新建AD自己的HARDWAVE文件夹以及.c和.h文件,并添加路径调用。(详见5.8章)
+ [4 J8 V) T7 r- Y( }7 Q0 [' p: Z; }) r4 N7 c" p! {+ K2 L
86b70892d9e94d34b9eb96ef4ba2d6bf.png * q7 b- @5 T) c3 s6 b2 @
9 ^1 O3 U3 G  V1 D3 A3 C% x0 V/ f; {2 L
在“AD.h”中调用“main.h” 等一系列h文件
: c& I+ c2 y1 U4 M/ U
+ R! J+ D0 P- c 6f2830686aad488da1889447234edba5.png $ z6 C* x+ {( L% P' S
. W5 t5 _) q, }  e1 X+ T2 ]5 L
在“AD.c”中调用“AD.h”并添加中断回调函数“ HAL_TIM_PeriodElapsedCallback”。  G7 A5 q( b/ D3 j: A' R1 v; n8 g5 t
并在其中添加ADC采集开启的中断函数,定时器的使用请参考(7.2.1)。0 j/ u4 q* ^$ d: p! `) c! y
+ A  F4 L' @  Y9 m8 M5 Z# `4 R. R0 ~
96ac96ae5697484287a43102acf32a9d.png
" G7 y/ A6 d' m- \/ |
; O  F2 W; L1 P. U! T2 b2 L同时在main函数中添加进入定时器的调用函数,使得主函数开始就能开启定时器1。/ L- V4 t- C) x- _% p* v6 }! W
, s$ v3 {' U2 G
)GMMA0RYJ[699T`GNYWKZ{W.png 3 X+ b& w3 \( @7 f: S, i

, j; i/ n5 n3 y" [同时在下方调用HAL库中的AD回调函数,在进入AD的回调函数中时首先需暂停定时器功能再读取AD中的数据。$ H: N- l9 _3 ?% i5 z2 L, G

$ ^4 @7 c1 u5 d: V) M% n bd0b6a8b9b8f402ca3bd5e88cfecd522.png
& ]: e; t& O& Z3 `) A
+ t% x- T2 F, X  `$ |8 g接着我们需要配置串口,使得printf能输出浮点型字符至串口1。
' `, i. O8 M/ T4 W0 ]; l0 F# ^首先在main函数中添加代码,使得printf重定义至输出到串口1,详见(6.4.2)
9 d0 h6 [  t3 R9 D1 Z
" l# N" K6 C+ D* { _G`WM@G`9`4JS~)45G5(O7S.png
' f- D% r! Z0 I( G  Q6 c. }* C3 @7 e
" I8 T4 K) u, |. s* |! e1 X5 U# z接着右键点击项目文件进入属性界面找到“C++Build”中的“Settting”选择“Miscellaneous”并添加“ -u_printf_float”。/ v6 `: A4 [# v' x7 n0 M

. L, I) p, l: Q0 ~' z4 @) ^6 T _T(083BWG8U1KMYBXW5JG4S.png
; f/ h* H+ Y1 ^. v# F2 ~) ]7 }" q) ?. @/ [$ o' x+ L$ _; T8 V
e741f572e233441abd1634722a6bf88a.png 6 x7 J: O3 K* ~( W  o$ n5 d) d# H" x
4 n3 n4 ?- J" {7 Z2 l! X, U

  z, B6 H% T. K3 t8 y, @. b$ Y7 E4 ^同时还需在“Tool Settings”中的“MCU Settings”选择勾中允许浮点printf的选项。; o& f' t) A/ B3 \1 s# R

6 ?0 i5 ~& I" {3 a$ n% s7 O1 V, z fac0c1e5e53e4938940964e09355eec5.png 4 e$ E- K7 c' i
) A; a; \2 f6 L" u3 L8 L8 N* [
应用并关闭后,即可在AD中断中调用串口输出函数,将AD采集值打印至串口1。
1 r2 A& N+ U5 m, v4 R* H' ^- ?! \( T+ j* m- }5 z; M
6c15523f43c849bc8eacec88735e11f3.png
# a5 u% A! _3 r$ M8 b: [7 v" G& U: E. @
由于我们选用的ADC1为16位ADC,且参考电压为3.3V。
  I5 e+ D: n6 Q  L因此在printf输出时需要将AD采集到的值*参考电压÷(2的16次)65536。
$ E% d6 z3 u* K. u# l在烧录程序后,即可通过串口看到,(串口操作详见6.4.4)# K% C, H0 r/ A! F* u
使用的ADC连接了按钮的引脚,在按下“KEY_UP”后,电压由低电平转变为高电平,松开后ADC读取的高电平又转变为低电平。
! r+ N& w6 B* D- x1 Q1 }8 i
7 L. `' n  M+ h' Q& T 11c9c3f871c74c0f84e33bde1d35765d.png ; i0 L: B7 w5 \
9 t' ]; |) r! O$ v6 ^0 J
e9acd3793220405cb0dda052c5ee6caf.png $ g; i) D0 B  T1 r1 A, H
- m/ R2 ~1 b9 ]

6 Z1 y( {! c' @8 w" J3 g9 e* i: Z9 l. c! y

7 N; J7 ~6 z' M  i& Y: Y3 u) b. n7 z' d' H. ?
赞 收藏 评论0 发布时间:2022-4-25 21:48

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版