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

相关推荐
岑梓铭几秒前
《考研408数据结构》第七章(B树 和 B+树)复习笔记
数据结构·笔记·b树·考研·408
Go Work4 小时前
docker 占满根分区时先分清谁在吃盘
经验分享·笔记
3095566665 小时前
股票接口返回 404 与空数组的排查笔记:证书状态与级别参数
java·笔记·python·ios·iphone·股票数据api·股票数据接口
蒸蒸yyyyzwd6 小时前
从邓明学习的后端笔记
笔记·学习
岑梓铭6 小时前
《考研408数据结构》第八章(排序)复习笔记
数据结构·笔记
Rabitebla18 小时前
【Linux】进程控制(十二) 自定义 Shell(二):内建命令与进程工作目录管理
linux·c++·笔记·学习·bash
坤坤子吖1 天前
Linux网络编程:TCP 粘包与半包问题,如何正确处理 TCP 流式数据?
linux·服务器·网络·笔记·网络协议·学习
YLCHUP1 天前
【思维&图论建模】题解:债权(debt)_图论_建模_思路转化_思维题目_C++算法竞赛
c++·笔记·算法·数学建模·贪心算法·深度优先·图论
旖旎夜光1 天前
【C++ 基础入门】C++11 新特性(中):右值引用、移动语义与完美转发
开发语言·c++·笔记·学习
星恒随风2 天前
MySQL 从零入门(五):MySQL 内置函数详解——日期、字符串、数学函数与实战案例
linux·数据库·笔记·sql·mysql