ESP32S3笔记
发布时间:2026/10/26 10:14:47 锦皓数字建站

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
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。