我在做stm32的定時器TIM8 PWM輸出實驗時,配置完后,在TIM8_UP_TIM13_IRQHandler中斷上打了斷點,發(fā)現(xiàn)每次執(zhí)行完HAL_NVIC_EnableIRQ(ATIM_TIMX_NPWM_IRQn);這個語句后,都會自動進入一次中斷。清除更新中斷標志位也不行。因為HAL_NVIC_EnableIRQ(ATIM_TIMX_NPWM_IRQn);執(zhí)行完后會自動將相關(guān)標志位置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; /* 遞增計數(shù)模式 */
- 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); /* 開啟對應(yīng)PWM通道 */
- __HAL_TIM_ENABLE_IT(&g_timx_npwm_chy_handle, TIM_IT_UPDATE); /* 開啟更新中斷 */
-
- HAL_NVIC_SetPriority(ATIM_TIMX_NPWM_IRQn, 1, 3); /* 設(shè)置中斷優(yōu)先級,搶占優(yōu)先級1,子優(yōu)先級3 */
- HAL_NVIC_EnableIRQ(ATIM_TIMX_NPWM_IRQn); /* 開啟ITMx中斷 */
- //使能中斷后,會進入到中斷中,然后判斷后,關(guān)閉定時器(ATIM_TIMX_NPWM->CR1 &= ~(1 << 0); )
- }
- //定時器中斷
- void TIM8_UP_TIM13_IRQHandler(void)
- {
- uint16_t npwm = 0;
- /* 以下代碼沒有使用定時器HAL庫共用處理函數(shù)來處理,而是直接通過判斷中斷標志位的方式 */
- if(__HAL_TIM_GET_FLAG(&g_timx_npwm_chy_handle, TIM_FLAG_UPDATE) != RESET)
- {}
- }
復制代碼
|