程序小白
认证:优质创作者
所在专题目录 查看专题
初识Arduino:简单是简单了点,还是蛮有意思的
基于ESP32快速搭建蓝牙串口透传应用(Arduino)
基于ESP32搭建的蓝牙串口透传应用代码分析(Arduino)
基于ESP32搭建GPIO-Interrupt应用及分析(Arduino)
基于ESP32例程分析Functional-Interrupt(C++浅析)及GPIO-API详解
基于ESP32——FreeRTOS初识(Arduino)
作者动态 更多
小小调度器——开局default,优雅总藏于细节之中
04-02 09:23
小小调度器——调度器核心的纯C实现
04-01 14:09
小小调度器——原来C代码还能这么写,原作者没少挨打吧!
03-27 15:42
解析由系统库引发的hardfault血案(RT-Thread+ESP32)
2023-07-17 16:04
TINA瞬时现象仿真分析——运放缓冲器振铃
2023-02-28 11:38

基于ESP32例程分析Functional-Interrupt(C++浅析)及GPIO-API详解

===================Function-Interrupt应用分析===================

      Functional-Interrupt应用功能与前一篇GPIO-Interrupt其实实现的功能是一样的,区别就是,他是C++版本的实现,而且你要知道Arduino中大部分的中间件都是基于C++的实现,而自古C与C++是不分家的,所以我决定挑战一下我的软肋,来分析一下这个C++应用的实现思路。

===================接下来进入C++闲聊模式=====================

我觉得你既然会C,那么你必须会C++~!!!为啥要这么说?

你学C已经付出了很多的艰辛,其实距离C++可能就剩下捅破十张窗户纸的距离,努力一把它会给你开启编程界的新大门。C++的复杂程度其实在于其实现的机制,我相信工作多年你已经过了好奇宝宝的年纪,更关注于实际的应用。

知识点一:C++中一切皆对象(其实就是幻象):C语言中的就是结构体类型变量。

结构体类型变量(C语言)≈ 对象(C++语言)。

当然一个简单的变量也可以看作是一个对象,但是这么来看其实就失去了对象的意义。

struct  ≈ class :主要用来定义结构体或者类。

知识点二:C++很讨厌全局变量(虽然我很喜欢),于是他引入了访问权限,最常用的就是

public 和private  权限修饰符。他们主要是规定了对象内部的属性和方法可以调用的空间。

public权限修饰后,可以在对象外部调用。

private权限修饰后,只能在对象的内部使用。

知识点三:class类对比与struct有两个特殊得函数,一个叫构造函数,一个叫析构函数。

构造函数:在创建一个对象的时候被自动调用。

析构函数:在销毁一个对象的时候被调用。

只有对象是以动态分配内存的方式创建,才有被析构的机会,搞过多年软件的我,还是建议你能用静态就用静态,不要在乎那点RAM开销,不行就换片子。

知识点四:std开头的函数(std代表C++特有)

注解:isr是一个标准的函数,但是他绑定的时候是在类中进行的,实际执行的应该是特定对象的isr,但是在这里绑定的时候对象还没出生呢,于是用this指针绑定,这样isr外部调用的时候,调用的主体是对象。(有点点绕)

================更改软件并烧录测试========================

1. 软件更改button编号:

2. 烧录到我们的ESP32开发板中,并连接串口:

3. 测试接线说明:

4. 串口测试数据输出:

===================ESP32补充篇GPIO-API应用===================

      闲聊过后,还是来详细介绍一下GPIO相关的功能函数,先看一下工程下关于GPIO-API定义的文件,esp32-hal-gpio.h文件(看到hal的一瞬间,让我想起来温暖的STM32hal库):

=======================================================1. void pinMode(uint8_t pin,uint8_t mode);

函数功能:引脚模式设置

pin参数:IO号(注意不是引脚编号)

mode参数:IO模式:

                    INPUT: 数字输入

                     INPUT_PULLUP: 带内上拉数字输入

                     OUTPUT: 数字输出

返回值:无

2. void digitalWrite(uint8_t pin,uint8_t value);

函数功能:设置引脚输出电平

pin参数:IO号(注意不是引脚编号)

value参数:设置引脚输出电平HIGH(高)或LOW(低)

返回值:无

3. int digitalRead(uint8_t pin);

函数功能:读取引脚电平状态。

pin参数:IO号(注意不是引脚编号)

int返回值:返回引脚的电平

                  HIGH:高电平

                  LOW:低电平

4.void attachInterrupt(uint8_t pin, void (*)(void), int mode);

函数功能:中断绑定功能

pin参数:IO号,绑定引脚编号。

void (*)(void)参数:函数指针,指向中断服务函数。

mode参数:中断模式。          

5.void attachInterruptArg(uint8_t pin, void (*)(void*), void * arg, int mode);

这个API函数与上面一个API函数非常相似,所以我们只讲不同之处,首先这个绑定的中断服务例程是一个带传参的例程。

      首先第二个函数的指针类型有变化,参数由void类型变为了void*类型,意义完全发生了变化,这是一个带参数的函数指针类型,参数类型为void * 。

      这里就不难理解API在函数指针的后面多了一个void * 类型的参数arg,这个参数正是我们函数指针用到的参数,也就是第三个参数为第二个参数服务。

      关于void * 类型参数,首先这个参数是一个指针类型,而且是一个void指针类型,也就代表着,你可以是任意类型指针都可以。

6. void detachInterrupt(uint8_t pin);

函数功能:解除中断引脚绑定功能。

pin参数:解除具体引脚IO号。

返回值:无。

             

声明:本内容为作者独立观点,不代表电子星球立场。未经允许不得转载。授权事宜与稿件投诉,请联系:editor@netbroad.com
本篇所含全部资料,点击此处留下邮箱我会发给你
资料明细:例程源码在这里,Aruidno的示例中有,只是调整了一下PIN的引脚号
觉得内容不错的朋友,别忘了一键三连哦!
赞 4
收藏 4
关注 115
成为作者 赚取收益
全部留言
0/200
  • chaochao1545 2021-07-01 18:24
    [null]
    回复