目录
[2. 在中断模式下启动TIM Base生成(在中断模式下启动定时器)](#2. 在中断模式下启动TIM Base生成(在中断模式下启动定时器))
1、定时器介绍
在51单片机的时候我们经常使用软件定时,但是软件定时存在不精确、占用CPU资源(在计时期间CPU都在数数)等缺点,在stm32我们就是用硬件定时可以避免软件定时的那些缺点。
1.定时器工作原理
使用精确的时基,通过硬件的方式,实现定时的功能。定时器的核心就是计数器。

2.定时器的分类
- 基本定时器(TIM6~TIM7)
- 通用定时器(TIM2~TIM5)
- 高级定时器(TIM1和TIM8)
我们常用到的是通用定时器

我使用的单片机定时器资源(可以在单片机使用手册上查看)

3.通用定时器主要功能介绍
1 ) 16 位向上、向下、向上 / 向下自动装载计数器( TIMx_CNT )。
2 ) 16 位可编程 ( 可以实时修改 ) 预分频器 ( TIMx_PSC ) ,计数器时钟频率的分频系数为 1 ~ 65535 之间的任意数
值。
3 ) 4 个独立通道( TIMx_CH1~4 ),这些通道可以用来作为:
A .输入捕获
B .输出比较
C . P WM 生成(边缘或中间对齐模式)
D.单脉冲模式输出
4)可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用 1 个定时器控制另外一个定时器)的同步电路。
5)如下事件发生时产生中断/DMA:
A.更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
B.触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
C.输入捕获
D.输出比较
E.支持针对定位的增量(正交)编码器和霍尔传感器电路
F.触发输入作为外部时钟或者按周期的电流管理
4.定时器计数模式

5.定时器时钟源

6.定时器溢出时间计算公式
- PSC:预分频器的值
- ARR:自动重装载值
- Tclk:时钟频率
- Tout:设定的时间
- 1Mhz=1000000hz(次/秒)
- 周期(s)=频率(hz)的倒数

2、定时器中断的实验
需求:使用定时器中断方法,没500ms翻转一次LED等的状态
codeMX的配置


代码编写
1.使用到的HAL库函数
1.中断回调函数需要我们重写
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
参数:定时器的句柄
2. 在中断模式下启动TIM Base生成(在中断模式下启动定时器)
HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim)
参数:定时器的句柄
返回的是一个状态值
2.具体代码
//重写中断回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM2)//确定中断源,确定是谁产生的中断
{
HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);
}
}
main函数里面
HAL_TIM_Base_Start_IT(&htim2);//在中断模式下启动定时器