【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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM