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