3688|1

111

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

F350的pwm配置不成功 [复制链接]

本帖最后由 tinnu 于 2018-10-4 00:44 编辑

  1. void pwm_pin_config(void)
  2. {
  3.         rcu_periph_clock_enable(RCU_GPIOA);
  4.         
  5.     gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLDOWN,
  6.                   GPIO_PIN_6|GPIO_PIN_7);
  7.     gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_10MHZ,
  8.                             GPIO_PIN_6|GPIO_PIN_7);
  9.         gpio_af_set(GPIOA, GPIO_AF_5,
  10.                                 GPIO_PIN_6|GPIO_PIN_7);
  11. }

  12. void pwm_timer_config(void)
  13. {
  14.     timer_parameter_struct timer_initpara;
  15.         timer_oc_parameter_struct pwm_initpara;
  16.         
  17.         pwm_pin_config();
  18.         
  19.     rcu_periph_clock_enable(RCU_TIMER15);

  20.     timer_deinit(TIMER15);

  21.     timer_initpara.prescaler = 1800-1;
  22.     timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
  23.     timer_initpara.counterdirection = TIMER_COUNTER_UP;
  24.     timer_initpara.period = 1200-1;
  25.     timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
  26.         // timer_initpara.repetitioncounter = 0;
  27.     timer_init(TIMER15,&timer_initpara);

  28.     /* TIMERf15通道控制更新中断启用*/
  29. //    timer_interrupt_enable(TIMER16,TIMER_INT_UP);
  30. //        nvic_irq_enable(TIMER16_IRQn,0,1);
  31.         
  32.         pwm_initpara.outputstate = TIMER_CCX_ENABLE;
  33.         //pwm_initpara.outputnstate = TIMER_CCXN_DISABLE;
  34.         pwm_initpara.ocpolarity = TIMER_OC_POLARITY_HIGH;
  35.         pwm_initpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW;
  36.         
  37.         timer_channel_output_config(TIMER15, TIMER_CH_0, &pwm_initpara);
  38.         
  39.         timer_channel_output_mode_config(TIMER15, TIMER_CH_0, TIMER_OC_MODE_PWM1);
  40.         
  41.         timer_channel_output_pulse_value_config(TIMER15, TIMER_CH_0, 1000);
  42.         
  43.         timer_channel_output_shadow_config(TIMER15, TIMER_CH_0, TIMER_OC_SHADOW_ENABLE);

  44.     /* TIMER15计数器启用*/
  45.     timer_enable(TIMER15);
  46. }
复制代码



实测定时器部分配置是没问题的,用中断闪烁led成功了,但PA6引脚保持低电平没有pwm波产生
此帖出自GD32 MCU论坛
点赞 关注(1)
 

回复
举报

111

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
到现在依然没有发现问题在哪,但改用TIMER1的CH1通道,通过PA1输出

把上面的TIMER15改为TIMER1、CH0改为CH1、PA6改为PA1
又可以正常输出,初步认为是TIMER1定时器有一些TIMER15定时器无法配置的功能,或者TIMER15本身有bug

  1. void pwm_pin_config(void)
  2. {
  3.         rcu_periph_clock_enable(RCU_GPIOA);
  4.        
  5.         gpio_af_set(GPIOA, GPIO_AF_2,
  6.                                 GPIO_PIN_1);
  7.     gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE,
  8.                   GPIO_PIN_1);
  9.     gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,
  10.                             GPIO_PIN_1);
  11. }

  12. /*!
  13.     \ brief配置TIMER外设
  14.     \ param [in] none
  15.     \ param [out] none
  16.     \ retval无
  17. */
  18. void pwm_timer_config(void)
  19. {
  20.     timer_parameter_struct timer_initpara;
  21.         timer_oc_parameter_struct pwm_initpara;
  22.        
  23.         pwm_pin_config();
  24.        
  25.     rcu_periph_clock_enable(RCU_TIMER1);

  26.     timer_deinit(TIMER1);

  27.     timer_initpara.prescaler = 1800-1;
  28.     timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
  29.     timer_initpara.counterdirection = TIMER_COUNTER_UP;
  30.     timer_initpara.period = 1200-1;
  31.     timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
  32.         timer_initpara.repetitioncounter = 0;
  33.     timer_init(TIMER1,&timer_initpara);

  34.     /* TIMERf1通道控制更新中断启用*/
  35. //    timer_interrupt_enable(TIMER1,TIMER_INT_UP);
  36. //        nvic_irq_enable(TIMER1_IRQn,0,1);
  37.        
  38.         /*
  39.         第二步:比较模式配置:
  40.         设置CHxCOMSEN位来配置输出比较影子寄存器;
  41.         设置CHxCOMCTL位来配置输出模式(置高电平/置低电平/反转);
  42.         设置CHxP/CHxNP位来选择有效电平的极性;
  43.         设置CHxEN使能输出。
  44.         */
  45.         pwm_initpara.outputstate = TIMER_CCX_ENABLE;
  46.         pwm_initpara.ocpolarity = TIMER_OC_POLARITY_HIGH;
  47.         //pwm_initpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW;
  48.        
  49.         timer_channel_output_config(TIMER1, TIMER_CH_1, &pwm_initpara);
  50.         timer_channel_output_mode_config(TIMER1, TIMER_CH_1, TIMER_OC_MODE_PWM1);
  51.         timer_channel_output_shadow_config(TIMER1, TIMER_CH_1, TIMER_OC_SHADOW_ENABLE);

  52.         /*
  53.         第四步:通过TIMERx_CAR寄存器和TIMERx_CHxCV寄存器配置输出比较时基:
  54.         CHxVAL可以在运行时根据你所期望的波形而改变
  55.         */
  56.         timer_channel_output_pulse_value_config(TIMER1, TIMER_CH_1, 1000);
  57.        
  58.     /* TIMER1计数器启用*/
  59.     timer_enable(TIMER1);
  60. }
复制代码
此帖出自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
快速回复 返回顶部 返回列表