深入解析STM32定时器概念及实验(二)
系列文章目录
中断概念讲解及实验-CSDN博客
文章目录
目录
系列文章目录
文章目录
定时器的种类
高级定时器框图
通用定时器功能特点描述
计数器模式
定时器溢出时间计算方法
定时器配置
定时器参数初始化
通用定时器常用寄存器和库函数
定时器中断一般配置步骤
能定时器时钟。
初始化定时器,配置 ARR,PSC 。
开启定时器中断,配置 NVIC 。
使能定时器。
编写中断服务函数。
实验任务
实验结果
引用
STM32F40x 系列总共最多有 14 个定时器
定时器的种类
高级定时器、通用定时器、基本定时器
高级定时器框图
STM32F4xx中文参考手册 P330
通用定时器功能特点描述
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函数中引用回来
引用
同系列文章相同
作者:优雅的造轮狮