STM32 CubeMX开发 F1通用定时器
我手上有一块精英板,型号是STM32F103ZET6,就以此为例介绍一下32单片机的定时器怎么在CubeMX下配置,并用一个呼吸灯展示一下定时器的效果
1 新建工程
配置工程信息
2 配置时钟
从原理图中找到开发板上的外部晶振为8M
设置RCC的高速时钟源为外部晶振
设置时钟图
芯片手册中也可以看到APB1的上限频率,和时钟图中是对应的
在手册中还可以找到哪些定时器挂在APB1下哪些定时器挂在APB2下
挂在APB1下的外设
挂在APB2下的外设
3 配置Timer
这里我选TIM1举例配置一个中断频率为1KHz的定时器,并在定时器的中断内完成呼吸灯任务
根据前面讲到的,我们知道TIM1挂在APB2下,则Tclk=72M,计算ARR和PSC即可
使能中断
4 配置LED灯引脚
查看原理图
LED0
LED1
CubeMX中配置引脚
PB5配置为Outuput
同理PE5配置为Output
GPIO设置
LED1同理,修改Label后右边的可视化IO也可以看到名称发生变化
配置Debug(如果需要debug的情况下)
5 生成工程编写呼吸灯
点击生成并打开
按照上期讲解,加入我们自己的代码文件,并在小锤子的CC++选项卡中加入我们代码的头文件路径
打开我们的代码文件引入头们的头文件并打开
引入32的底层库文件
#ifndef _BREATH_H_
#define _BREATH_H_
#include "stm32f1xx.h"
#endif
回到breath.c中
#include "breath.h"
#include "main.h" // main.h里有Cube为我们生成的IO口宏定义
#include "gpio.h"// 用到GPIO库函数
uint32_t clock_count = 0;
uint16_t light_count = 0;//变频变量
uint8_t k = 0;//增减标识k=0增k=1减
uint8_t T_pwm = 10;//PWM周期
uint8_t T_bp = 50;//变频周期
//总周期=T_pwm*T_bp*2 ms 此例程为10*50*2=1000ms
void Breath_light(void){
if(clock_count%T_bp == 0)//变频周期50ms
{
if(light_count<T_pwm && k==0)
light_count++;
else if(light_count == T_pwm){
k = 1;light_count--;}
else if(light_count == 0)
k = 0;
else if(light_count<T_pwm && k==1)
light_count--;
}
//pwm
if(clock_count%T_pwm<light_count){
HAL_GPIO_WritePin(LED0_GPIO_Port,LED0_Pin,1);
HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,0);
}
else if(clock_count%T_pwm>=light_count){
HAL_GPIO_WritePin(LED0_GPIO_Port,LED0_Pin,0);
HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,1);
}
//计数器更新
clock_count++;
}
在breath.h中把我们编写的函数声明为外部函数
#ifndef _BREATH_H_
#define _BREATH_H_
#include "stm32f1xx.h"
void Breath_light(void);
#endif
6 中断处理
在main.c中启动定时器中断
在中断处理文件中调用breach函数
打开这个文件,并在指定位置引入我们的头文件
往下翻,可以找到定时器中断服务函数,在这里调用breath
7 编译下载与演示
这里说一个HAL库的缺点,在选择这个选项的时候编译会比较慢
这个信息可以帮助你goto definition,但是当你习惯使用全局搜索的时候就会觉得这个功能在编译能更快的条件下也就没那么必要了
接下来编译、无报错后下载、按下reset,点灯工程师诞生了!
关于CubeMX的更多详细使用方法后续更新
X 往期文章
鸿蒙(HMOS)开发基础篇(一)环境搭建 & Helloworld
Python+OpenCV+imutils的简单图片处理(放缩、翻转、旋转、灰度RGB提取)
如果文中有误,还请在评论区指正。这里是海小皮,我们一同进步!!!