STM32定时器的几种用法

发布时间:2024-03-07  

一、常用的定时功能

(1)基本、通用、高级定时器都有最基本的定时功能,定时功能用到的函数如下:

HAL_TIM_Base_Init 初始化定时,包括分频、 预装值等。

HAL_TIM_ConfigClockSource 选择定时器的时钟源

HAL_TIM_Base_Start_IT 开始定时器

HAL_TIM_PeriodElapsedCallback 超时后的回调函数

(2)Cubemx的配置,不管什么定时器,都是这个配置,注意开启中断,计算好最终的定时器时钟

(3)代码片段


1 void MX_TIM12_Init(void)

 2 {

 3   TIM_ClockConfigTypeDef sClockSourceConfig = {0};

 4 

 5   htim12.Instance = TIM12;

 6   htim12.Init.Prescaler = 199;

 7   htim12.Init.CounterMode = TIM_COUNTERMODE_UP;

 8   htim12.Init.Period = 999;

 9   htim12.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

10   htim12.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;

11   if (HAL_TIM_Base_Init(&htim12) != HAL_OK)

12   {

13     Error_Handler();

14   }

15   sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;

16   if (HAL_TIM_ConfigClockSource(&htim12, &sClockSourceConfig) != HAL_OK)

17   {

18     Error_Handler();

19   }

20

21 }

22 

23 int main(void)

24 {

33   HAL_Init();

34 

35   /* USER CODE BEGIN Init */

36 

37   /* USER CODE END Init */

38 

39   /* Configure the system clock */

40   SystemClock_Config();

47   MX_GPIO_Init();

48   MX_TIM12_Init();

49   /* USER CODE BEGIN 2 */

50     HAL_TIM_Base_Start_IT(&htim12);

51   /* USER CODE END 2 */

52 

53   /* Infinite loop */

54   /* USER CODE BEGIN WHILE */

55   while (1)

56   {

57     /* USER CODE END WHILE */

58         HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_13);

59         HAL_Delay(1000);

60     /* USER CODE BEGIN 3 */

61   }

62   /* USER CODE END 3 */

63 }

64 

65 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)

66 {

67         if(htim->Instance == TIM12)

68         {

69                 static uint16_t cnt = 0;    

70                 if(++cnt >= 1000)

71                 {

72                         cnt = 0;

73                         HAL_GPIO_TogglePin(GPIOH,GPIO_PIN_9);

74                 }

75         }

76         

77 }

二、使用通用定时器或者高级定时器来生产PWM波形


(1)使用通用定时器生成1路PWM


a.使用到的定时器API


HAL_TIM_PWM_Init


HAL_TIM_PWM_ConfigChannel


HAL_TIM_PWM_Start


__HAL_TIM_SET_COMPARE


b.Cubemx的配置

选择内部始终,Channel 1 为PWM生成。

根据配置信息,可知:

定义定时器预分频,定时器实际时钟频率为:200MHz/(GENERAL_TIMx_PRESCALER+1)

实际时钟频率为:20MHz

定义定时器周期,当定时器开始计数到GENERAL_TIMx_PERIOD值是更新定时器并生成对应事件和中断

定时器产生中断频率为:20MHz/(999+1)=20KHz,即50us定时周期

GENERAL_TIM_CH1_PULSE/GENERAL_TIM_PERIOD*100%

所以,以上配置生成的PWM的频率为20KHz,占空比为50%。


c. 代码实现


int main(void)

{

  HAL_Init();


  SystemClock_Config();


  MX_GPIO_Init();

  MX_TIM2_Init();


    HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);


  while (1)

  {

  }

}


void MX_TIM2_Init(void)

{

  TIM_ClockConfigTypeDef sClockSourceConfig = {0};

  TIM_MasterConfigTypeDef sMasterConfig = {0};

  TIM_OC_InitTypeDef sConfigOC = {0};


  htim2.Instance = TIM2;

  htim2.Init.Prescaler = 9;

  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;

  htim2.Init.Period = 999;

  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;

  htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;

  if (HAL_TIM_Base_Init(&htim2) != HAL_OK)

  {

    Error_Handler();

  }

  sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;

  if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)

  {

    Error_Handler();

  }

  if (HAL_TIM_PWM_Init(&htim2) != HAL_OK)

  {

    Error_Handler();

  }

  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;

  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;

  if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)

  {

    Error_Handler();

  }

  sConfigOC.OCMode = TIM_OCMODE_PWM1;

  sConfigOC.Pulse = 500;

  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;

  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;

  if (HAL_TIM_PWM_ConfigChannel(&htim2, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)

  {

    Error_Handler();

  }

  HAL_TIM_MspPostInit(&htim2);


}


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>