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);}
互联网
Cubemx的配置,不管什么定时器,都是这个配置,注意开启中断,计算好最终的定时器时钟。
2023-02-15 14:08:53
【环球新视野】工行五星级客户有什么用?工行五星级客户算vip吗
工行五星级客户有什么用?工行五星级客户算vip吗,工行五星级客户有什么用一、当达到五星级标准时,可以持身份证到工行任一网点柜台办理理财金
2023-02-15 14:08:37
我可以直接在环氧漆上涂珐琅吗?
从雄伟的喷气式飞机到普通的拖船,搪瓷通常用于需要耐用油漆涂层的表面。它几乎可以提供任何所需的颜色,它是一种面漆,因此需要
2023-02-15 13:24:25