STM32-定時器中斷實現


一、工具

  1、硬件:STM32L053R8單片機(HAL庫)

  2、編譯環境:Atollic TrueSTUDIO for STM32 9.3.0

  3、輔助工具:STM32CubeMX

二、單片機系統時鍾配置

  1、系統時鍾配置(沒有顯示的默認),這里選擇的是內部的高速時鍾(HSI)作為時鍾源,系統時鍾頻率配置到24MHz。

 

三、定時器配置 

   1、選用的定時器為TIM22,時鍾源選擇內部時鍾,即24MHz,分頻值為24(設置值為24-1),自動重裝載值為1000(設置值為1000-1),得到該定時器的周期為(1000x24)/24000000 = 1ms。

 

 

   2、使能定時器中斷

四、生成工程並進行完善

  1、工程生成設置

 

 

   2、完善代碼

  因為用到了定時器中斷,在配置完定時器后,在定時器啟動之前清除一下更新事件中斷以防止中斷提前觸發(開啟定時器中斷后,每隔一個周期硬件就把定時器更新事件置1)。

/**
  * @brief TIM22 Initialization Function
  * @param None
  * @retval None
  */
static void MX_TIM22_Init(void)
{

  /* USER CODE BEGIN TIM22_Init 0 */

  /* USER CODE END TIM22_Init 0 */

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

  /* USER CODE BEGIN TIM22_Init 1 */
  /* 定時器設定的是1ms延時產生一次中斷 */
  /* USER CODE END TIM22_Init 1 */
  htim22.Instance = TIM22;
  htim22.Init.Prescaler = 23;
  htim22.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim22.Init.Period = 999;
  htim22.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim22.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  if (HAL_TIM_Base_Init(&htim22) != HAL_OK)
  {
    Error_Handler();
  }
  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  if (HAL_TIM_ConfigClockSource(&htim22, &sClockSourceConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim22, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN TIM22_Init 2 */
  __HAL_TIM_CLEAR_IT(&htim22, TIM_IT_UPDATE);
  /* USER CODE END TIM22_Init 2 */

}

 

  定時器中斷響應后會調用一個回調函數,該函數的內容可以由用戶自己添加(該函數為固定寫法不能隨意更改)。

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if(htim->Instance == TIM22)
    {
        HAL_TIM_Base_Stop_IT(&htim22);
    }
}

 

  3、其它不用修改的代碼

  定時器時鍾控制和中斷設置。

/**
* @brief TIM_Base MSP Initialization
* This function configures the hardware resources used in this example
* @param htim_base: TIM_Base handle pointer
* @retval None
*/
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
{
  if(htim_base->Instance==TIM22)
  {
  /* USER CODE BEGIN TIM22_MspInit 0 */

  /* USER CODE END TIM22_MspInit 0 */
    /* Peripheral clock enable */
    __HAL_RCC_TIM22_CLK_ENABLE();
    /* TIM22 interrupt Init */
    HAL_NVIC_SetPriority(TIM22_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(TIM22_IRQn);
  /* USER CODE BEGIN TIM22_MspInit 1 */

  /* USER CODE END TIM22_MspInit 1 */
  }

}

/**
* @brief TIM_Base MSP De-Initialization
* This function freeze the hardware resources used in this example
* @param htim_base: TIM_Base handle pointer
* @retval None
*/
void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base)
{
  if(htim_base->Instance==TIM22)
  {
  /* USER CODE BEGIN TIM22_MspDeInit 0 */

  /* USER CODE END TIM22_MspDeInit 0 */
    /* Peripheral clock disable */
    __HAL_RCC_TIM22_CLK_DISABLE();

    /* TIM22 interrupt DeInit */
    HAL_NVIC_DisableIRQ(TIM22_IRQn);
  /* USER CODE BEGIN TIM22_MspDeInit 1 */

  /* USER CODE END TIM22_MspDeInit 1 */
  }

}

 

  定時器中斷函數實現。

/**
  * @brief This function handles TIM22 global interrupt.
  */
void TIM22_IRQHandler(void)
{
  /* USER CODE BEGIN TIM22_IRQn 0 */

  /* USER CODE END TIM22_IRQn 0 */
  HAL_TIM_IRQHandler(&htim22);
  /* USER CODE BEGIN TIM22_IRQn 1 */

  /* USER CODE END TIM22_IRQn 1 */
}

 

  4、啟動定時器

  在啟動前清空計數器的內容,在有些情況下作用很大。

 __HAL_TIM_SET_COUNTER(&htim22, 0);
 HAL_TIM_Base_Start_IT(&htim22);

 

#end

 


免責聲明!

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



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