• 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)
      {
      
      }

      

  • 相关阅读:
    怎么在虚拟机下的Linux系统安装数据库
    bbs仿博客
    算法思想
    vue前后台交互
    vue项目内文件的使用和配置
    pycharm使用vue
    vue之vue-cookies
    跨域请求
    vue的常用插件
    vue的生命周期
  • 原文地址:https://www.cnblogs.com/ike_li/p/15133051.html
Copyright © 2020-2023  润新知