STM32 定时器概念讲解及实验(二)

系列文章目录

中断概念讲解及实验-CSDN博客

定时器的种类

高级定时器、通用定时器、基本定时器

高级定时器框图

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函数中引用回来

引用

 同系列文章相同

  • 25
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
STM32中,定时器是一个不可缺少的外设,并且在学习STM32时可能会感到复杂。然而,如果你已经掌握了GPIO、串口通信和外部中断等外设的知识,学习定时器并不难。定时器的学习可以从原理、寄存器介绍、配置以及常用功能(如定时器中断和定时器输出比较PWM波形)入手。 定时器STM32中具有多种功能,例如产生精确的时间延迟、生成PWM波形、测量输入信号的脉冲宽度、应用编码器等。定时器的基本介绍包括定时器概念、工作原理以及相关寄存器的介绍。 在学习定时器的过程中,可以通过配置定时器的不同寄存器来实现所需的功能。例如,通过配置定时器的计数器和预分频器来设置定时器的计数周期和分频系数,从而实现精确的时间计数。通过配置定时器的比较寄存器和自动重载寄存器,可以实现定时器的输出比较和产生PWM波形。 同时,定时器还可以配置中断来实现定时器周期性触发中断事件,以及配置输入捕获功能来测量外部信号的脉冲宽度或频率。此外,定时器还可以应用于编码器模式,用于检测旋转或位置变化。 综上所述,学习STM32定时器需要了解其原理、寄存器介绍、配置方法以及常用的功能。掌握定时器的使用方法将有助于你更好地使用STM32进行定时控制和各种应用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [STM32-定时器详解](https://blog.csdn.net/qq_44016222/article/details/123507270)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值