系列文章目录
文章目录
目录
STM32F40x 系列总共最多有 14 个定时器
定时器的种类
高级定时器、通用定时器、基本定时器
高级定时器框图
STM32F4xx中文参考手册 P330
通用定时器功能特点描述
- 16 /32 位向上、向下、向上 / 向下 ( 中心对齐 ) 计数模式,自动装载计数器( TIMx_CNT )。
- 16 位可编程 ( 可以实时修改 ) 预分频器 (TIMx_PSC) ,计数器时钟频率的分频系数为 1 ~ 65535 之间的任意数值。
- 4 个独立通道( TIMx_CH1~4 ),这些通道可以用来作为:
- ① 输入捕获
- ② 输出比较
- ③ PWM 生成 ( 边缘或中间对齐模式)
- ④ 单脉冲模式输出
- 可使用外部信号( TIMx_ETR )控制定时器和定时器互连(可以用 1 个定时器控制另外一个定时器)的同步电路。
STM32 的通用定时器可以被用于:测量输入信号的脉冲长度 ( 输入捕获 ) 或者产生输出波形 ( 输出比较和 PWM) 等。
计数器模式
通用定时器可以向上计数、向下计数、向上向下双向计数模式。
① 向上计数模式:
计数器从 0 计数到自动加载值 (TIMx_ARR) ,然后重新从 0开始计数并且产生一个计数器溢出事件。
② 向下计数模式:
计数器从自动装入的值 (TIMx_ARR) 开始向下计数到 0 ,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。
③ 中央对齐模式(向上 / 向下计数):
计数器从 0 开始计数到自动装入的值 -1 ,产生一个计数器溢出事件,然后向下计数到 1 并且产生一个计数器溢出事件;然后再从 0 开始重新计数。
定时器溢出时间计算方法
重点(敲黑板)
TIM_Period 和 TIM_Prescaler-CSDN博客
//arr:自动重装值。
//psc:时钟预分频数
//Ft: 定时器工作频率,单位:Mhz
//Tout: 定时器溢出时间
Tout=((arr+1)*(psc+1))/Ft
定时器配置
定时器参数初始化
// 函数引用
void TIM_TimeBaseInit(TIM_TypeDef* TIMx,TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
//结构体定义
typedef struct
{
uint16_t TIM_Prescaler;
uint16_t TIM_CounterMode;
uint16_t TIM_Period;
uint16_t TIM_ClockDivision;
uint8_t TIM_RepetitionCounter;
} TIM_TimeBaseInitTypeDef;
// 结构体举例
TIM_TimeBaseStructure.TIM_Period = 4999;
TIM_TimeBaseStructure.TIM_Prescaler =7199;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
定时器参数初始化:
通用定时器常用寄存器和库函数
//定时器使能函数:
void TIM Cmd(TIM:TypeDef* TIMx, FunctionalState:NewState);
//定时器中断使能函数:
void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);
//状态标志位获取和清除
/**
* @brief 检查指定的定时器标志位是否被设置
* @param TIMx 定时器的指针,如TIM1、TIM2等
* @param TIM_FLAG 要检查的标志位,可以是以下值之一:
* - TIM_FLAG_Update: 更新事件标志位
* - TIM_FLAG_CC1: 捕获/比较通道1标志位
* - TIM_FLAG_CC2: 捕获/比较通道2标志位
* - TIM_FLAG_CC3: 捕获/比较通道3标志位
* - TIM_FLAG_CC4: 捕获/比较通道4标志位
* - TIM_FLAG_COM: 通道1和通道2的组合标志位
* - TIM_FLAG_Trigger: 触发事件标志位
* - TIM_FLAG_Break: 中断事件标志位
* @return 标志位状态,可以是以下值之一:
* - SET: 标志位被设置
* - RESET: 标志位未被设置
*/
FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
/**
* @brief 清除指定的定时器标志位
* @param TIMx 定时器的指针,如TIM1、TIM2等
* @param TIM_FLAG 要清除的标志位,可以是以下值之一:
* - TIM_FLAG_Update: 更新事件标志位
* - TIM_FLAG_CC1: 捕获/比较通道1标志位
* - TIM_FLAG_CC2: 捕获/比较通道2标志位
* - TIM_FLAG_CC3: 捕获/比较通道3标志位
* - TIM_FLAG_CC4: 捕获/比较通道4标志位
* - TIM_FLAG_COM: 通道1和通道2的组合标志位
* - TIM_FLAG_Trigger: 触发事件标志位
* - TIM_FLAG_Break: 中断事件标志位
* @return 无
*/
void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
/**
* @brief 检查指定的定时器中断是否发生
* @param TIMx 定时器的指针,如TIM1、TIM2等
* @param TIM_IT 要检查的中断,可以是以下值之一:
* - TIM_IT_Update: 更新事件中断
* - TIM_IT_CC1: 捕获/比较通道1中断
* - TIM_IT_CC2: 捕获/比较通道2中断
* - TIM_IT_CC3: 捕获/比较通道3中断
* - TIM_IT_CC4: 捕获/比较通道4中断
* - TIM_IT_COM: 通道1和通道2的组合中断
* - TIM_IT_Trigger: 触发事件中断
* - TIM_IT_Break: 中断事件中断
* @return 中断状态,可以是以下值之一:
* - SET: 中断发生
* - RESET: 中断未发生
*/
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);
/**
* @brief 清除指定的定时器中断标志位
* @param TIMx 定时器的指针,如TIM1、TIM2等
* @param TIM_IT 要清除的中断标志位,可以是以下值之一:
* - TIM_IT_Update: 更新事件中断
* - TIM_IT_CC1: 捕获/比较通道1中断
* - TIM_IT_CC2: 捕获/比较通道2中断
* - TIM_IT_CC3: 捕获/比较通道3中断
* - TIM_IT_CC4: 捕获/比较通道4中断
* - TIM_IT_COM: 通道1和通道2的组合中断
* - TIM_IT_Trigger: 触发事件中断
* - TIM_IT_Break: 中断事件中断
* @return 无
*/
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);
定时器中断一般配置步骤
-
能定时器时钟。
RCC_APB1PeriphClockCmd();
-
初始化定时器,配置 ARR,PSC 。
TIM_TimeBaseInit();
-
开启定时器中断,配置 NVIC 。
NVIC_Init();
-
使能定时器。
TIM_Cmd();
-
编写中断服务函数。
TIMx_IRQHandler();
实验任务
定时器3(TIM3),配置为500ms中断一次,在中断里面改变DS1的状态(亮/灭)
实验结果
本实验,DS0用来指示程序运行,400ms为一个周期。DS1用于定时器中断取反,指示
定时器中断状态,1000ms为一个周期。下载完后,可以看到DS0快闪,DS1慢闪。
tips 如果定义了TIM3_Int_Init函数,记得在main函数中引用回来
引用
同系列文章相同