1.HAL库的中断处理
在stm32f4xx_it.c中,找到cubeMX自动生成的中断处理函数
void TIM1_UP_TIM10_IRQHandler(void)
{
/* USER CODE BEGIN TIM1_UP_TIM10_IRQn 0 */
/* USER CODE END TIM1_UP_TIM10_IRQn 0 */
HAL_TIM_IRQHandler(&htim1);
/* USER CODE BEGIN TIM1_UP_TIM10_IRQn 1 */
/* USER CODE END TIM1_UP_TIM10_IRQn 1 */
}
该函数调用了HAL库提供的HAL_TIM_IRQHandler这一函数
1.1 HAL_TIM_IRQHandler介绍
void HAL_TIM_IRQHandler(TIM_HandleTypeDef *htim)
函数名 | HAL_TIM_IRQHandler |
---|---|
函数作用 | HAL对涉及中断的寄存器进行处理 |
返回值 | void |
参数 | *htim 定时器的句柄指针,如定时器1就输入&htim1,定时器2就输入&htim2 |
在HAL_TIM_IRQHandler对各个涉及中断的寄存器进行了处理之后,会自动调用中断回调函数HAL_TIM_PeriodElapsedCallback,该函数使用__weak修饰符修饰,即用户可以在别处重新声明该函数,调用时将优先进入用户声明的函数。
__weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
一般我们需要在中断回调函数中判断中断来源并执行相应的用户操作。HAL库在完成定时器的中断服务函数后会自动调用定时器回调函数。
通过配置TIM1的分频值和重载值,使得TIM的中断以500ms的周期被触发。因此中断回调函数也是以500ms为周期被调用。
例:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim == &htim1)
{
ledtoggle();
}
}
1.2 HAL_TIM_Base_Start函数
如果不开启中断,仅让定时器以定时功能工作,为了使定时器开始工作,需要调用HAL库提供的函数。
HAL_StatusTypeDef HAL_TIM_Base_Start(TIM_HandleTypeDef *htim)
如果需要使用定时中断,则需要调用函数
函数名 | HAL_TIM_Base_Start |
---|---|
函数作用 | 使对应的定时器只开始工作 |
返回值 | HAL_StatusTypeDef,HAL库定义的几种状态,如果成功使定时器开始工作,则返回HAL_OK |
参数 | *htim 定时器的句柄指针,如定时器1就输入&htim1,定时器2就输入&htim2 |
如果需要使用定时中断,则需要调用函数
HAL_StatusTypeDef HAL_TIM_Base_Start_IT(TIM_HandleTypeDef *htim)
函数名 | HAL_TIM_Base_Start_IT |
---|---|
函数作用 | 使对应的定时器开始工作,并使能其定时中断 |
返回值 | HAL_StatusTypeDef,HAL库定义的几种状态,如果成功使定时器开始工作,则返回HAL_OK |
参数 | *htim 定时器的句柄指针,如定时器1就输入&htim1,定时器2就输入&htim2 |
以上两个函数如果要使用则都需要在主循环while(1)之前调用。
例:
HAL_TIM_Base_Start_IT(&htim1);