号外(相关文章):
【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);
}
现象:
|