zoukankan      html  css  js  c++  java
  • 【STM32】TIM定时器

    TIM定时器(TIM3为例)

            初始化:

            A:结构体TIM_HandleTypeDef的成员:

            1、*Instance:类型为TIM_TypeDef,即对TIM的寄存器的映射,通过这个成员可以操作寄存器

            2、Init:类型为TIM_Base_InitTypeDef,对定时器特性进行配置,成员有

                    Prescaler:定时器预分频

                    CounterMode:向上计数、向下计数、中间对齐

                    Period:周期

                    ClockDivision:

                    RepetitionCounter:

                    AutoReloadPreload:自动重装立即有效/中断更新有效

               故Tout=(Period+1) * ((Prescaler+1)/Ft) us:Ft步长,即TIM依赖的时钟频率

            3、Channel:类型为HAL_TIM_ActiveChannel,设置定时器通道

            4、*hdma[7]:DMA相关

            5、Lock:定时器锁,为HAL_LOCKHAL_UNLOCK一般和State搭配用

            6、State:定时器状态,常用HAL_TIM_STATE_BUSYHAL_TIM_STATE_READY

            上述参数配置后通过HAL_TIM_Base_Init(&htim3)传入完成配置

            B:结构体TIM_ClockConfigTypeDefTIM_MasterConfigTypeDef

            1、TIM_ClockConfigTypeDef是对TIM依赖的时钟进行配置,默认情况下TIM 挂在APB时钟上,若需要使用外部时钟,可对成员ClockSource进行配置

            2、TIM_MasterConfigTypeDef是当需要使用到定时器的级联时内部输出通道及SlaveMode的配置,默认都是否

            

    TIM_HandleTypeDef htim3;
    
    void MX_TIM3_Init(void)
    {
      TIM_ClockConfigTypeDef sClockSourceConfig = {0};
      TIM_MasterConfigTypeDef sMasterConfig = {0};
    
      htim3.Instance = TIM3;
      htim3.Init.Prescaler = 8999;
      htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
      htim3.Init.Period = 4999;
      htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
      htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
      if (HAL_TIM_Base_Init(&htim3) != HAL_OK)
      {
        Error_Handler();
      }
      sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
      if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK)
      {
        Error_Handler();
      }
      sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
      sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
      if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
      {
        Error_Handler();
      }
    }

            C:HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)

            1、使能TIM时钟,设置并使能中断NVIC

            2、如果有输出的话,配置对应GPIO输出

            

    void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
    {
    
      if(tim_baseHandle->Instance==TIM3)
      {
        __HAL_RCC_TIM3_CLK_ENABLE();
    
        HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0);
        HAL_NVIC_EnableIRQ(TIM3_IRQn);
      }
    }

            启动并触发:

            启动:HAL_TIM_Base_Start_IT(&htim3)主函数中直接调用启动定时器或直接htim->State = HAL_TIM_STATE_READY

            触发:同样的有中断服务函数TIM3_IRQHandler(void),内调用公用的HAL_TIM_IRQHandler(&htim3)在这将htim3的参数传入

            回调:

            重写weak函数void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim),在Callback里判断定时器类型以及写需要执行的内容,实际上从这个Callback的命名可以看出,TIM有很多种Callback

  • 相关阅读:
    [LintCode] Maximum Subarray Difference
    [HDU 3415] Max Sum of Max-K-sub-sequence
    [LintCode] Count of Smaller Number before itself
    [LeetCode] Invert Binary Tree
    [LintCode] Max Tree
    [LeetCode] Implement Stack using Queues
    [LintCode] Maximum Subarray III
    [LeetCode] Basic Calculator & Basic Calculator II
    [LeetCode] Rectangle Area
    Tensorflow[目录结构]
  • 原文地址:https://www.cnblogs.com/ZYQS/p/15054308.html
Copyright © 2011-2022 走看看