esp32c3(中断按键扫描 打印)

1、esp32c3的按键根据官网原理图可知是GPIO9,所以初始化gpio的时候我设置为输入+上拉,检测到按下的时候是低电平,松开的时候是高电平

2、代码

(1)头文件

   

#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "sdkconfig.h"
#include "esp_log.h"
#include "freertos/queue.h"
#include "driver/timer.h"
#include "driver/ledc.h"
#include "esp_err.h"
#include "esp_task_wdt.h"
#include "driver/ledc.h"

(2)一些函数包装


#define BLINK_GPIO_1 12  //gpio 12口是led1的引脚
#define BLINK_GPIO_2 13 //gpio 13口是led2的引脚
#define TIMER_DIVIDER 80 //hardware timer clock divider 分频
#define TIMER_SCALE (TIMER_BASE_CLK / TIMER_DIVIDER)

static void configure_led(void)
{
    gpio_reset_pin(BLINK_GPIO_2);
    gpio_reset_pin(BLINK_GPIO_1);
    gpio_reset_pin(9);

    gpio_set_direction(BLINK_GPIO_1,GPIO_MODE_OUTPUT);
    gpio_set_direction(BLINK_GPIO_2,GPIO_MODE_OUTPUT);
    gpio_set_direction(9,GPIO_MODE_INPUT);

    gpio_set_pull_mode(9,GPIO_PULLUP_ONLY);
}

io12和io13是关于两个灯的,io9是关于按键的,灯设为输出模式,按键设为输入模式。

以上代码为gpio初始化,被包装成函数.

(3)关于按键类型的定义

enum {
	Em_Key_short = 0,
    Em_Key_shortup,
	Em_Key_long,
	Em_Key_Twoshot,
	Em_Key_Threeshot,
	Em_NO_Key,
};

volatile unsigned char	gKey = Em_NO_Key;

这里只用到了短按和短按抬起,以及NO_Key。

(4)定时器初始化(函数包装)

/*定时器初始化*/

static void timer_init_test()
{
    //1.定时器初始化
    timer_config_t config = {      
        .divider = TIMER_DIVIDER,//分频器,设置定时器中计数器计数的速度,设置范围在2-65536,这里设置为80,默认的时钟源apb频率为80Mhz
        .counter_dir = TIMER_COUNT_UP,//模式,向上递增
        .counter_en = TIMER_PAUSE, //暂停计时器计数,调用timer_start时才开始计数
        .alarm_en = TIMER_ALARM_EN, //使能定时器警报,到达计数器设置的值进入中断
        .auto_reload = 1, //设置计数器是否应该在定时器警报上使用自动重载首个计数值,还是继续递增或递减
    };
    //2.定时器控制
    timer_init(TIMER_GROUP_1,TIMER_0,&config);//指定定时器的首个计数值,写入定时器计数值的值为0

    //3.警报
    timer_set_alarm_value(TIMER_GROUP_1,TIMER_0,TIMER_SCALE/10);//alarm_value参数表示定时器中断时间间隔
    timer_enable_intr(TIMER_GROUP_1,TIMER_0);

    //4.处理中断事务
    timer_isr_register(TIMER_GROUP_1,TIMER_0,
        timer_group1_isr,//定时器中断回调函数
        (void*)TIMER_0,  //传递给定时器回调函数的参数
        ESP_INTR_FLAG_IRAM, //把中断放到IRAM中
        NULL //调用成功以后返回中断函数的地址,一般用不到
    );

    timer_start(TIMER_GROUP_1,TIMER_0);//使能(启动)定时器
}

(5)主函数


void app_main(void)
{
    unsigned char lastKey = Em_NO_Key;
    configure_led();
    timer_init_test();
    while(1) 
    {
        if(gKey != lastKey)
        {
            if(gKey == Em_Key_short){
                // gKey = Em_NO_Key;//不加这个会导致 飞速显示000000000000000000 1  如何只显示一个0呢?????? 有
                gpio_set_level(12,0);//ok
                printf("1\n");
            }
            else if(gKey == Em_Key_shortup){
                // gKey = Em_NO_Key;//不加这个会导致 飞速显示000000000000 1
                gpio_set_level(12,1);//ok
                printf("0\n");
            }
            lastKey = gKey;
            // vTaskDelay(10 / portTICK_RATE_MS);
        }
        vTaskDelay(10 / portTICK_RATE_MS);
    }

}

运行代码 亮了一颗红灯,随着按键按下和松开进行亮和灭,然后终端会显示打印1和0 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值