dirty 发表于 2024-1-13 18:16

【CH32X035评估板】--板载按键功能

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;本篇讲述板载按键。开发板上有两个按键,原理图如下。S1做按键复位,S2做按键控制LED1亮灭。</p>

<div style="text-align: center;"></div>

<div style="text-align: center;">图1:按键原理图</div>

<p>1.按键S1做复位按键</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;按键S1接PA21,按按键S1 MCU未硬件复位。经查资料PA21主功能是普通IO口,默认复用功能RST,因此需要配置.但SDK及资料未明确载明寄存器配置(如有寄存器配置可行的小伙伴可以相互交流下),后在WCH-LinkUtility上位机软件通过WCH-LinkE配置如下图:</p>

<div style="text-align: center;"></div>

<div style="text-align: center;">图2:复位按键配置</div>

<p>&nbsp;</p>

<p>2.按键S2控制LED1,没按一次,亮/灭切换</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;按键S2接PC17,在这里使用外部INT中断,做按键消抖处理,没按一次,PA0(接LED1,低电平点亮)电平反转一次控制LED亮/灭.附部分代码如下:</p>

<p>&lt;1&gt;//按键IO PC17 外部中断配置</p>

<pre>
<code>
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, &amp;GPIO_InitStructure);

    /* GPIOA ----&gt; 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(&amp;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(&amp;NVIC_InitStructure);

    printf("EXTI17_INT_INIT\r\n");
}</code></pre>

<p>&lt;2&gt;按键消抖与控制功能</p>

<pre>
<code>        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");
                }

            }
      }
    }</code></pre>

<p>3.运行日志</p>

<p>测试按键控灯及复位键功能,日志如下:</p>

<div style="text-align: center;"></div>

<div style="text-align: center;">图3:测试日志</div>

<p>4.源代码</p>

<p>&nbsp; &nbsp; &nbsp; &nbsp; 全部功能代码见附件&nbsp;</p>

<div style="text-align: center;">&nbsp;</div>

<div style="text-align: center;">&nbsp;</div>

<p>&nbsp;</p>

lugl4313820 发表于 2024-1-13 23:11

<p>我看了大佬的消抖处理,延时100ms,我们一般是在10Ms左右,感觉演示单独功能可以,如果在实际项目中,不可取呀。你可以试一下用状态机来处理消抖。</p>

dirty 发表于 2024-1-13 23:26

<p>这个跟机械按键消抖延时及原理图有些关系,这个按键没有旁路电容。知道理论上定20~50ms,实际若定20ms左右,按一次会触发多次,还是以实际调试测验为准。参数是经过测验体验定的,有调过哦,效果还可以。</p>

freebsder 发表于 2024-1-15 19:32

<p>谢谢分享,期待后续!</p>
页: [1]
查看完整版本: 【CH32X035评估板】--板载按键功能