===================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号。
返回值:无。