定时器中断实验:STM32+HAL+CubeMX
1 步骤:
1.1 初始化定时器参数
TIM_HandleTypeDef htim2; void MX_TIM2_Init(void) { htim2.Instance = TIM2; //定时器2 htim2.Init.Prescaler = 4999; //分频系数psc htim2.Init.CounterMode = TIM_COUNTERMODE_UP; //向上计数器 htim2.Init.Period = 1599; //自动装载值 htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; //时钟分频因子 htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; HAL_TIM_Base_Init(&htim2); //初始化定时器2 HAL_TIM_Base_Start_IT(&htim2); //使能定时器2和更新中断 }
1.2 开启时钟、设置中断优先级
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle) { __HAL_RCC_TIM2_CLK_ENABLE(); //使能TIM2时钟 HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0); //设置中断优先级,抢占0,子优先级0 HAL_NVIC_EnableIRQ(TIM2_IRQn); //开启TIM2中断 }
1.3 编写中断服务函数
void TIM3_IRQHandler(void) { HAL_TIM_IRQHandler(&htim2); }
1.4 编写中断回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if(htim==(&htim2)) //判断是否为定时器TIM2 { //此处写要实现的功能begin //此处写要实现的功能end //HAL_TIM_Base_MspDeInit(&htim2); //根据需要,关闭定时器 } }
1.5 在main函数中调用MX_TIM2_Init();
2 使用CubeMX配置:
2.1 设置Clock Source时钟源、Prescaler、Counter Period参数
2.2 设置NVIC中断及优先级
3 基础知识
Prescaler——预分频器
Counter Period——主计数器
Preemption Priority——抢占优先级
Sub Priority——子优先级
定时时间=(Prescaler+1)*(Counter Period+1)*1/定时器时钟频率
例:时钟信号1MHz,Prescaler为9,Counter Period为999,则定时时间=(9+1)*(999+1)*1/1000=10ms