主页 > 互联网 > 内容页

STM32定时器的几种用法

2023-02-15 14:08:53 来源:博客园-lzh666

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   }2021 }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);}

标签: 时钟频率 定时器时钟

上一篇:
下一篇: