ESP32S3笔记

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

相关推荐
ss2731 小时前
AI时代首先数据库-PostgreSQL实战笔记 | 28 PostgreSQL MVCC机制介绍
数据库·笔记·postgresql
lll23526917795 小时前
2026行业语音转写工具专业术语转写功能横向分析
笔记·智能手机
解决小子14 小时前
【虚幻引擎】【C++】【GAS框架】构建角色基类、属性集、数值钳制
c++·笔记·游戏引擎·虚幻·gas·能力系统
破芽15 小时前
learn-claude-code-s05-s11-学习笔记
笔记·学习
程序猿乐锅17 小时前
【从0-1学习Python | 第七篇】Python 面向对象基础
开发语言·笔记·后端·python·学习·1024程序员节
fish_zzzz17 小时前
笔记--浅谈内存,存储空间,BIOS芯片,显卡GPU、VRAM(1)
笔记·1024程序员节
ACP广源盛1392462567317 小时前
PCIe Gen3 交换芯片选型笔记:多路扩展方案 IX7024@ACP 评估
笔记·硬件架构·pcie·国产芯片
深圳老胡17 小时前
STM32 开发中 Trae 内置模型怎么选:Seed、MiniMax、GLM、DeepSeek、Kimi、Qwen 全对比
笔记·stm32·单片机·嵌入式硬件·代码规范·1024程序员节
坤坤子吖18 小时前
C++继承:友元、静态成员、多继承与组合
开发语言·c++·笔记·学习·1024程序员节