一、常用的定时功能
(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的铁路自动围栏系统设计
下一篇:STM32G431之串口详解