【STM32F4】HAL库 CubeMX(七)--------定时器中断实验

文章目录

  • 前言
  • 一、定时器是什么?
  • 二、定时器中断实验
    • 1.功能配置
    • 2.时钟配置
    • 3.生成代码
  • 总结


前言

接下来我们将学习定时器的三大基本功能,定时器中断,输出PWM,输入捕获。

一、定时器是什么?

STM32F4 的通用定时器包含一个 16 位或 32 位自动重载计数器(CNT),该计数器由可编程预分频器(PSC)驱动。STM32F4 的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)等。 使用定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。STM32F4 的每个通用定时器都是完全独立的,没有互相共享的任何资源。
STM3 的通用 TIMx (TIM2~TIM5 和 TIM9~TIM14)定时器功能包括:
1)16 位/32 位(仅 TIM2 和 TIM5)向上、向下、向上/向下自动装载计数器(TIMx_CNT),注意:TIM9~TIM14 只支持向上(递增)计数方式。
2)16 位可编程(可以实时修改)预分频器(TIMx_PSC),计数器时钟频率的分频系数为 1~65535 之间的任意数值。
3)4 个独立通道(TIMx_CH1-CH4,TIM9~TIM14 最多 2 个通道),这些通道可以来作为:
A.输入捕获
B.输出比较
C.PWM 生成(边缘或中间对齐模式) ,注意:TIM9~TIM14 不支持中间对齐模式
D.单脉冲模式输出

4)可使用外部信号(TIMx_ETR)控制定时器和定时器互连(可以用 1 个定时器控制另外一个定时器)的同步电路。
5)如下事件发生时产生中断/DMA(TIM9~TIM14 不支持 DMA):
A.更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发)
B.触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)
C.输入捕获
D.输出比较
E.支持针对定位的增量(正交)编码器和霍尔传感器电路(TIM9~TIM14 不支持)
F.触发输入作为外部时钟或者按周期的电流管理(TIM9~TIM14 不支持)

由于 STM32F4 通用定时器比较复杂,这里我们不再多介绍,请大家直接参考《STM32F4xx中文参考手册》第 392 页,通用定时器一章。

二、定时器中断实验

1.功能配置

1、根据库函数本实验是以定时器3为例,在功能选择区选择TIM3。
2、根据库函数配置,选择对应的参数
【STM32F4】HAL库 CubeMX(七)--------定时器中断实验_第1张图片
【STM32F4】HAL库 CubeMX(七)--------定时器中断实验_第2张图片
TIM3 的时钟为 84M,再根据我们设计的 arr 和 psc 的值,就可以计算中断时间了。计算公式如下:
Tout= ((arr+1)*(psc+1))/Tclk;
其中:
Tclk:TIM3 的输入时钟频率(单位为 Mhz)。
Tout:TIM3 溢出时间(单位为 us)
【STM32F4】HAL库 CubeMX(七)--------定时器中断实验_第3张图片
【STM32F4】HAL库 CubeMX(七)--------定时器中断实验_第4张图片
3、为了测试实验,同样用两个LED来检测
在这里插入图片描述
4、对于中断--------我有话要说
大家可以看到上面,对于中断配置了两个参数,抢占优先级和响应优先级。如果中断仅有一个的时候,在CubeMX不设置也没关系,有默认参数。但是在大型程序里面中断优先级会有很大影响,可以在NVIC中设置两个变量。
【STM32F4】HAL库 CubeMX(七)--------定时器中断实验_第5张图片

2.时钟配置

RCC时钟配置如前文一样(此处一般情况是不变的)。
【STM32F4】HAL库 CubeMX(一)--------创建工程(点亮LED)

3.生成代码

1、加入宏定义和函数定义
【STM32F4】HAL库 CubeMX(七)--------定时器中断实验_第6张图片

#define LED0_Reversal()	HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_9)
#define LED1_Reversal()	HAL_GPIO_TogglePin(GPIOF, GPIO_PIN_10)
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);

2、加入下列代码即可验证实验
【STM32F4】HAL库 CubeMX(七)--------定时器中断实验_第7张图片

	  LED0_Reversal();
	  HAL_Delay(200);
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
     
	if(htim == &htim3)//确定是定时器三中断
	{
     
		 LED1_Reversal();
	}//不需要清除标志位
}

总结

因为定时器较重要,所以在这里说一点关于中断细节。
在stm32f4xx_hal_tim.h中
【STM32F4】HAL库 CubeMX(七)--------定时器中断实验_第8张图片
【STM32F4】HAL库 CubeMX(七)--------定时器中断实验_第9张图片
根据上述,所以我们在编写中断服务函数的时候,仅需要判断是哪个定时器的中断,而不需要判断中断产生的原因(分为不同的中断服务函数)以及清除标志位。
【STM32F4】HAL库 CubeMX(七)--------定时器中断实验_第10张图片

你可能感兴趣的:(stm32,单片机)