1-基于STM32的VSCode入门级教程前言
2-STM32Cube安装教程
3-STM32CubeIDE汉化
4-STM32Cube配置时钟设置
5-跑马灯引脚配置
6-Cortex-M7内核基本配置
7-新建用于储存代码的文件夹以及c/h文件
8-STM32CubeIDE点亮跑马灯
9-STLink调试
10-异步串口收发USART
11-中断控制器NVIC
12-配置外部中断
13-使用定时器产生PWM输出
14-使用定时器捕获上升/下降沿
15-数模转换AD/DA
16-STM32Cube个性化定制
8.1.1 新建工程文件
在桌面新建文件夹,命名为“Analog _Project”(根据实际需求选择文件夹存放路径和命名,其中路径不能包含中文),用于存放串口实验的工作空间。打开STM32CubeIDE软件,点击“Browse…”按钮,选择 “Analog _Project”文件夹路径作为工作空间存放路径,然后点击“Launch”按钮,启动运行STM32CubeIDE。
点击“Start New STM32 project”按钮。
在搜索栏中输入需要配置的STM32芯片名称进行搜索,例如本文使用的芯片就输入“STM32H743II”,并单击选择对应封装“ LQFP176”,即可进入下一步。
在进入芯片详细页面后,可以点击“Block Diagram”或者“Datasheet”对芯片进行概览。在确认芯片信息与手头的芯片一致后,点击Next下一步开始配置芯片。
输入工程名,其余选型默认,点击“Finish”按钮。操作该步骤前需要保证网络正常,因为STM32CubeIDE需要下载对应芯片的数据包,也可以到STM官网上下载可离线安装的数据包。
点击“Yes”按钮。
点击“Project Manager->Code Generator”,将“Generated files”第1和第2选项勾选,其余默认。
点击“Pinout & Configuration->System Core->RCC”,在“RCC Mode”中将“High Speed Clock(HSC)”设置为“Crystal/Ceramic Resonator”,其余保持默认。
第一个选项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”,然后按回车键,其他暂不设置,保持默认。
8.1.2 配置芯片内核
点击左边菜单栏“System Core”的“CORTEX_M7”进入M7的配置页面。
CPU ICache:使能I-Cache,用来缓存指令,选择打开。
CPU DCache:使能D-Cache,用来缓存数据,选择打开,其他选项不变。
点击左侧“Trace and Debug”,进入“DEBUG”页面,用自己所用的调试方式,选的是“Serial Wire”。下面的选项是外部触发调试,暂且不开。
8.1.3 配置串口传输数据
接下来对串口进行配置,将“USART1”打开。并开启USART1全局中断。
同时进入“NVIC”中断时序管理页面中,将“USART1”的中断优先度取到3。
同时找到PA9和PA10将它们设置为USART1的RXD和TXD引脚,方便USB读取。
点击“Project Manager->Code Generator”,将“Generated files”第1和第2选项勾选,其余默认。
8.2 配置模数转换AD
8.2.1 配置ADC引脚设置
首先搜索“PA0”,该引脚为开发板上“KEY_UP”按键,串联接3.3V电源,同时连接AD1的第16通道,这样设置ADC能方便通过按键来观察ADC读取的变化。
搜索到“PA0”后将其同时设置为“GPIO_Analog”和“ADC_INP16”模式用于ADC模数转换。注意要同时设成两个模式,否则将无法启用。
点击右侧“Analog”-“ADC”,找到“IN16”通道,将其设置为“Single-ended”独立模式。
独立模式模式下,双ADC不能同步,每个ADC接口独立工作。所以如果不需要ADC同步或者只是用了一个ADC的时候,应该设成独立模式,多个ADC同时使用时会有其他模式,如双重ADC同步模式,两个ADC同时采集一个或多个通道,可以提高采样率。
同时在ADC_Setting中确认ADC位数为16-bitADC(部分ADC只支持12位)。
与串口DMA一样,AD和DA也能开启DMA使用数据直接读取来提高传输速度。
DMA(Direct Memory Access,直接内存存取),用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无需CPU干预,节省CPU资源,ADC转换出来的值直接赋值给定义好的变量中,传输速度快。
同时还需进入“NVIC Setting”将ADC的全局中断开启,以用于判断ADC中断结束的时间,方便之后对于ADC读取数据使用。
同时我们还需要开启定时器中断,来方便ADC去定时读取数值返回到串口。
点击“Timers”-“TIM1”-“Clock Source”设置为“Internal Clock”将定时器1使用内部时钟。
将下方新增的“Configuration”将“ Prescaler”分频数设为48000,将“Counter Period”计数个数设为1000。由于系统时钟为480MHZ,因此将分频数设为48000得到10KHZ频率,10KHZ一次读数记10微秒,计数1000使定时器1在100ms时中断,并打开“auto-reload”开启自动清零。
接着点击“NVIC Settings”开启定时器中断即可。
TIM1为高级定时器,开启“ update interrupt”即可。
之后便可保存并生成代码,开始在代码中用定时器调用ADC了。
8.2.2 编写定时器调用ADC代码
新建AD自己的HARDWAVE文件夹以及.c和.h文件,并添加路径调用。(详见5.8章)
在“AD.c”中调用“AD.h”并添加中断回调函数“ HAL_TIM_PeriodElapsedCallback”。
并在其中添加ADC采集开启的中断函数,定时器的使用请参考(7.2.1)。
同时在main函数中添加进入定时器的调用函数,使得主函数开始就能开启定时器1。
同时在下方调用HAL库中的AD回调函数,在进入AD的回调函数中时首先需暂停定时器功能再读取AD中的数据。
接着我们需要配置串口,使得printf能输出浮点型字符至串口1。
首先在main函数中添加代码,使得printf重定义至输出到串口1,详见(6.4.2)
接着右键点击项目文件进入属性界面找到“C++Build”中的“Settting”选择“Miscellaneous”并添加“ -u_printf_float”。
同时还需在“Tool Settings”中的“MCU Settings”选择勾中允许浮点printf的选项。
应用并关闭后,即可在AD中断中调用串口输出函数,将AD采集值打印至串口1。
由于我们选用的ADC1为16位ADC,且参考电压为3.3V。
因此在printf输出时需要将AD采集到的值*参考电压÷(2的16次)65536。
在烧录程序后,即可通过串口看到,(串口操作详见6.4.4)
使用的ADC连接了按钮的引脚,在按下“KEY_UP”后,电压由低电平转变为高电平,松开后ADC读取的高电平又转变为低电平。