标题:
请问HAL库开启定时器中断后,自动进入一次中断的原因
[打印本页]
作者:
家星
时间:
2022-7-22 10:31
标题:
请问HAL库开启定时器中断后,自动进入一次中断的原因
我在做stm32的定时器TIM8 PWM输出实验时,配置完后,在TIM8_UP_TIM13_IRQHandler中断上打了断点,发现每次执行完HAL_NVIC_EnableIRQ(ATIM_TIMX_NPWM_IRQn);这个语句后,都会自动进入一次中断。清除更新中断标志位也不行。因为HAL_NVIC_EnableIRQ(ATIM_TIMX_NPWM_IRQn);执行完后会自动将相关标志位置1.
请问有什么好的办法,可以让定时器配置完后,不自动进一次中断。
//PWM输出初始化配置
void atim_timx_npwm_chy_init(uint16_t arr, uint16_t psc)
{
GPIO_InitTypeDef gpio_init_struct;
ATIM_TIMX_NPWM_CHY_GPIO_CLK_ENABLE(); /* TIMx通道IO时钟使能 */
ATIM_TIMX_NPWM_CHY_CLK_ENABLE(); /* TIMx时钟使能 */
gpio_init_struct.Pin = ATIM_TIMX_NPWM_CHY_GPIO_PIN; /* 通道y的GPIO */
gpio_init_struct.Mode = GPIO_MODE_AF_PP; /* 复用推挽输出 */
gpio_init_struct.Pull = GPIO_PULLUP; /* 上拉 */
gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH; /* 高速 */
gpio_init_struct.Alternate = ATIM_TIMX_NPWM_CHY_GPIO_AF; /* 端口复用 */
HAL_GPIO_Init(ATIM_TIMX_NPWM_CHY_GPIO_PORT, &gpio_init_struct); /* 初始化IO */
g_timx_npwm_chy_handle.Instance = ATIM_TIMX_NPWM; /* 定时器x */
g_timx_npwm_chy_handle.Init.Prescaler = psc; /* 定时器分频 */
g_timx_npwm_chy_handle.Init.CounterMode = TIM_COUNTERMODE_UP; /* 递增计数模式 */
g_timx_npwm_chy_handle.Init.Period = arr; /* 自动重装载值 */
g_timx_npwm_chy_handle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; /* 使能TIMx_ARR进行缓冲 */
HAL_TIM_PWM_Init(&g_timx_npwm_chy_handle); /* 初始化PWM */
timx_oc_npwm_chy.OCMode = TIM_OCMODE_PWM1; /* 模式选择PWM1 */
timx_oc_npwm_chy.Pulse = ( arr + 1 )/2; /* 比较值为重装载值的50%,即占空比为50% */
timx_oc_npwm_chy.OCPolarity = TIM_OCPOLARITY_HIGH; /* 输出比较极性为高 */
HAL_TIM_PWM_ConfigChannel(&g_timx_npwm_chy_handle, &timx_oc_npwm_chy, ATIM_TIMX_NPWM_CHY); /* 配置TIMx通道y */
HAL_TIM_PWM_Start(&g_timx_npwm_chy_handle, ATIM_TIMX_NPWM_CHY); /* 开启对应PWM通道 */
__HAL_TIM_ENABLE_IT(&g_timx_npwm_chy_handle, TIM_IT_UPDATE); /* 开启更新中断 */
HAL_NVIC_SetPriority(ATIM_TIMX_NPWM_IRQn, 1, 3); /* 设置中断优先级,抢占优先级1,子优先级3 */
HAL_NVIC_EnableIRQ(ATIM_TIMX_NPWM_IRQn); /* 开启ITMx中断 */
//使能中断后,会进入到中断中,然后判断后,关闭定时器(ATIM_TIMX_NPWM->CR1 &= ~(1 << 0); )
}
//定时器中断
void TIM8_UP_TIM13_IRQHandler(void)
{
uint16_t npwm = 0;
/* 以下代码没有使用定时器HAL库共用处理函数来处理,而是直接通过判断中断标志位的方式 */
if(__HAL_TIM_GET_FLAG(&g_timx_npwm_chy_handle, TIM_FLAG_UPDATE) != RESET)
{}
}
复制代码
作者:
Hephaestus
时间:
2022-7-22 19:17
用到的时候再打开中断,或者加一个标志位放弃第一次中断操作。
作者:
yzwzfyz
时间:
2022-7-29 15:47
本帖最后由 yzwzfyz 于 2022-8-1 08:50 编辑
原因是,的确中断条件具备了。
虽然你清了标记,但你无法证明,清除之后中断条件消失了。
作者:
天ノ忆
时间:
2022-8-10 17:54
这跟你用不用hal库没关系,用标准库有时候也会这样,对程序基本不影响,可以试试这样,先清除中断标志,然后使能定时器中断
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1