3777|4

530

帖子

4

TA的资源

一粒金砂(高级)

楼主
 

[GD32E231 DIY大赛] 02. 为何PWM的占空比不能在外部中断服务函数中更改? [复制链接]

本帖最后由 传媒学子 于 2019-5-4 15:04 编辑

[GD32E231 DIY大赛] 02. 为何PWM的占空比不能在外部中断服务函数中更改?

今天下午尝试着调试PWM,因为仿照着例程,整个过程还是比较顺利,但是反常的事情出现了,当我试图在外部中断函数void EXTI4_15_IRQHandler(void)中改变PWM占空比时,却发现不行。
此问题已经解决:是我把例程理解错了,应该在EXT0_1中断服务函数中改。。。

具体情况是这样的:


首先,我为了控制舵机,输出20ms, 占空比可在1ms到2ms之间可调的PWM波。
GPIO初始化:
  1. void gpio_config(void)
  2. {
  3.     rcu_periph_clock_enable(RCU_GPIOA);
  4.     /* configure PA6(TIMER2 CH0) as alternate function */
  5.     gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_6);
  6.     gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_6);
  7.     gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_6);
  8. }
复制代码



外部中断初始化:
  1. void exti_config(void)
  2. {
  3.     /* enable the clock */
  4.     rcu_periph_clock_enable(RCU_GPIOA);
  5.     rcu_periph_clock_enable(RCU_CFGCMP);
  6.    
  7.     /* configure GPIO as input */
  8.     gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_PULLUP, GPIO_PIN_5);
  9.    
  10.     /* enable and set EXTI interrupt */
  11.     nvic_irq_enable(EXTI4_15_IRQn, 1U);
  12.    
  13.     /* connect EXTI line to GPIO pin */
  14.     syscfg_exti_line_config(EXTI_SOURCE_GPIOA, EXTI_SOURCE_PIN5);

  15.     /* configure EXTI line */
  16.     exti_init(EXTI_5, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
  17.     exti_interrupt_flag_clear(EXTI_5);
  18. }
复制代码




定时器初始化:

  1. void timer_config(void)
  2. {
  3.     /* -----------------------------------------------------------------------
  4.     TIMER2CLK is 100KHz

  5.     TIMER2 channel0 duty cycle = (25000/ 50000)* 100  = 50%
  6.     ----------------------------------------------------------------------- */
  7.     timer_oc_parameter_struct timer_ocintpara;
  8.     timer_parameter_struct timer_initpara;

  9.     rcu_periph_clock_enable(RCU_TIMER2);

  10.     timer_deinit(TIMER2);

  11.     /* TIMER configuration */
  12.     timer_initpara.prescaler         = 719;
  13.     timer_initpara.alignedmode       = TIMER_COUNTER_EDGE;
  14.     timer_initpara.counterdirection  = TIMER_COUNTER_UP;
  15.     //timer_initpara.period            = 49999;
  16.           timer_initpara.period            = 1999;
  17.     timer_initpara.clockdivision     = TIMER_CKDIV_DIV1;
  18.     timer_initpara.repetitioncounter = 0;
  19.     timer_init(TIMER2,&timer_initpara);

  20.     /* configurate CH0 in PWM mode0 */
  21.     timer_ocintpara.ocpolarity  = TIMER_OC_POLARITY_HIGH;
  22.     timer_ocintpara.outputstate = TIMER_CCX_ENABLE;

  23.     timer_channel_output_config(TIMER2,TIMER_CH_0,&timer_ocintpara);

  24.     //timer_channel_output_pulse_value_config(TIMER2,TIMER_CH_0,24999);
  25.                 timer_channel_output_pulse_value_config(TIMER2,TIMER_CH_0,149);
  26.     timer_channel_output_mode_config(TIMER2,TIMER_CH_0,TIMER_OC_MODE_PWM0);
  27.     timer_channel_output_shadow_config(TIMER2,TIMER_CH_0,TIMER_OC_SHADOW_DISABLE);

  28.     /* auto-reload preload enable */
  29.     timer_auto_reload_shadow_enable(TIMER2);
  30.     /* auto-reload preload enable */
  31.     timer_enable(TIMER2);
  32. }
