STM32CubeMX HAL庫自定義延時函數 ms和us

1. stm32 HAL庫 確定定時器時鐘

確定定時器爲哪個時鐘?

  1. 找到初始化函數 MX_TIM1_Init();
  2. 進入函數,找到 HAL_TIM_Base_Init(&htim1)
  3. 進入函數,找到 HAL_TIM_Base_MspInit(htim);
  4. 進入函數,依次找到定時器時鐘開啓函數;
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle)
{

  if(tim_baseHandle->Instance==TIM1)
  {
  /* USER CODE BEGIN TIM1_MspInit 0 */

  /* USER CODE END TIM1_MspInit 0 */
    /* TIM1 clock enable */
    //就是這裏,進入就能看見是哪個時鐘
    __HAL_RCC_TIM1_CLK_ENABLE();
  /* USER CODE BEGIN TIM1_MspInit 1 */

  /* USER CODE END TIM1_MspInit 1 */
  }
  else if(tim_baseHandle->Instance==TIM3)
  {
  /* USER CODE BEGIN TIM3_MspInit 0 */

  /* USER CODE END TIM3_MspInit 0 */
    /* TIM3 clock enable */
    __HAL_RCC_TIM3_CLK_ENABLE();

    /* TIM3 interrupt Init */
    HAL_NVIC_SetPriority(TIM3_IRQn, 1, 0);
    HAL_NVIC_EnableIRQ(TIM3_IRQn);
  /* USER CODE BEGIN TIM3_MspInit 1 */

  /* USER CODE END TIM3_MspInit 1 */
  }
  else if(tim_baseHandle->Instance==TIM8)
  {
  /* USER CODE BEGIN TIM8_MspInit 0 */

  /* USER CODE END TIM8_MspInit 0 */
    /* TIM8 clock enable */
    __HAL_RCC_TIM8_CLK_ENABLE();
  /* USER CODE BEGIN TIM8_MspInit 1 */

  /* USER CODE END TIM8_MspInit 1 */
  }
}
  • 假如我們要看TIM1在哪個時鐘下,進入TIM1時鐘開啓函數即可
    在這裏插入圖片描述

2. 配置定時器1爲 ms 毫秒延時定時器

  • 根據文章開頭的方法,定時器1使用APB2時鐘,主頻80MHz
    在這裏插入圖片描述
  • 設置TIM1參數,分頻係數10,000,計數頻率爲8KHz
    在這裏插入圖片描述
  • 生成工程,添加延時函數代碼
void tx_delay_ms(uint16_t nms)	//量程0-8191ms
{
		__HAL_TIM_SetCounter(&htim1, 0);//htim1

		__HAL_TIM_ENABLE(&htim1);

		while(__HAL_TIM_GetCounter(&htim1) < (8 * nms));//計數頻率8KHz,8次即爲1ms
		/* Disable the Peripheral */
		__HAL_TIM_DISABLE(&htim1);
}
  • 然後再在頭文件添加聲明即可

3. 配置定時器8爲 us 微秒延時定時器

  • 根據文章開頭的方法,定時器8使用APB2時鐘,主頻80MHz
    在這裏插入圖片描述
  • 設置TIM8參數,分頻係數10,計數頻率爲8MHz在這裏插入圖片描述
  • 生成工程,添加延時函數代碼
void tx_delay_us(uint16_t nus)	//量程0-8191us
{
		__HAL_TIM_SetCounter(&htim8, 0);//htim8

		__HAL_TIM_ENABLE(&htim8);

		while(__HAL_TIM_GetCounter(&htim8) < (8 * nus));//計數頻率8MHz,8次即爲1us
		/* Disable the Peripheral */
		__HAL_TIM_DISABLE(&htim8);
}
  • 然後再在頭文件添加聲明即可

4. 中斷方式延時函數

  • 我們使用定時器3來產生中斷,定時器3在APB1下,80MHz
    在這裏插入圖片描述
  • 設置定時器3參數
    在這裏插入圖片描述
  • 編寫延時函數
  1. 首先聲明中斷累加變量
static volatile uint16_t tim3_counter;
  1. 編寫延時函數延時時長(0-65535ms)
void tim3_delay_ms(uint16_t nms)
{
	tim3_counter = 0;
	while(tim3_counter!=nms);
}
  • 設置定時器中斷回調函數
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if (htim->Instance == htim3.Instance)	//定時器3中斷 1ms/次
	{
		tim3_counter++;
	}
}
  • 開始使用!

5. 完成!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章