【STM32F4】利用定时器实现最基本的定时功能(HAL)
定时器简介
STM32F429单片机有许多定时器Timer,主要分成三类,基本定时器;通用定时器和高级定时器。三种类型的定时器功能由少变多,高级定时器包含了低级定时器的功能。
- 基本定时器:TIM6、TIM7
- 通用定时器:TIM2、TIM3、TIM4、TIM5、TIM9~TIM14
- 高级定时器:TIM1,TIM8
注:图中的接口接口时钟就是总线时钟。
定时器最基本的功能就是定时,三种类型的定时器都包含定时功能,今天只讲述如何利用HAL库方法实现利用定时功能点亮LED灯。
定时功能主要有三种方式:
- 递增计数:计数器从0计数到自动加载值(TIMx_ARR),然后重新从0开始计数并且产生一个计数器溢出事件
- 递减计数:计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。
- 递增/减计数:计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。
此处引用Z小旋的图片:
定时时间计算公式为:
arr为计数值,psc为定时器分频系数,Tclk一般设定为最大工作频率,其中psc和arr可以自己设定,tclk为定时器时钟,也就是第一个图的最后一列。
举个栗子:
以stm32f429为例,假如想利用TIM2定时500ms,TIM2位于APB2总线上,其定时器时钟为90Mhz,为了方便计算,psc一般设定为Tclk*100-1,也就是8999,这样arr的设定值为定时时间*10-1,也就是499,单位为ms。
假如使用103单片机,定时100ms,那么arr=999(1000-1),psc=7199(7200-1),tclk=72M。注意单位Tout为ms,tclk为Mhz
利用定时器点亮LED
-
打开stm32Cubemx,创建新工程,芯片型号选择STM32F429IG
-
配置RCC为外部高速时钟(HSE)。
-
配置定时器TIM2,选择时钟源为内部时钟,配置计数方式,arr和psc以及是否重装载,并使能中断。
Clock Source:选择时钟源(Internal Source)
Prescaler:PSC定时器分频系数 (17999 )
Counter Mode:计数模式( UP:递增计数)
Counter Period:自动重装载值(4999)
auto-reload preload:是否开启重装载(Enable)
只需设置上述四个选项即可,其余设置和本程序无关,保持默认即可。
- 设置时钟树
选择外部时钟HSE 8MHz
PLL锁相环倍频180倍
系统时钟来源选择为PLL
设置APB1分频器为 /2
这时候定时器的时钟频率为90Mhz
- 配置GPIO口
我的板子LED连接的端口是PF6,找到PF6,并设置output模式
配置GPIO口的相关参数
设置输出电平,参照自己板子的电路图,我的是低电平点亮
设置输出模式
设置上/下拉
设置输出速度
设置用户标签
- 生成程序
设置工程名称
设置路径
选择编译器
设置库函数版本
其余设置保持默认
点击GENERATE CODE生成代码
- 开启TIM2中断
HAL_TIM_Base_Start函数在stm32f4xx_hal_tim.h文件中
- 在TIM.c中添加中断回调函数
/* Includes ------------------------------------------------------------------*/
#include "tim.h"
/* USER CODE BEGIN 0 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim == (&htim2))
HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_6);
}
/* USER CODE END 0 */
大功告成
推荐阅读
-
Angular实现的简单定时器功能示例
-
利用Linux中的crontab实现分布式项目定时任务功能
-
【STM32F4】利用定时器实现最基本的定时功能(HAL)
-
Android利用CountDownTimer定时器轻松实现延长Toast对话框的显示时间
-
51单片机:利用定时器实现1秒后LED灯的状态改变
-
STM32单片机利用软件定时器实现分时多任务(使用HAL库编写)
-
timer定时器 - 用PHP实现linux的crontab(有后台管理功能)应该怎么做?
-
timer定时器 - 用PHP实现linux的crontab(有后台管理功能)应该怎么做?
-
Java:利用java Timer类实现定时执行任务的功能
-
Java定时任务:利用java Timer类实现定时执行任务的功能