STM32CubeMx配置
- RCC设置HSE为Crystal/Ceramic Resonator
- SYS设置Debug为Serial Wire
- GPIO设置PD2为GPIO_Output
定时器的配置主要由两个:定时时间与是否重装置定时器
定时频率=定时器时钟/(预分频+1)/(计数值+1)Hz
定时时间=1/定时频率s
- TIM3设置时钟源为内部时钟,PSC为(7200-1),ARR为(10000-1),因为定时器时钟为72M
- 所以定时频率$\nu = \frac7200000072000000 = 1$,定时时间为$t=1/1=1$s。

打开NVIC中断

生成代码
tim.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| TIM_HandleTypeDef htim3;
void MX_TIM3_Init(void) {
TIM_ClockConfigTypeDef sClockSourceConfig = {0}; TIM_MasterConfigTypeDef sMasterConfig = {0};
htim3.Instance = TIM3; htim3.Init.Prescaler = 7200-1; htim3.Init.CounterMode = TIM_COUNTERMODE_UP; htim3.Init.Period = 10000-1; htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; if (HAL_TIM_Base_Init(&htim3) != HAL_OK) { Error_Handler(); } sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; if (HAL_TIM_ConfigClockSource(&htim3, &sClockSourceConfig) != HAL_OK) { Error_Handler(); } sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK) { Error_Handler(); }
}
|
程序编写
主函数中使能中断
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| int main(void) {
HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_TIM3_Init(); HAL_TIM_Base_Start_IT(&htim3);
while (1) {
} }
|
编写回调函数
1 2 3 4 5 6 7 8 9
| void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim==&htim3) { HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_2); } }
|
烧录程序,这时会看到LED每1s翻转一次。