ESP32中断

ESP32的中断方式比较有趣,有触摸中断和常见的电平跳变中断。下面是我接触的关于esp32中断的使用内容

电容按键

ESP32的一部分IO口可以作为电容按键来使用,通过操作这些IO口可以获得当前IO的一个触摸值(应该是通过电压转化的),也可以用相应的电压值触发相应的中断。下面介绍一下我使用到的API函数。

  • touchRead()函数
  • touchAttachInterrupt()函数

touchRead()

以下是touchRead()函数的声明,该函数的作用就是返回当前触摸IO的触摸值,看函数前面的注释,它的作用竟然是为了给触摸中断触发选定一个合适的值。

1
2
3
4
5
6
/*
 * Read touch pad (values close to 0 mean touch detected)
 * You can use this method to chose a good threshold value
 * to use as value for touchAttachInterrupt
 * */
touch_value_t touchRead(uint8_t pin);

touchAttachInterrupt()

以下是该函数的全貌

1
void touchAttachInterrupt(uint8_t pin, void (*userFunc)(void), touch_value_t threshold);

第一个参数是中断触发引脚,第二个参数是中断的回调函数,就是中断触发后要干什么,然后第三个参数是触摸值的阈值,当低于这个阈值时才会触发中断有点奇怪为什么是低于)。

note:使用触摸中断的过程中不能使用touchRead()函数,不然会导致中断时间无法触发,原因未知。也就是说,touchRead()是真的只能获得一个适合的阈值使用。

电平中断

天平跳变引起的中断,普通IO口就能用,使用attachInterrupt()函数进行相关配置,attachInterrupt()定义如下:

1
2
3
4
5
void attachInterrupt(uint8_t pin, std::function<void(void)> intRoutine, int mode)
{
	// use the local interrupt routine which takes the ArgStructure as argument
	__attachInterruptFunctionalArg (pin, (voidFuncPtrArg)interruptFunctional, new InterruptArgStructure{intRoutine}, mode, true);
}

只需设置中断引脚,回调函数,中断触发方式即可。中断触发方式可分为下降沿触发、上升沿触发等。

个人观点

ESP32封装了Arduino库,可以方便我们进行开发,但在我看来,这确实也是不方便的,很多API的定义里面没有说明这个函数是做什么用的,有时候就一头雾水,为什么就这么操作就可以了,就很迷。

0%