新手上路
- 积分
- 30
- 金钱
- 30
- 注册时间
- 2017-3-25
- 在线时间
- 35 小时
|
8金钱
板子芯片是STM32F405ZGTx,我想在程序中可以随时更改定时器的设定值,所以在程序中会随时有定时器初始化,但是我发现定时器每次在初始化后开启时都会进一次中断。网上查了下也没有搞定,发帖求教。定时器的配置使用CubeMx配的,TIM时钟为36MHz。定时器初始化是我自己改的:void MX_timer4_Init(uint16_t x,uint16_t y)
{
TIM_ClockConfigTypeDef sClockSourceConfig;
TIM_MasterConfigTypeDef sMasterConfig;
htim4.Instance = TIM4;
htim4.Init.Prescaler = x;
htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
htim4.Init.Period = y;
htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
if (HAL_TIM_Base_Init(&htim4) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
if (HAL_TIM_ConfigClockSource(&htim4, &sClockSourceConfig) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
}
因为可能需要定时时间比较长,所以给PSC和Period都做了赋值。最高就可以定时到119s。
定时器中断程序如下:
void TIM4_IRQHandler(void)
{
switch(flag_time[0])
{
case 1:
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_5,GPIO_PIN_SET);
flag_time[0]=2;
if(time4[1]<=655)
{
MX_timer4_Init(3599,time4[1]*100-1);
HAL_TIM_Base_Start_IT(&htim4);
break;
}
else if(time4[1]>655)
{
MX_timer4_Init(65535,time4[1]*360000/65535-1);
HAL_TIM_Base_Start_IT(&htim4);
break;
}
case 2:
flag_time[0]=1;
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_5,GPIO_PIN_RESET);
if(time4[2]<=655)
{
MX_timer4_Init(3599,time4[2]*100-1);
HAL_TIM_Base_Start_IT(&htim4);
break;
}
else if(time4[2]>655)
{
MX_timer4_Init(65535,time4[2]*360000/65535-1);
HAL_TIM_Base_Start_IT(&htim4);
break;
}
case 3:
flag_time[0]=0;
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_5,GPIO_PIN_RESET);
HAL_TIM_Base_Stop_IT(&htim4);
break;
}
HAL_TIM_IRQHandler(&htim4);
}
然后我发现每次用
MX_timer4_Init(65535,time4[2]*360000/65535-1);
HAL_TIM_Base_Start_IT(&htim4);
初始化然后开启定时器时都会进中断,而不是我希望的只有在溢出时才进中断,求教。
|
最佳答案
查看完整内容[请看2#楼]
这个问题我也遇到过,定时器初始化后,定时器已开启就会立刻进入“更新中断”,所以产生了定时器开始就进中断的现象。开启定时器前先清除更新中断就好了。__HAL_TIM_CLEAR_FLAG(huart->pstUart_Emul_Peripheral->htim, TIM_FLAG_UPDATE);希望对你有帮助。
|