我在做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)
- {}
- }
复制代码
|