本文也适合STM32CubeMX 支持的所有芯片的设置
..调整文章结构,添加图文说明 2022.2
..增加其他应用章节,增加 ADC 设置说明 2023.3
..考虑到增加的内容越来越多,修改文章标题,增加PWM设置说明 2023.4
..增加 DAC 设置说明 2023.4
CubeMX生成工程步骤
前言
更新说明,最初是使用 L051 作为说明芯片,后期考虑到内容的增加,不局限于 L051,毕竟有些功能L051 没有,文章最终目的是把 STM32CubeMX 设置所有的功能图文说明更新完成!
新建工程,选择对应芯片,然后设置下相应的引脚(需要根据自己的原理图)。
一、时钟相关
1.1 RCC
栏目中的选项如下:
- Disable(禁用)
- BYPASS Clock Source(旁路时钟源)
- Crystal/Ceramic Resonator(晶体/陶瓷晶振)
如上图一样有外部晶振选择 Crystal/Ceramic Resonator
1.2 Clock Configuration 时钟设置
在设置定时器参数之前,需要先确定系统的时钟,在这里我们第一次测试,用不到低功耗,所以将系统时钟设置为32MHZ最大值,如下图:
二、调试相关
在SYS中选择 SWD烧录模式 Debug Serial Wire
三、外设相关
3.1 USART 串口
使用串口1(USART1)作为调试串口(PA9 PA10),选择Asynchronous (异步通讯模式),打开串口中断,设置好自己需要的波特率,串口1设置完成。
还需要使用另外一个串口与无线模块通讯,PCB图纸上使用的是(PB10 PB11),同样按照上图设置,这两个端口在STM32F103上是正常的串口3,但是在STM32L051上是LPUART1,是一个低功耗串口,这里并不需要用到它的低功耗功能,就直接和普通串口一样设置,把他当做一个普通串口使用。
3.2 GPIO(LED、按键)
LED灯设置为输出,按钮设置为输入, 选中对应的IO口,选择模式,如下图:
还可以对每个IO口进行设置,如下图:
3.3 TIM 定时器
查阅资料STM32L051C8T6有5个定时器
通用定时器(TIM2、TIM21、TIM22、),基本定时器(TIM6),低功耗定时器(LPTIM1)。
因为用不到低功耗定时器,主要还是不确定低功耗定时器是否和普通定时器一样用,本次目的主要还是想先测试出效果,所以选用通用定时器,其中Clock Source 选择为 internal Clock ;
定时器选中还有一个重要的配置:
3.3.1 定时器时间计算说明
在上面的时钟设置好以后,就可以设置定时器里面的ARR和PSC:
- ARR :重装载值(auto reload register)
- PSC :预分频器(pre-scaler)
公式如下:
//Tclk:定时器的输入时钟频率(单位MHZ)
//Tout:定时器溢出时间(单位为us
Tout = ((arr+1)*(psc+1))/Tclk ;
比如上图中的定时器,就设置成了 定时时间1S,每 1S 就会产生一次中断。
如何理解这个时间:
比如F103晶振 72M,也就是一秒计 72 00 0000 次,72 00 0000 Hz
Prescaler预分频值设置7200-1是因为预分频值从0开始
我们把72M除以预分频值7200就是我们定时器速度,速度变为了一秒记10000次
Counter Period重装载值设置为10000,也就是定时器从0开始记了10000次以后就又回归从0开始计算到10000一直循环
我们定时器的速度为1秒记10000次,重装载值也刚好是10000,那么记一次重装载要的时间就是1秒,那么速度刚好是1Hz
比如我们设置重装载值为1000,定时器速度是10000Hz,记一次重装载值的速度只要0.1秒也是10Hz
定时器的10000除以重装载的1000也就是10,就是定时器配置成了10Hz
在本次测试中,其中使用TIM2,TIM21 2个通用定时器,TIM2设置成为1S,作为普通逻辑的定时器,TIM21设置为1ms 作为按钮的定时器:
3.4 IWDG 独立看门狗
产品生产往往会有意想不到的情况,在程序设计可能会有问题,在硬件上也可能会遇到特殊情况,看门狗的加入往往会对产品差错起到一定的帮助作用。
选择IWDG,使能独立看门狗:
配置看门狗的时间:
这里重装载值我设置了3700,是因为好计算,使能了独立看门狗以后可以在时钟图中看到独立看门狗的时钟频率为37KHZ:
用到几个公式:f=1/T,单位是s,单位是HZ。(其中大写字母T,表示周期,小写字母f表示频率)
看门狗 f= 看门狗时钟频率 / (预分频系数 * 重装载值) = 37000HZ / (64 * 3700)=10/64
看门狗时间 T = 6.4s
(不知道有没有算错= =!在后面测试过程中确认了,计算时正确的!)
以上设置,可以把基本的功能测试使用起来。
四、其他应用相关
经过上面的设置(定时器、串口都可以不需要开,只不过一个项目一般都会用到所以单独列出来了),我们可以做一些基本的应用,在实际项目中,其实还会应用到许多其他的设置,比如ADC,DAC,SPI,COMP 甚至是 RTOS 相关的设置,这里也就简单的说明一下。
4.1 ADC设置
ADC原理来说,其实相对比较简单,网上随便一找都是资料,这里我们说明下在 STM32CubeMX 下如何设置。
这里要主要说一下 ADC 的选项配置,具体如下图:
本文说明以 最简单基础的 轮询 单通道 单次采样为例设置:
这里额外说明一下ADC 得到的数据换算成真实电压的计算公式:
12位精度: 电压 = ADC数据 * VREF / 4096
一般 VREF 为 3.3 V 的时候就是 电压 = ADC 数据 * 3.3 / 4096 (V)
10位精度: 电压 = ADC数据 * VREF / 1024
当然,对于计算公式,上面的4096 和 1024 后面是否需要 -1 ,12位精度: 电压 = ADC数据 * VREF / (4096-1) ,也是很多人讨论的问题,这里不做讨论,一些普通的项目差别不大 = = !
对于 ADC 的使用,到时候有时间会单独拿出一篇文章介绍 。
4.2 PWM设置
STM32 定时器是能够产生的 PWM 。
PWM 的设置是在定时器的设置一起的,每个定时器有不同的通道,在以前没有 CubemX 的时候可能还要去查手册,看看对应的 PWM IO口是那些,现在可以直接通过 CubeMX 设置就能知道,不需要特意去查手册。
在我们的定时器配置界面,可以通过 channel 栏目打开 PWM 功能,如下图:
不同的定时器 Channel 数也不一样,有些多,有些少,还有些没有定时器功能,这些以前是需要手册查看的,现在通过软件可以直观的看到:
PWM是由定时器驱动,定时器的周期就是PWM的周期,所以对于 PWM 周期的设置以及计算,请参考上面 3.1 定时器时间计算说明。
然后只需要注意下面 PWM 的相关设置:
其中的 Pulse 是这只占空比,计算公式如下:
占空比 = Pluse / (ARR+1)
另外的 Mode 和 CH Polarity 关系到高低电平的占比,如下表格:
Mode | CH Polarity | High | Low |
---|---|---|---|
PWM mode 1 | High | 3000 | 7000 |
PWM mode 1 | Low | 7000 | 3000 |
PWM mode 2 | High | 7000 | 3000 |
PWM mode 2 | Low | 3000 | 7000 |
根据自己的需求完成设置就可以使用 PWM 了。
在程序中,使用一下指令开启 PWM:
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);
使用下面的指令修改占空比:
__HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_1,5000) // 把根据上图配置的占空比改为 50%
使用下面的指令修改 PWM 频率,通过修改 ARR 的值:
__HAL_TIM_SET_AUTORELOAD(&htim2, 4999); //第二个参数是需要改变的 arr 的值
4.3 DAC设置
DAC 的使用是比较简单的,但是不是所有的 STM32 都有 DAC 模块,常用的带有 DAC 模块的 STM32 芯片请参考我的另一篇博文: STM32 系列 DAC的介绍与使用
在 DAC 栏目下面,上面就3个选项,两个 OUT 与 External Trigger 选项:
其中 External Trigger 选项为是否选择 外部中断 EXTI9 触发,如果选中了外部中断触发,会占用一个 IO 口作为外部中断,显示为 DAC_EXTI9
。
选中 OUT1 输出后,就得进行DAC 的基本设置,很简单,对于博主使用的 STM32L151 来说就只有2个选项:
关于输出缓存:
DAC选择了输出缓存,可以用来减少输出阻抗,无需外部运放即可直接驱动外部负载。但是输出的电压没法低于20mv, 不使能输出缓存 DAC 则可以输出低于20mv的信号。
对于其他型号的 DAC ,可能还会有下面两个选项:
Wave generation mode
:
波形生成模式:可选 三角波发生器 ( Triangle wave generation ) 和 噪声波形 ( noise wave generation )
Maximum Triangle Amplitude
:
最大三角波幅: 0-4095 对应 0V~3.3V
还有一个需要注意的问题就是选择 触发源 software trigger 与 None 的区别,这个具体也可以查看我上面推荐的另外一篇博文:STM32 系列 DAC的介绍与使用。
根据自己的需求完成设置就可以使用 DAC 了。
在选择没有触发源情况下,在程序中使用如下步骤即可实现 DAC 输出(函数里面要写参数,我这里是示例):
HAL_DAC_SetValue();
HAL_DAC_Start();
五、生成工程
最后一步生成工程的时候,再次提醒一下,路径中不能又中文,否则会出问题!(虽然在网上看到有例子存在中文也没有问题的情况,但是自己生成的时候确实出了问题,所以改个英文路径问题不大)。
5.1 Project 栏目
项目名字,工程路径,生成工程后想要使用的IDE,堆栈大小,SDK软件包:
5.2 Code Generator栏目
生成工程的一些选项:
上图中勾选的 4个选项意思如下:
-
copy all used libraries into the project folder
复制所有库文件(不管工程需要用到还是没用到)到生成的工程目录中。 -
generate peripheral initialization as a pair of …:
每个外设生成独立的.C .H文件 -
keep user code when re-generating
重新生成代码时,保留用户代码(在用户规定的书写范围内) -
delete previously generated files when not re-generated
删除以前生成但现在没有选择生成的文件
最后点击GENERATE CODE 生成工程即可,生成工程说明就到这里,下一篇我们会根据生成的工程文件进行对应的修改进行测试。