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秒太近了,效果可能不明显,可试试其他!) 

感谢大家的观看啦,如果觉得有帮助可以关注我一下呢!(。^▽^)

 

 

 

 

 

         

作者:二月红.

物联沃分享整理
物联沃-IOTWORD物联网 » STM32:定时器控制LED灯开关

发表回复