本篇讲述板载按键。开发板上有两个按键,原理图如下。S1做按键复位,S2做按键控制LED1亮灭。
图1:按键原理图
1.按键S1做复位按键
按键S1接PA21,按按键S1 MCU未硬件复位。经查资料PA21主功能是普通IO口,默认复用功能RST,因此需要配置.但SDK及资料未明确载明寄存器配置(如有寄存器配置可行的小伙伴可以相互交流下),后在WCH-LinkUtility上位机软件通过WCH-LinkE配置如下图:
图2:复位按键配置
2.按键S2控制LED1,没按一次,亮/灭切换
按键S2接PC17,在这里使用外部INT中断,做按键消抖处理,没按一次,PA0(接LED1,低电平点亮)电平反转一次控制LED亮/灭.附部分代码如下:
<1>//按键IO PC17 外部中断配置
void EXTI17_INT_INIT(void)
{
GPIO_InitTypeDef GPIO_InitStructure = {0};
EXTI_InitTypeDef EXTI_InitStructure = {0};
NVIC_InitTypeDef NVIC_InitStructure = {0};
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_17;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
/* GPIOA ----> EXTI_Line0 */
GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource17);
EXTI_InitStructure.EXTI_Line = EXTI_Line17;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI25_16_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
printf("EXTI17_INT_INIT\r\n");
}
<2>按键消抖与控制功能
while(1)
{
if(key_flag)
{
key_flag=0;
Delay_Ms(100);
if(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_17)==1)
{
led_status=GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_0);
GPIO_WriteBit(GPIOA, GPIO_Pin_0, (led_status == 0) ? (led_status=Bit_SET):(led_status=Bit_RESET));
printf("Led Toggle!\r\n");
if(led_status)
{
printf("now led_status OFF\r\n");
}
else
{
printf("now led_status ON\r\n");
}
}
}
}
3.运行日志
测试按键控灯及复位键功能,日志如下:
图3:测试日志
4.源代码
全部功能代码见附件
|