找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1516|回复: 3
打印 上一主题 下一主题
收起左侧

请问HAL库开启定时器中断后,自动进入一次中断的原因

[复制链接]
跳转到指定楼层
楼主
ID:585428 发表于 2022-7-22 10:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在做stm32的定时器TIM8  PWM输出实验时,配置完后,在TIM8_UP_TIM13_IRQHandler中断上打了断点,发现每次执行完HAL_NVIC_EnableIRQ(ATIM_TIMX_NPWM_IRQn);这个语句后,都会自动进入一次中断。清除更新中断标志位也不行。因为HAL_NVIC_EnableIRQ(ATIM_TIMX_NPWM_IRQn);执行完后会自动将相关标志位置1.
请问有什么好的办法,可以让定时器配置完后,不自动进一次中断。

  1. //PWM输出初始化配置
  2. void atim_timx_npwm_chy_init(uint16_t arr, uint16_t psc)
  3. {
  4.     GPIO_InitTypeDef gpio_init_struct;

  5.     ATIM_TIMX_NPWM_CHY_GPIO_CLK_ENABLE();                                           /* TIMx通道IO时钟使能 */
  6.     ATIM_TIMX_NPWM_CHY_CLK_ENABLE();                                                /* TIMx时钟使能 */

  7.     gpio_init_struct.Pin = ATIM_TIMX_NPWM_CHY_GPIO_PIN;                             /* 通道y的GPIO */
  8.     gpio_init_struct.Mode = GPIO_MODE_AF_PP;                                        /* 复用推挽输出 */
  9.     gpio_init_struct.Pull = GPIO_PULLUP;                                            /* 上拉 */
  10.     gpio_init_struct.Speed = GPIO_SPEED_FREQ_HIGH;                                  /* 高速 */
  11.     gpio_init_struct.Alternate = ATIM_TIMX_NPWM_CHY_GPIO_AF;                        /* 端口复用 */
  12.     HAL_GPIO_Init(ATIM_TIMX_NPWM_CHY_GPIO_PORT, &gpio_init_struct);                 /* 初始化IO */
  13.    
  14.     g_timx_npwm_chy_handle.Instance = ATIM_TIMX_NPWM;                               /* 定时器x */
  15.     g_timx_npwm_chy_handle.Init.Prescaler = psc;                                    /* 定时器分频 */
  16.     g_timx_npwm_chy_handle.Init.CounterMode = TIM_COUNTERMODE_UP;                   /* 递增计数模式 */
  17.     g_timx_npwm_chy_handle.Init.Period = arr;                                       /* 自动重装载值 */
  18.     g_timx_npwm_chy_handle.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;  /* 使能TIMx_ARR进行缓冲 */
  19.     HAL_TIM_PWM_Init(&g_timx_npwm_chy_handle);                                      /* 初始化PWM */


  20.     timx_oc_npwm_chy.OCMode = TIM_OCMODE_PWM1;                                      /* 模式选择PWM1 */
  21.     timx_oc_npwm_chy.Pulse = ( arr + 1 )/2;                                         /* 比较值为重装载值的50%,即占空比为50% */
  22.     timx_oc_npwm_chy.OCPolarity = TIM_OCPOLARITY_HIGH;                              /* 输出比较极性为高 */
  23.     HAL_TIM_PWM_ConfigChannel(&g_timx_npwm_chy_handle, &timx_oc_npwm_chy, ATIM_TIMX_NPWM_CHY); /* 配置TIMx通道y */
  24.     HAL_TIM_PWM_Start(&g_timx_npwm_chy_handle, ATIM_TIMX_NPWM_CHY);                 /* 开启对应PWM通道 */

  25.                 __HAL_TIM_ENABLE_IT(&g_timx_npwm_chy_handle, TIM_IT_UPDATE);                    /* 开启更新中断 */
  26.                   
  27.     HAL_NVIC_SetPriority(ATIM_TIMX_NPWM_IRQn, 1, 3);                                /* 设置中断优先级,抢占优先级1,子优先级3 */
  28.                 HAL_NVIC_EnableIRQ(ATIM_TIMX_NPWM_IRQn);                                        /* 开启ITMx中断 */
  29. //使能中断后,会进入到中断中,然后判断后,关闭定时器(ATIM_TIMX_NPWM->CR1 &= ~(1 << 0); )
  30. }


  31. //定时器中断
  32. void TIM8_UP_TIM13_IRQHandler(void)
  33. {
  34.     uint16_t npwm = 0;

  35.     /* 以下代码没有使用定时器HAL库共用处理函数来处理,而是直接通过判断中断标志位的方式 */
  36.     if(__HAL_TIM_GET_FLAG(&g_timx_npwm_chy_handle, TIM_FLAG_UPDATE) != RESET)
  37.     {}

  38. }
复制代码




分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:883242 发表于 2022-7-22 19:17 | 只看该作者
用到的时候再打开中断,或者加一个标志位放弃第一次中断操作。
回复

使用道具 举报

板凳
ID:123289 发表于 2022-7-29 15:47 | 只看该作者
本帖最后由 yzwzfyz 于 2022-8-1 08:50 编辑

原因是,的确中断条件具备了。
虽然你清了标记,但你无法证明,清除之后中断条件消失了。
回复

使用道具 举报

地板
ID:139866 发表于 2022-8-10 17:54 | 只看该作者
这跟你用不用hal库没关系,用标准库有时候也会这样,对程序基本不影响,可以试试这样,先清除中断标志,然后使能定时器中断
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表