搜索
bottom↓
回复: 8

STM32F103的定时器如何产生比较中断?

[复制链接]

出0入0汤圆

发表于 2016-9-5 22:54:05 | 显示全部楼层 |阅读模式
本帖最后由 siyeb 于 2016-9-5 23:00 编辑

请问STM32F103的定时器如何产生比较中断?

现在实现了在tim的指定管脚上输出占空比可变的PWM波形,但是中断却是在计数器计数(CNT)到ARR时才产生的,在CNT等于CCR时并未产生中断。

现在我要实现比较中断,然后在中断里完成一些操作,而不是在管脚上输出PWM,请问还有什么地方需要设置?

附图时28335的pwm模块,他就可以在计数值等于比较值时产生中断。。。

另外,图片大小怎么调整啊。。。。发愁。。。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。

如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》

出0入0汤圆

 楼主| 发表于 2016-9-5 23:22:56 | 显示全部楼层
难道没人这么用吗

出0入24汤圆

发表于 2016-9-6 03:48:02 | 显示全部楼层
使能的中断不对,你使能的是更新中断,ARR溢出时产生
需要使能相应通道的比较中断,CNT = CCR时产生中断

如果使用的是高级定时器,需要注意高级定时器有好几个中断向量,通用定时器是只有一个中断向量

出0入0汤圆

 楼主| 发表于 2016-9-6 09:44:59 | 显示全部楼层
20061002838 发表于 2016-9-6 03:48
使能的中断不对,你使能的是更新中断,ARR溢出时产生
需要使能相应通道的比较中断,CNT = CCR时产生中断


感谢您指导,我再研究一下,只要这个功能是可以实现的就好

出0入0汤圆

 楼主| 发表于 2016-9-6 12:39:42 | 显示全部楼层
本帖最后由 siyeb 于 2016-9-6 12:42 编辑
20061002838 发表于 2016-9-6 03:48
使能的中断不对,你使能的是更新中断,ARR溢出时产生
需要使能相应通道的比较中断,CNT = CCR时产生中断


您好,我这边的确使能了比较中断,但是还是不行,是不是定时器的比较模式智能输出pwm而不能产生中断?

下面是配置代码:


  1. //配置定时器部分       
  2. NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
  3. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  4. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  5. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  6. NVIC_Init(&NVIC_InitStructure);
  7.        
  8. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

  9. TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  10. TIM_TimeBaseStructure.TIM_Period = 23*256;             
  11. TIM_TimeBaseStructure.TIM_Prescaler = 2;             
  12. TIM_TimeBaseStructure.TIM_ClockDivision = 0x00;   
  13. TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
  14. TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

  15. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  16. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;               
  17. TIM_OCInitStructure.TIM_Pulse = 23*120;                           
  18. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  
  19.        
  20. TIM_OC4Init(TIM3, &TIM_OCInitStructure);
  21.        
  22. TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);       
  23. TIM_ARRPreloadConfig(TIM3, ENABLE);       

  24. TIM_ITConfig(TIM3, TIM_IT_CC4 , ENABLE);
  25. TIM_Cmd(TIM3, ENABLE);

  26. //中断部分
  27. void TIM3_IRQHandler(void)
  28. {
  29.         if (TIM_GetITStatus(TIM3, TIM_IT_CC4) != RESET)
  30.         {
  31.                 TIM_ClearITPendingBit(TIM3, TIM_IT_CC4 );
  32.                 PCout(0) = !PCout(0);
  33.         }
  34. }
  35. }
复制代码

出0入24汤圆

发表于 2016-9-6 16:38:21 | 显示全部楼层
siyeb 发表于 2016-9-6 12:39
您好,我这边的确使能了比较中断,但是还是不行,是不是定时器的比较模式智能输出pwm而不能产生中断?

...

代码看起来是没问题的
PWM能输出?
PCout() 是什么,能不能换成GPIO_SetBits() 和 GPIO_ResetBits()

出0入0汤圆

 楼主| 发表于 2016-9-6 20:20:38 | 显示全部楼层
20061002838 发表于 2016-9-6 16:38
代码看起来是没问题的
PWM能输出?
PCout() 是什么,能不能换成GPIO_SetBits() 和 GPIO_ResetBits() ...

抱歉,PCout()就是翻转以下。

现在功能已经实现了,但是用到了CC1中断和update中断两个中断,在CC1中断里Setbit,然后在update中断里Resetbit。这样就能够输出占空比可调的定时了。

这种方法和直接用定时器驱动相应的IO在思路上有些区别,之前我一直钻死胡同了,所以才没能成功。

不知道我这样理解是不是正确的?希望得到您的指导。

出0入24汤圆

发表于 2016-9-6 22:30:46 | 显示全部楼层
在CC1中断里Setbit,然后在update中断里Resetbit

这不就是PWM吗?

出0入0汤圆

 楼主| 发表于 2016-9-7 10:55:13 | 显示全部楼层
20061002838 发表于 2016-9-6 22:30
在CC1中断里Setbit,然后在update中断里Resetbit

这不就是PWM吗?

是这个意思,只不过我使用它来定时,而不是用来产生PWM~
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-28 22:22

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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