STM32定时器的几种用法

发布者:advancement3最新更新时间:2024-03-07 来源: elecfans关键字:STM32  定时器  定时功能 手机看文章 扫描二维码
随时随地手机看文章

一、常用的定时功能

(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);


}


关键字:STM32  定时器  定时功能 引用地址:STM32定时器的几种用法

上一篇:基于STM32的铁路自动围栏系统设计
下一篇:STM32G431之串口详解

小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved