欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

Stm32 定时器概述和示例

最编程 2024-10-09 14:47:53
...

知识点1:定时器概述

共有 8 个定时器:高级定时器(TIM1 和 TIM8)、通用定时器(TIM2——TIM5)、基本定时器(TIM6 和 TIM7)

Stm32定时器概述及案例_stm

特点:

1、可以分成三类(基本定时器(定时)、通用定时器(定时、测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和PWM))、高级定时器(定时、测量输入信号的脉冲宽度(输入捕获),或者产生输出波形(输出比较、PWM、嵌入死区时间的互补PWM等)))

Stm32定时器概述及案例_stm_02

Stm32定时器概述及案例_引脚_03

Stm32定时器概述及案例_初始化_04

2、定时器各自独立,不共享任何资源

3、定时功能实现依赖外部时钟、16位自动装载寄存器(0-65535)、16位预分频器(0-65535)

eg:计时1s的通用定时器(预分频=7200,自动装载=10000)

经过预分频器之后频率=10khz

计数一次的时间=1/1000khz=0.1ms

计数时间=0.1ms*10000=1s

Stm32定时器概述及案例_初始化_05


知识点2:定时器案例

案例1:定时1s翻转灯的状态

步骤1:创建工程

初始化灯

Stm32定时器概述及案例_stm_06

初始化定时器

Stm32定时器概述及案例_定时器_07

Stm32定时器概述及案例_stm_08

1、预分频器(Prescaler, PSC - 16 bits value):预分频器用于分频,它可以将定时器的输入时钟频率除以 1 至 65536 之间的任意因子。这是通过一个 16 位的计数器实现的,控制通过一个 16 位的寄存器(TIMx_PSC 寄存器)进行。预分频器的值可以动态更改,新的预分频比例将在下一个更新事件时生效。

2、计数器模式(Counter Mode):定时器可以在不同的计数模式下工作,例如向上计数或向下计数。在“向上”模式中,每个时钟周期计数器的值增加 1。

3、计数周期(Counter Period):自动重装载寄存器(ARR)定义了计数器的最大值。当计数器达到这个值时,它将重新开始从 0 计数,并可能触发中断或其他事件。

4、内部时钟分频(Internal Clock Division, CKD):这个设置用于进一步分频定时器的时钟源,但通常不是主要关注的焦点。

5、重复计数器(Repetition Counter, RCR - 8 bits value):重复计数器用于确定在触发更新事件之前定时器需要完成多少计数周期。

6、自动重装载预加载(auto-reload preload):自动重装载预加载功能允许预先加载 ARR 寄存器的值

Stm32定时器概述及案例_定时器_09

1、TIM1 Break Interrupt(TIM1 断开中断)这种中断通常用于 PWM 通道。在出现故障或“trip”情况时,可以通过 break 输入电路禁用 PWM 通道。

2、TIM1 Update Interrupt(TIM1 更新中断)Update 中断通常用于处理计数器溢出/下溢或计数器初始化(通过软件或内部/外部触发)的情况。

3、TIM1 Trigger and Commutation Interrupts(TIM1 触发和换相中断)触发中断与计数器的启动、停止、初始化或通过内部/外部触发进行计数有关。这些中断通常用于更复杂的定时器操作,其中定时器的行为依赖于外部或内部事件的发生。

4、TIM1 Capture Compare Interrupt(TIM1 捕获比较中断)捕获比较中断用于处理输入捕获和输出比较事件。在输入捕获模式下,当检测到外部信号的变化时(如边缘触发),定时器的当前计数值会被捕获。在输出比较模式下,定时器值与预设的比较值相匹配时,可以执行特定的动作,如改变输出引脚的状态。

步骤2:实现超时函数

//方式1:在stm32f10xx_it.c中
void TIM1_UP_IRQHandler(void)
{
  /* USER CODE BEGIN TIM1_UP_IRQn 0 */

  /* USER CODE END TIM1_UP_IRQn 0 */
  HAL_TIM_IRQHandler(&htim1);
  /* USER CODE BEGIN TIM1_UP_IRQn 1 */
  //自定义代码()
  HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_5);
  /* USER CODE END TIM1_UP_IRQn 1 */
}
//方式2:重新实现弱回调函数TIM1_UP_IRQHandler->HAL_TIM_IRQHandler(tim.c)
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
    // 确保此回调是为了正确的 TIM 实例
    if (htim->Instance == TIM1) 
    {
        // 切换 C13 引脚的状态
        HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); // 假设 C13 引脚已经配置为输出模式
    }
}

步骤3:主函数初始化定时器之后,开启中断

HAL_TIM_Base_Start_IT (&htim1);

步骤4:编译下载测试灯的状态

案例2:输出pwm呼吸灯

PWM概念:

是通过定时器生成的,用于控制开关时间与关断时间之间的比率,通常称为占空比

占空比可以在 0 到 1 之间变化,通常以百分比表示。

应用 场景:

PWM 的脉宽在高频(kHz)下变化,可以被视为连续的,用于控制电机的转速、调光 LED、驱动编码器、电源转换等。

呼吸灯原理:

1、定时器定时输出pwm波形

2、输出的pwm有高有低,对应灯是先灭再亮

3、人能看到的闪烁频率是24hz以下,也就是40ms内的闪烁看不见。(定时器定时时间1ms)

4、看不见闪烁但是亮的时间久,人眼看到的就是更亮。

Stm32定时器概述及案例_定时器_10

呼吸灯实现:

步骤1:找灯

Stm32定时器概述及案例_寄存器_11

Stm32定时器概述及案例_定时器_12

步骤2:创建工程

初始化灯

Stm32定时器概述及案例_初始化_13

初始化定时器

Stm32定时器概述及案例_寄存器_14

Stm32定时器概述及案例_引脚_15

步骤3:主函数中开始pwm输出

HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);

步骤4:主函数循环修改比较寄存器值

int i=0;
while (1)
{
    HAL_Delay(10);
    //修改比较寄存器的值0-10000,0-10000变化
    i+=10;
    if(i>10000)
        i=0;
    htim3.Instance->CCR2=i;
    
    /* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */
    
    /* USER CODE END 3 */
}