EXTI


首先开始对GPIO的配置:
gpio_config_t gpio_cfg;
gpio_cfg.intr_type = GPIO_INTR_NEGEDGE; // 是否开启中断
gpio_cfg.mode = GPIO_MODE_INPUT; // 模式
gpio_cfg.pin_bit_mask = 1ULL << GPIO_NUM_9; // 引脚
gpio_cfg.pull_down_en = GPIO_PULLDOWN_DISABLE;// 是否下拉
gpio_cfg.pull_up_en = GPIO_PULLUP_ENABLE; // 是否上拉
gpio_config(&gpio_cfg);
**gpio_install_isr_service()函数:**用来注册中断,参数:中断类型
gpio_install_isr_service(ESP_INTR_FLAG_EDGE); // 中断注册函数 参数:中断类型,这里是边沿触发
**gpio_isr_handler_add()函数:**IO口与中断服务函数匹配;
// 参数讲解: 中断引脚号 中断服务函数 中断服务函数的参数
gpio_isr_handler_add(GPIO_NUM_9, exti_isr_handler, NULL);
使能中断:
gpio_intr_enable(GPIO_NUM_9); // 使能中断
全部代码:
#include "EXTI.h"
#include "driver/gpio.h"
#include "led.h"
void exti_isr_handler(void *arg)
{
LED_Toggle();
}
void EXTI_Init(void)
{
gpio_config_t gpio_cfg;
gpio_cfg.intr_type = GPIO_INTR_NEGEDGE;
gpio_cfg.mode = GPIO_MODE_INPUT;
gpio_cfg.pin_bit_mask = 1ULL << GPIO_NUM_9;
gpio_cfg.pull_down_en = GPIO_PULLDOWN_DISABLE;
gpio_cfg.pull_up_en = GPIO_PULLUP_ENABLE;
gpio_config(&gpio_cfg);
gpio_install_isr_service(ESP_INTR_FLAG_EDGE); // 中断注册函数 参数:中断类型,这里是边沿触发
// 参数讲解: 中断引脚号 中断服务函数 中断服务函数的参数
gpio_isr_handler_add(GPIO_NUM_9, exti_isr_handler, NULL);
gpio_intr_enable(GPIO_NUM_9); // 使能中断
}
通用定时器
在对定时器进行配置时,一般流程如下:

流程:

**gptimer_handle_t:**就是给定时器创建一个句柄,仅此而已
**gptimer_new_timer()函数:**对定时器进行一个初始化的配置,主要的配置参数如下:
时钟源,计数方向,是否所有中断共享一个中断函数,中断优先级,一个数的时间
/* -----------------------配置定时器时钟源和计数器--------------------- */
gptimer_config_t gptimer;
gptimer.clk_src = GPTIMER_CLK_SRC_APB; // 时钟源
gptimer.direction = GPTIMER_COUNT_UP; // 计数方向
gptimer.flags.intr_shared = 0; // 标志位 设置为1的话所有定时器会共享一个中断服务函数
gptimer.intr_priority = 0; // 中断优先级 该值为0是,系统会自动分配一个优先级
gptimer.resolution_hz = 1000000; // 解析分辨率 设置该值后,系统会每隔 1/resolution_hz 计数值+1
gptimer_new_timer(&gptimer, &gptim);
gptimer_set_alarm_action()函数:对定时器进行深入的配置,配置参数如下:
计数最大值,是否重装载,重置计数值
/* ---------------------配置定时器比较器的动作-------------------------- */
gptimer_alarm_config_t alarm_config;
alarm_config.alarm_count = 500000; // 设置计数器最大值 我们想让500ms产生一次中断,该值设置为500000
alarm_config.flags.auto_reload_on_alarm = 1; // 是否自动重装载
alarm_config.reload_count = 0; // 重置计数值,当计数值达到上限后,会重置为该值
gptimer_set_alarm_action(gptim, &alarm_config);
gptimer_register_event_callbacks()函数:对中断进行一个配置,配置参数如下:
中断函数名称
/* ----------------------------函数配置中断事件---------------------------------- */
gptimer_event_callbacks_t Event_cfg;
Event_cfg.on_alarm = TimerCallback;
gptimer_register_event_callbacks(gptim, &Event_cfg, NULL);
中断服务函数:

这里使用的是一个函数指针,我们对其进行改名就可以了
uint8_t flag_timer = 0;
bool IRAM_ATTR TimerCallback(gptimer_handle_t timer, const gptimer_alarm_event_data_t *edata, void *user_ctx)
{
// 也要声明IRAM_ATTR,说明这个函数是IRAM中的函数,不能在Flash中运行
flag_timer = 1;
return false;
}
随后就是使能函数
gptimer_enable(gptim);
gptimer_start(gptim);
全部代码:
#include "Tim.h"
#include "driver/gptimer.h"
#include "esp_attr.h" // 在IRAM中运行的程序,要调用这个库
/* 在IRAM中的代码不能太多也不能有太多延时操作,否则会导致系统卡死 */
uint8_t flag_timer = 0;
bool IRAM_ATTR TimerCallback(gptimer_handle_t timer, const gptimer_alarm_event_data_t *edata, void *user_ctx)
{
// 也要声明IRAM_ATTR,说明这个函数是IRAM中的函数,不能在Flash中运行
flag_timer = 1;
return false;
}
gptimer_handle_t gptim;
void Tim_Init(void)
{
/* ------------------配置定时器时钟源和计数器------------------------- */
gptimer_config_t gptimer;
gptimer.clk_src = GPTIMER_CLK_SRC_APB; // 时钟源
gptimer.direction = GPTIMER_COUNT_UP; // 计数方向
gptimer.flags.intr_shared = 0; // 标志位 设置为1的话所有定时器会共享一个中断服务函数
gptimer.intr_priority = 0; // 中断优先级 该值为0是,系统会自动分配一个优先级
gptimer.resolution_hz = 1000000; // 解析分辨率 设置该值后,系统会每隔 1/resolution_hz 计数值+1
gptimer_new_timer(&gptimer, &gptim);
/* -------------------配置定时器比较器的动作------------------------------ */
gptimer_alarm_config_t alarm_config;
alarm_config.alarm_count = 500000; // 设置计数器最大值 我们想让500ms产生一次中断,该值设置为500000
alarm_config.flags.auto_reload_on_alarm = 1; // 是否自动重装载
alarm_config.reload_count = 0; // 重置计数值,当计数值达到上限后,会重置为该值
gptimer_set_alarm_action(gptim, &alarm_config);
/* --------------------函数配置中断事件-------------------------------- */
gptimer_event_callbacks_t Event_cfg;
Event_cfg.on_alarm = TimerCallback;
gptimer_register_event_callbacks(gptim, &Event_cfg, NULL);
gptimer_enable(gptim);
gptimer_start(gptim);
}
系统定时器
可作为操作系统的滴答,也可作为普通的定时器使用。系统定时器的时钟源只能是XTAL_CLK

