STMCU小助手
发布时间:2022-4-25 21:48
|
8.1 新建Analog工程 8.1.1 新建工程文件 在桌面新建文件夹,命名为“Analog _Project”(根据实际需求选择文件夹存放路径和命名,其中路径不能包含中文),用于存放串口实验的工作空间。打开STM32CubeIDE软件,点击“Browse…”按钮,选择 “Analog _Project”文件夹路径作为工作空间存放路径,然后点击“Launch”按钮,启动运行STM32CubeIDE。
点击“Start New STM32 project”按钮。8 j3 M, _9 x, X2 u3 U+ J% B
在搜索栏中输入需要配置的STM32芯片名称进行搜索,例如本文使用的芯片就输入“STM32H743II”,并单击选择对应封装“ LQFP176”,即可进入下一步。 ( s0 ?4 \4 y! P0 @: N
在进入芯片详细页面后,可以点击“Block Diagram”或者“Datasheet”对芯片进行概览。在确认芯片信息与手头的芯片一致后,点击Next下一步开始配置芯片。+ n: J f* E( E+ N j) y
% q0 p' }$ h1 j, y# A( | 输入工程名,其余选型默认,点击“Finish”按钮。操作该步骤前需要保证网络正常,因为STM32CubeIDE需要下载对应芯片的数据包,也可以到STM官网上下载可离线安装的数据包。
% Z( @- W# E1 \/ k8 J6 I* ] 点击“Yes”按钮。
点击“Project Manager->Code Generator”,将“Generated files”第1和第2选项勾选,其余默认。* Y0 S' x5 J& g4 y: L1 L
点击“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
6 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
: h! c& g. r7 X5 p, E$ c 8.1.2 配置芯片内核 点击左边菜单栏“System Core”的“CORTEX_M7”进入M7的配置页面。: d8 A' p( C8 o3 \3 J2 ~ : c* X# g% u" t8 o7 E
CPU ICache:使能I-Cache,用来缓存指令,选择打开。 CPU DCache:使能D-Cache,用来缓存数据,选择打开,其他选项不变。" p2 j" f# U) h' @7 ^ 点击左侧“Trace and Debug”,进入“DEBUG”页面,用自己所用的调试方式,选的是“Serial Wire”。下面的选项是外部触发调试,暂且不开。 $ I7 u4 w/ V' [. T
8.1.3 配置串口传输数据 接下来对串口进行配置,将“USART1”打开。并开启USART1全局中断。 7 c$ h" d( y- {5 y% B: p, k/ Y. t* ~2 R
同时进入“NVIC”中断时序管理页面中,将“USART1”的中断优先度取到3。1 |; X& w$ ^) H d) H 3 L) Y! m! J, W% K
% v+ Y* Z4 B4 X& h8 q' g, s( B 同时找到PA9和PA10将它们设置为USART1的RXD和TXD引脚,方便USB读取。! P0 q6 m# @- q9 F2 w
点击“Project Manager->Code Generator”,将“Generated files”第1和第2选项勾选,其余默认。 r ?8 A- ?- P+ I7 S8 ^$ w
8.2 配置模数转换AD; \/ e7 `) T/ P1 S4 }, [* f c- } 8.2.1 配置ADC引脚设置 首先搜索“PA0”,该引脚为开发板上“KEY_UP”按键,串联接3.3V电源,同时连接AD1的第16通道,这样设置ADC能方便通过按键来观察ADC读取的变化。 搜索到“PA0”后将其同时设置为“GPIO_Analog”和“ADC_INP16”模式用于ADC模数转换。注意要同时设成两个模式,否则将无法启用。7 `7 x! u- v- n; _ 点击右侧“Analog”-“ADC”,找到“IN16”通道,将其设置为“Single-ended”独立模式。 独立模式模式下,双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
接着配置ADC的DMA设置使得其能减少CPU的内存占用量。0 p2 Z) t1 O! o/ M ! @, s8 h+ p9 n; r; Z
与串口DMA一样,AD和DA也能开启DMA使用数据直接读取来提高传输速度。 DMA(Direct Memory Access,直接内存存取),用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无需CPU干预,节省CPU资源,ADC转换出来的值直接赋值给定义好的变量中,传输速度快。3 f4 C0 d& w/ k2 P
同时还需进入“NVIC Setting”将ADC的全局中断开启,以用于判断ADC中断结束的时间,方便之后对于ADC读取数据使用。 $ ^8 M2 t% G/ O$ z
同时我们还需要开启定时器中断,来方便ADC去定时读取数值返回到串口。 点击“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 ~
5 E4 D! Q1 c) [, ^ M1 s 接着点击“NVIC Settings”开启定时器中断即可。 TIM1为高级定时器,开启“ update interrupt”即可。9 m5 Y9 ~+ P( q/ y$ h , r, a2 \; _" V4 v2 |+ q
其余普通定时器正常开启定时器即可。 0 y. P! B+ Q w, H4 t
9 F) j$ N. l3 S# ? v5 B 之后便可保存并生成代码,开始在代码中用定时器调用ADC了。 8.2.2 编写定时器调用ADC代码! L* E& p# a: i 新建AD自己的HARDWAVE文件夹以及.c和.h文件,并添加路径调用。(详见5.8章) 0 [' p: Z; }) r4 N7 c" p! {+ K2 L
9 ^1 O3 U3 G V1 D3 A3 C% x0 V/ f; {2 L 在“AD.h”中调用“main.h” 等一系列h文件
. 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 ~
同时在main函数中添加进入定时器的调用函数,使得主函数开始就能开启定时器1。/ L- V4 t- C) x- _% p* v6 }! W , s$ v3 {' U2 G
同时在下方调用HAL库中的AD回调函数,在进入AD的回调函数中时首先需暂停定时器功能再读取AD中的数据。$ H: N- l9 _3 ?% i5 z2 L, G
接着我们需要配置串口,使得printf能输出浮点型字符至串口1。 首先在main函数中添加代码,使得printf重定义至输出到串口1,详见(6.4.2)
接着右键点击项目文件进入属性界面找到“C++Build”中的“Settting”选择“Miscellaneous”并添加“ -u_printf_float”。/ v6 `: A4 [# v' x7 n0 M
) ?. @/ [$ o' x+ L$ _; T8 V
4 n3 n4 ?- J" {7 Z2 l! X, U 同时还需在“Tool Settings”中的“MCU Settings”选择勾中允许浮点printf的选项。; o& f' t) A/ B3 \1 s# R
) A; a; \2 f6 L" u3 L8 L8 N* [ 应用并关闭后,即可在AD中断中调用串口输出函数,将AD采集值打印至串口1。 - ?! \( T+ j* m- }5 z; M
7 v" G& U: E. @ 由于我们选用的ADC1为16位ADC,且参考电压为3.3V。 因此在printf输出时需要将AD采集到的值*参考电压÷(2的16次)65536。 在烧录程序后,即可通过串口看到,(串口操作详见6.4.4)# K% C, H0 r/ A! F* u 使用的ADC连接了按钮的引脚,在按下“KEY_UP”后,电压由低电平转变为高电平,松开后ADC读取的高电平又转变为低电平。
9 t' ]; |) r! O$ v6 ^0 J
- m/ R2 ~1 b9 ] * i: Z9 l. c! y 3 u) b. n7 z' d' H. ? |
【经验分享】STM32语音识别的智能蓝牙音箱(源程序+原理图+PCB+设计说明书+PPT)
想找个ST芯片
[GPIO] 使用新型抽象开始C++嵌入式编程,从GPIO开始
技术手册stm32f1xx中的一个小问题
【经验分享】STM32 HAL库移植FreeModbus详细步骤
【逢7发帖赢大礼】STM32开发之IC门禁卡UID读取方法!
实战经验 | Keil工程使用NEAI库的异常问题
经验分享 | FDCAN数据段波特率增加后发送失败的问题分析
STM32几种流行开发环境的优缺点
好用软件推荐-TouchGFX Designer
微信公众号
手机版