[經驗] STM32定時器(自動重裝)經驗分享

annysky2012 樓主
2021-2-5 14:15
本帖最后由 annysky2012 于 2021-2-5 14:19 編輯

有網友在論壇發帖求教,定時器明明初始化時設置的定時值是1us,而自己設置定時值(1S)以后,而實際為4s。

網友帖子(http://bbs.eeworld.com.cn/thread-1156521-1-1.html)在這里。

經過自己對STM32的中文手冊的查看,以及使用自己開發板運行后,現象依舊如此,開始也是百思不得其解。通過查看資料得知,原來網友把自動重裝值設置的有問題。

 

現定義幾個參數值:

//arr:自動重裝值。

// psc:時鐘預分頻數 

//定時器溢出間計算方法  :Tout=((arr+1)*(psc+1))/Ft us.

//Ft=定時器工作頻率單位 :Mhz

 

根據定時器的溢出時間計算方法,自動重裝值和分頻系數在設置時必須減一。而自動重裝值又不能為0(這是不允許的)。所以在配置的時候,我們可以這樣:

  • TIM_TimeBaseStructure.TIM_Period = 2-1; //2 u second
  • TIM_TimeBaseStructure.TIM_Prescaler = 24-1;//PrescalerValue

所以,Tout=((arr+1)*(psc+1))/Ft=(TIM_Period +1)*(TIM_Prescaler+1)/24000000 = 2*24/24000000=2us。

 

也就是每進一次中斷時2us,在設置計數次數時要注意。

以下為回環函數:

/* USER CODE BEGIN 4 */
//定時時間2us
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    static uint32_t TimerCount = 0;
    if(htim->Instance==TIM7)
    {
        TimerCount++;
        if(TimerCount>250)//0.5mS
        {
            TimerCount=0;
            HAL_GPIO_TogglePin(LD1_GPIO_Port,LD1_Pin); 
        }
    }
}
/* USER CODE END 4 */

定時器初始化:

/**
  * @brief TIM7 Initialization Function
  * @param None
  * @retval None
  */
static void MX_TIM7_Init(void)
{

  /* USER CODE BEGIN TIM7_Init 0 */

  /* USER CODE END TIM7_Init 0 */

  TIM_MasterConfigTypeDef sMasterConfig = {0};

  /* USER CODE BEGIN TIM7_Init 1 */

  /* USER CODE END TIM7_Init 1 */
  htim7.Instance = TIM7;
  htim7.Init.Prescaler = 108-1;
  htim7.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim7.Init.Period = 2-1;
  htim7.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
  if (HAL_TIM_Base_Init(&htim7) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim7, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN TIM7_Init 2 */
    HAL_TIM_Base_Start_IT(&htim7); 
  
  /* USER CODE END TIM7_Init 2 */

}

底層函數:

/**
* @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==TIM7)
  {
  /* USER CODE BEGIN TIM7_MspInit 0 */

  /* USER CODE END TIM7_MspInit 0 */
    /* Peripheral clock enable */
    __HAL_RCC_TIM7_CLK_ENABLE();
    /* TIM7 interrupt Init */
    HAL_NVIC_SetPriority(TIM7_IRQn, 4, 0);
    HAL_NVIC_EnableIRQ(TIM7_IRQn);
  /* USER CODE BEGIN TIM7_MspInit 1 */

  /* USER CODE END TIM7_MspInit 1 */
  }

}

中斷函數:

/**
  * @brief This function handles TIM7 global interrupt.
  */
void TIM7_IRQHandler(void)
{
  /* USER CODE BEGIN TIM7_IRQn 0 */

  /* USER CODE END TIM7_IRQn 0 */
  HAL_TIM_IRQHandler(&htim7);
  /* USER CODE BEGIN TIM7_IRQn 1 */

  /* USER CODE END TIM7_IRQn 1 */
}

運行結果:

IMG20210205135741.jpg

沒有什么不可以,我就是我,不一樣的煙火! 

回復評論 (5)

沙發 okhxyyo

2021-2-5 14:42

贊@!!!!!感謝樓主分享~樓主太有心了

玩板看這里:

http://bbs.eeworld.com.cn/elecplay.html

EEWorld測評頻道眾多好板等你來玩,還可以來頻道許愿樹許愿說說你想要玩的板子,我們都在努力為大家實現!

板凳 annysky2012

2021-2-5 14:43
引用: okhxyyo 發表于 2021-2-5 14:42 贊@!!!!!感謝樓主分享~樓主太有心了

持續努力~~~~~

沒有什么不可以,我就是我,不一樣的煙火! 

4樓 ddllxxrr

2021-2-6 08:59
引用: annysky2012 發表于 2021-2-5 14:43 持續努力~~~~~

謝謝分享

http://shop34182318.taobao.com/
https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr

5樓 gasasong

2021-2-23 13:13

謝謝分享,學習了

6樓 freebsder

2021-2-23 22:11

謝謝分享

默認摸魚

電子工程世界版權所有 京B2-20211791 京ICP備10001474號-1 京公網安備 11010802033920號
    我也要說兩句
    發送
    評論
    萝卜大香蕉