学习过程中发现配置号Timer定时器功能之后,原本应该定时到指定的时间再进入中断,结果MCU开机就会进入一次中断,不符合逻辑,所以尝试解决这个问题。
拜读各大佬的博客后发现没有HAL库的解决办法,于是转身向Google走去,找到了解决办法,分享给大家。
解决办法
在TIM初始化函数 HAL_TIM_Base_Init() 与 HAL_TIM_Base_Start_IT();
之间加一条语句 __HAL_TIM_CLEAR_FLAG(&htim7, TIM_SR_UIF); //注意将htim7改成自己的timer
其中TIM_SR_UIF是 Update interrupt Flag 寄存器。
原因就是HAL库中定时器初始化后没有更新中断标志位,__HAL_TIM_CLEAR_FLAG(&htim7, TIM_SR_UIF)后清除了更新中断标志位,此时TIM_SR_UIF为0,中断产生后TIM_SR_UIF为1。
另外
细心的朋友会发现TIM_SR_UIF其实是SR(定时器状态寄存器)的最低位,初始化时若TIM_SR_UIF为1则SR也为1,若TIM_SR_UIF为0则SR也为0,因此存在另一种解决办法:将__HAL_TIM_CLEAR_FLAG(&htim7, TIM_SR_UIF);换成htim7.Instance->SR = 0也是可以的。
示范
/**
* @brief TIM7 Initialization Function
* @param None
* @retval None
*/
void MX_TIM7_Init(uint16_t arr, uint16_t psc)
{
/* USER CODE BEGIN TIM7_Init 0 */
/* USER CODE END TIM7_Init 0 */
TIM_MasterConfigTypeDef sMasterConfig = {0};
/* USER CODE BEGIN TIM7_Init 1 */
//(uint32_t)ceil(SECOND_WAKEUP) * 10000 / 2, 8400 - 1
/* USER CODE END TIM7_Init 1 */
htim7.Instance = TIM7;
htim7.Init.Prescaler = psc;
htim7.Init.CounterMode = TIM_COUNTERMODE_UP;
htim7.Init.Period = arr;
htim7.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
if (HAL_TIM_Base_Init(&htim7) != HAL_OK)// 定时器初始化
{
Error_Handler();
}
/* USER CODE BEGIN TIM7_Init 2 */
__HAL_TIM_CLEAR_FLAG(&htim7, TIM_SR_UIF);//添加这条语句解决问题
//htim7.Instance->SR = 0; //这是另一种解决办法
HAL_TIM_Base_Start_IT(&htim7);//开启定时器中断
/* USER CODE END TIM7_Init 2 */
}