3256|0

6525

帖子

10

TA的资源

版主

楼主
 

04 外部中断与定时器PWM [复制链接]

号外相关文章

GD32L233C-START评测】03 LED操作和普通定时功能

前言

        我们继续根据板卡的自带的资源来了解MCU的功能,这次我们了解一下板载的按键:其中一个是复位按键,这个就没有什么可以利用的了,对于该引脚来说低电平将硬件复位;另一个按键就是今天的主角之一,如下图:

        连接的PA0,板卡上标注的丝印是WKUP,咱们今天是作为普通按键来使用。

目标

        增加一种LED的展示模式——呼吸灯,以此来熟悉单片机的定时器输出PWM功能;

        增加按键功能——更改模式切换方式,短按模式切换,长按控制呼吸灯开关。

 

分析

        第一:呼吸灯

        呼吸灯的实现是通过修改PWM的占空比来实现LED的开断时间,从而实现LED的亮暗变化,根据经验PWM的频率不宜过高,暂定200Hz;通过查询数据手册,其中PA7可以作为TIMER2_CH1通道的输出,PA8不能作为定时器输出引脚,PC6可以作为TIMER2_CH0通道的输出,PC7可以作为TIMER2_CH1通道的输出,因此咱们选择PA7作为定时器2通过CH1通道的输出,即LED1实现呼吸灯展示。

        第二:按键判断

        按键的判断有两种实现方式,一种是通过扫描来判断按键是否按下,另外一种是通过外部中断方式判断,本次采用中断方式判断按键,也可以借此了解单片机的外部中断功能,通过原理图可以知道,外部中断需配置成上升沿触发。

 

代码介绍

        对于定时器PWM输出配置流程:

        第一步:选取定时器2,进行定时器配置,频率200Hz,CLK = SystemCoreClock / 3200/100 = 200Hz;

        第二步:配置通道CH1;

 

定时器PWM配置代码

//******************************************************************************
//* 函数名称  : gd_TIMER8_init                                              
//* 函数描述  : 定时器2配置                                               
//* 输入参数  :  arr,arr1                                                             
//* 参数描述  : 定时器2 PWM输出初始化配置                                  
//* 输出参数  : 无                                                          
//* 返回值    : 无                                                           
//******************************************************************************
void gd_TIMER2PWM_init(uint32_t arr,uint32_t arr1)
{
  rcu_periph_clock_enable(RCU_GPIOA);
  /* TIMER2 GPIO */
  gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_NONE, GPIO_PIN_7 );
  gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7);

  gpio_af_set(GPIOA, GPIO_AF_1, GPIO_PIN_7);
  
  /* 定时器配置 */
  timer_oc_parameter_struct timer_ocinitpara;
  timer_parameter_struct timer_initpara;

  /* enable the peripherals clock */
  rcu_periph_clock_enable(RCU_TIMER2);

  /* deinit a TIMER */
  timer_deinit(TIMER2);
  /* initialize TIMER init parameter struct */
  timer_struct_para_init(&timer_initpara);
  /* TIMER1 configuration */
  timer_initpara.prescaler        = 3199;
  timer_initpara.alignedmode      = TIMER_COUNTER_EDGE;
  timer_initpara.counterdirection = TIMER_COUNTER_UP;
  timer_initpara.period           = arr-1;
  timer_initpara.clockdivision    = TIMER_CKDIV_DIV1;
  timer_init(TIMER2, &timer_initpara);
  
  /* initialize TIMER channel output parameter struct */
  timer_channel_output_struct_para_init(&timer_ocinitpara);
  /* configure TIMER channel output function */
  timer_ocinitpara.outputstate    = TIMER_CCX_ENABLE;
  timer_ocinitpara.ocpolarity     = TIMER_OC_POLARITY_HIGH;
  timer_channel_output_config(TIMER2, TIMER_CH_1, &timer_ocinitpara);
  
  timer_channel_output_pulse_value_config(TIMER2, TIMER_CH_1, arr1);
  /* CH0 configuration in OC timing mode */
  timer_channel_output_mode_config(TIMER2, TIMER_CH_1, TIMER_OC_MODE_PWM0);
  
//  /* enable a TIMER */
//  timer_enable(TIMER2);

}

 

        对于外部中断的配置:

        第一步,PA0对于外部中断配置,中断线一般与引脚代号保持一致,最多可以有16个外部中心信号;

        第二步,中断处理函数及防抖函数;

        第三步,按键信号处理。

 

外部中断配置代码

//******************************************************************************
//* 函数名称  : gd_EXTI_init                                              
//* 函数描述  : 外部中断配置                                               
//* 输入参数  :                                                               
//* 参数描述  : 外部中断初始化配置                                  
//* 输出参数  : 无                                                          
//* 返回值    : 无                                                           
//******************************************************************************
void gd_EXTI_init(void)
{
  /* enable the WAKEUP key gpio clock */
  rcu_periph_clock_enable(RCU_GPIOA);
  /* configure button pin as input */
  gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_0);
  
  /* enable the SYSCFG clock */
  rcu_periph_clock_enable(RCU_SYSCFG);
  /* enable and set key EXTI interrupt to the specified priority */
  nvic_irq_enable(EXTI0_IRQn, 1U);

  /* connect key EXTI line to key GPIO pin */
  syscfg_exti_line_config(EXTI_SOURCE_GPIOA, EXTI_SOURCE_PIN0);

  /* configure key EXTI line */
  exti_init(EXTI_0, EXTI_INTERRUPT, EXTI_TRIG_RISING);
  exti_interrupt_flag_clear(EXTI_0);
  
}

 

现象:

 

此帖出自GD32 MCU论坛
点赞 关注
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表