OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 875|回复: 2

关于高级定时器输出指定个数PWM实验中的疑问

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2023-12-2
在线时间
2 小时
发表于 2024-1-21 12:27:30 | 显示全部楼层 |阅读模式
1金钱
在官方提供的样例【实验9-1 高级定时器输出指定个数PWM实验】中使用 atim_timx_npwm_chy_set 函数设置PWM个数

其中由 HAL_TIM_GenerateEvent(&g_timx_npwm_chy_handle, TIM_EVENTSOURCE_UPDATE); 语句产生软件中断,如下(仅保留有疑问部分)

在定时器中断中又会再一次调用 HAL_TIM_GenerateEvent 语句;
请问这会再次产生定时器更新中断,而再次进入中断函数,造成死循环吗?
如果不会 按照【HAL_TIM_GenerateEvent程序的的逻辑 :不是——》进入中断,在中断里再次进入中断吗。
又为何没有再次产生定时器更新中断

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2023-12-2
在线时间
2 小时
 楼主| 发表于 2024-1-21 12:30:28 | 显示全部楼层
  1. /**
  2. * @brief       高级定时器TIMX NPWM设置PWM个数
  3. * [url=home.php?mod=space&uid=271674]@param[/url]       npwm : PWM的个数, 1~2^32次方个
  4. * @retval      无
  5. */
  6. void atim_timx_npwm_chy_set(uint32_t npwm)
  7. {
  8.     if (npwm == 0) return;

  9.     g_npwm_remain = npwm;                                                           /* 保存脉冲个数 */
  10.     HAL_TIM_GenerateEvent(&g_timx_npwm_chy_handle, TIM_EVENTSOURCE_UPDATE);         /* 产生一次更新事件,在中断里面处理脉冲输出 */
  11.     __HAL_TIM_ENABLE(&g_timx_npwm_chy_handle);                                      /* 使能定时器TIMX */
  12. }
  13. /**
  14. * @brief       高级定时器TIMX NPWM中断服务函数
  15. * @param       无
  16. * @retval      无
  17. */
  18. void ATIM_TIMX_NPWM_IRQHandler(void)
  19. {
  20.   ...
  21.   if (npwm)                                                                   /* 有脉冲要发送 */
  22.   {
  23.       ATIM_TIMX_NPWM->RCR = npwm - 1;                                         /* 设置重复计数寄存器值为npwm-1, 即npwm个脉冲 */
  24.       HAL_TIM_GenerateEvent(&g_timx_npwm_chy_handle, TIM_EVENTSOURCE_UPDATE); /* 产生一次更新事件, */
  25.       __HAL_TIM_ENABLE(&g_timx_npwm_chy_handle);                              /* 使能定时器TIMX */
  26.   }
  27.   ...
  28. }
复制代码
回复

使用道具 举报

5

主题

33

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2016-11-19
在线时间
30 小时
发表于 2024-4-19 16:14:46 | 显示全部楼层
atim_timx_npwm_chy_set 函数设置PWM个数
这函数只是开始启动定时器和中断,并没有输出PWM波,PWM是atim_timx_npwm_chy_set设置后第一次进入更新中断,赋值设定的PWM脉冲个数,并输出一定数量的脉冲,此时会记录你输出的值,等再次进入更新中断时先判断你设定的和输出的数据,确定已完全输出设定脉冲个数后关闭更新中断

完整代码
    if (__HAL_TIM_GET_FLAG(&g_timx_npwm_chy_handle, TIM_FLAG_UPDATE) != RESET)
    {
        if (g_npwm_remain >= 256)                                                   /* 还有大于256个脉冲需要发送 */      
        {
            g_npwm_remain = g_npwm_remain - 256;                       
            npwm = 256;
        }
        else if (g_npwm_remain % 256)                                               /* 还有位数(不到256)个脉冲要发送 */
        {
            npwm = g_npwm_remain % 256;
            g_npwm_remain = 0;                                                      /* 没有脉冲了 */
        }

        if (npwm)                                                                   /* 有脉冲要发送 */
        {
            ATIM_TIMX_NPWM->RCR = npwm - 1;                                         /* 设置重复计数寄存器值为npwm-1, 即npwm个脉冲 */
            HAL_TIM_GenerateEvent(&g_timx_npwm_chy_handle, TIM_EVENTSOURCE_UPDATE); /* 产生一次更新事件,在中断里面处理脉冲输出 */
            __HAL_TIM_ENABLE(&g_timx_npwm_chy_handle);                              /* 使能定时器TIMX */
        }
        else
        {
            ATIM_TIMX_NPWM->CR1 &= ~(1 << 0);                                       /* 关闭定时器TIMX,使用HAL Disable会清除PWM通道信息,此处不用 */
        }

        __HAL_TIM_CLEAR_IT(&g_timx_npwm_chy_handle, TIM_IT_UPDATE);                 /* 清除定时器溢出中断标志位 */
    }

最前面的if 和else if就是将设定值分步输出PWM,并未一次性全部输出设定个数脉冲
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 01:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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