STM32 定时器

一、

1.时钟是单片机运行的基础,时钟信号推动单片机内各个部分执行相应的指令。

 时钟系统就是CPU的脉搏,决定cpu速率,像人的心跳一样 只有有了心跳,人才能做其他的事情,而单片机有了时钟,才能够运行执行指令,才能够做其他的处理 (点灯,串口,ADC),时钟的重要性不言而喻。

2.定时器发生中断时间的计算方法:

定时时间 = (可编程预分频器+1 ) X (主计数器+1) X 1/ 定时器时钟频率
例:假设时钟信号为1KHz,可编程预分频器系数为9,主计数器系数为9。此时定时器为0.1秒

二、

1.Timer2 时钟频率 200MHz

 

 

2.定时器发生中断时间计算

定时器发生中断时间的计算方法:
定时时间 = (可编程预分频器+1 ) X (主计数器+1) X 1/ 定时器时钟频率

 

定时器timer2时钟频率 200MHz

预分频器:19999

计数器:9999

定时器时间=((19999+1)*(9999+1)) / 200 000 000 =1 秒

 

 

 

 3.开启中断

 

 

 4.在stm32h7xx_it.c中生成的中断处理函数如下,定时器TIM2所有的中断都会调用该中断服务函数TIM2_IRQHandler:

在中断处理函数中自动生成了HAL_TIM_IRQHandler(&htim2)代码,该代码会自动根据中断事件回调相应的函数,

这里我们需要处理更新中断的事件,回调函数默认是__weak定义的,所以在tim.c中重新定义该回调函数,并且在该函数中添加功能的时候,

因为该回调函数会被所有的定时器共用,所以需要先判断是哪个定时器在调用:

void TIM2_IRQHandler(void)
{
  /* USER CODE BEGIN TIM2_IRQn 0 */

  /* USER CODE END TIM2_IRQn 0 */
  HAL_TIM_IRQHandler(&htim2);
  /* USER CODE BEGIN TIM2_IRQn 1 */

  /* USER CODE END TIM2_IRQn 1 */
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef* tim_baseHandle)
{
    if(tim_baseHandle->Instance == htim2.Instance)
    {
    
    
    }
      
}

5.整个代码

#ifndef __TIM_H__
#define __TIM_H__

#include "main.h"

extern TIM_HandleTypeDef htim2;

void MX_TIM2_Init(void);

#endif
#include "tim.h"


TIM_HandleTypeDef htim2;


void MX_TIM2_Init(void)
{



  TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};


  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 19999;
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim2.Init.Period = 9999;
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
  {
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }


}

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{

  if(tim_baseHandle->Instance==TIM2)
  {

    __HAL_RCC_TIM2_CLK_ENABLE();
  
    HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(TIM2_IRQn);

  }
}

void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* tim_baseHandle)
{

  if(tim_baseHandle->Instance==TIM2)
  {

    __HAL_RCC_TIM2_CLK_DISABLE();

    /* TIM2 interrupt Deinit */
    HAL_NVIC_DisableIRQ(TIM2_IRQn);

  }
}

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef* tim_baseHandle)
{
    if(tim_baseHandle->Instance == htim2.Instance)
    {
    
    
    }
      
}

6.开启

  MX_TIM2_Init();
  HAL_TIM_Base_Start_IT(&htim2);

  while (1)
  {
  
  }

  

原文地址:https://www.cnblogs.com/ike_li/p/15133051.html