STM32:定时器控制LED灯开关
例题:[1]利用TIM2实现定时功能,每隔0.4秒将LED2的开关状态翻转;
[2]利用TIM3实现定时功能,每隔0.5秒将LED1的开关状态翻转;
思路:了解定时器基本知识(计算定时器时间【速算法】)—参数配置(定时器参数配置)—编写代码(在代码中修改定时时间、回调函数)—烧入开发板
一、了解定时器基本知识
[1]定时器的基本原理:
定时器的基本原理比较容易理解,它就像我们的闹钟,先设定时间,到了设定时间就响,我们的定时器就会执行我们的命令。
[2]定时器种类(常见):
1.看门狗定时器(WatchDog); 2.系统滴答定时器(Systick);3.实时定时器(RTC)
4.基本定时器(TIM6、TIM7); 5.通用定时器(最具代表性、广泛性) ; 6.高级定时器(TIM1、TIM8)
通用定时器有(TIM2、TIM3、TIM4、TIM5 )其作用就是在基本定时器的基础上,实现输出比较,输入捕获,PWM生成、单脉冲模式输出等。
[3]定时时间计算:【速算法】
1.为什么要计算定时时间?
要让单片机完成我们所指定的操作,就必须要在STM32中配置相对应的时间参数。
(按照题目意思,我们该在STM32中填入多少参数才能让其每隔0.4秒或0.5秒翻转电平状态呢?)
2.计算原理及公式:
原理: 通用定时器是一个通过可编程预分频器(Prescaler)驱动的16位自动重装主计数器(Counter Period)构成。
定时时间计算公式:(Prescaler+1)✖(Counter Period)✖1/定时器时钟频率 [时钟频率单位:赫兹(Hz)]
例题:计算时钟信号为1KHz,Prescaler=9,Counter Period=999的定时时间
带入计算公式:(9+1)✖(999+1)✖1/1000=10s
3.【速算法】
STM32配置定时器参数所用单位为毫秒(ms); 单位换算1秒(s)=1000毫秒(ms)
速算法:(换算后的毫秒数➖1)
例题[1]:每隔0.4秒将LED2的开关状态翻转:
0.4s=400ms,400-1=399ms;399即为配置中所输入的参数。
(带入速算法:0.4秒换算后毫秒数为400,将其➖1=399)
例题[2]:每个0.5秒将LED1的开关状态翻转:
0.5s=500ms,500-1=499ms;499即为配置中所输入的参数。
(带入速算法:0.5秒换算后描述为500,将其➖1=499)
[掌握了计算定时器时间方法,就可以开启我们的代码之旅啦!(。^▽^)]
二、参数配置(定时器参数配置)【例题版本:STM32L151C8/也可用STM32F103C8(配置一致)】(以下式略快版本[重点除外]),超详细配置版本可参考文章【STM32(入门)实现LED2灯循环闪烁】
例题重点配置[6]定时器参数配置
(1)新建项目:
(2)选择版本:
(3)SYS参数配置:
(4)RCC参数配置:
(5) 系统时钟配置:
(6) 定时器参数配置:
[1]按照例题,利用TIM2实现定时,每隔0.4秒将LED2的开关状态翻转【最后配置LED1、LED2灯】
点击[TIM2]—Clock Source选择[Internal Clock]—点击[Parameter Settings](进行参数更改)—勾选[NVIC通道]
[2]利用TIM3实现定时,每隔0.5秒将LED1的开关状态翻转
点击[TIM3]—勾选[Internal Clock]—点击[Parameter Settings](进行参数更改)—勾选[NVIC 通道]
配置LED1、LED2灯
LED1灯:
LED2灯:
(7)项目管理配置:
(8)Code Generator 勾选:
(9)配置完成并打开:
三、编写代码 (在代码中修改定时时间、回调函数)
[1]运用2个HAL库函数:(回调函数、翻转函数)
1.定时器回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef*htim)
2.翻转函数:
void HAL_GPIO_TogglePin(GPIOx,GPIO_PIN)
GPIOx:目标端口号; GOIO_PIN:目标引脚号
依照例题:[1]TIM2实现定时,每隔0.4秒将LED2的开关状态翻转:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//定时器回调函数
{
if(htim->Instance==TIM2)//判断TIM是否为TIM2
{
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);//是TIM2,翻转LED2灯(PB8)
}
依照例题: [2]TIM3实现定时,每隔0.5秒将LED1的开关状态翻转:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)//定时器回调函数
{
if(htim->Instance==TIM3)//判断TIM是否为TIM3
{
HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_3);//是TIM2,翻转LED1灯(PA3)
}
完整代码:
[2]运行代码:
[3]在代码中修改定时参数(修改想要的间隔时间):
四、烧入开发板 (所需工具如图)(若下载失败可参考文章【STM32(入门)实现LED2灯循环闪烁】)
以上就是实现定时器控制LED灯开关的步骤啦(0.4秒和0.5秒太近了,效果可能不明显,可试试其他!)
感谢大家的观看啦,如果觉得有帮助可以关注我一下呢!(。^▽^)
作者:二月红.