复制代码



然后,我想着在外部中断函数中,也就是处理key的按键中,改变PWM占空比,却失败了,code如下:

  1. void EXTI4_15_IRQHandler(void)
  2. {
  3.     if(RESET != exti_interrupt_flag_get(EXTI_5)){
  4.         gd_eval_led_toggle(LED1);
  5.                           timer_channel_output_pulse_value_config(TIMER2,TIMER_CH_0,199);
  6.     }
  7.    
  8.     exti_interrupt_flag_clear(EXTI_5);
  9. }
复制代码


不知道什么原因, 为什么这里不行?
在网上搜了一些stm32的帖子,貌似存在这个问题,没有找到相关的解释....  



而我尝试在SysTick 中断服务函数中,改变占空比就可以:

  1. void SysTick_Handler(void)[/align]
  2. {
  3.     delay_decrement();
  4. timer_channel_output_pulse_value_config(TIMER2,TIMER_CH_0,199);
  5. }
复制代码


在主函数中调整也可以:
  1.     while(1){
  2. delay_1ms(5000);
  3. timer_channel_output_pulse_value_config(TIMER2,TIMER_CH_0,100);
  4. delay_1ms(5000);
  5. timer_channel_output_pulse_value_config(TIMER2,TIMER_CH_0,200);
  6.     }
复制代码


这个程序是在GD32E23x_Demo_Suites_V1.0.1\GD32E230C_START_Demo_Suites\Projects\04_TIMER_Key_EXTI文件夹下,
还请arm大神,给予解惑。Thanks~

附图是我生成的PWM波形:





GD32E23x_Demo_Suites_V1.0.1.rar

10.91 MB, 下载次数: 2

此帖出自GD32 MCU论坛

最新回复

也许是特权机制吧,进入中断就变成用户模式了不让改  详情 回复 发表于 2019-5-3 19:38
点赞 关注(2)
 

回复
举报

1万

帖子

16

TA的资源

版主

沙发
 
我觉得改完得重新初始化一下, timer_init(TIMER2,&timer_initpara);
此帖出自GD32 MCU论坛

点评

但是,不在外部中断中改,就没问题。  详情 回复 发表于 2019-5-3 17:35
 
个人签名http://shop34182318.taobao.com/
https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
 
 

回复

530

帖子

4

TA的资源

一粒金砂(高级)

板凳
 
ddllxxrr 发表于 2019-5-2 09:40
我觉得改完得重新初始化一下, timer_init(TIMER2,&timer_initpara);

但是,不在外部中断中改,就没问题。
此帖出自GD32 MCU论坛

点评

也许是特权机制吧,进入中断就变成用户模式了不让改  详情 回复 发表于 2019-5-3 19:38
 
 
 

回复

1万

帖子

16

TA的资源

版主

4
 
传媒学子 发表于 2019-5-3 17:35
但是,不在外部中断中改,就没问题。

也许是特权机制吧,进入中断就变成用户模式了不让改
此帖出自GD32 MCU论坛

点评

不是特权机制,是例程有问题,看我后续帖子..  详情 回复 发表于 2019-5-4 15:00
 
个人签名http://shop34182318.taobao.com/
https://shop436095304.taobao.com/?spm=a230r.7195193.1997079397.37.69fe60dfT705yr
 
 

回复

530

帖子

4

TA的资源

一粒金砂(高级)

5
 
本帖最后由 传媒学子 于 2019-5-4 15:04 编辑
ddllxxrr 发表于 2019-5-3 19:38
也许是特权机制吧,进入中断就变成用户模式了不让改

是我自己搞错了,在中断中可以改。。。
此帖出自GD32 MCU论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表