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
+關注
關注
2270文章
10915瀏覽量
356742 -
定時
+關注
關注
1文章
122瀏覽量
25457 -
定時器
+關注
關注
23文章
3254瀏覽量
115069 -
代碼
+關注
關注
30文章
4808瀏覽量
68808 -
回調函數
+關注
關注
0文章
87瀏覽量
11598
發布評論請先 登錄
相關推薦
評論