先上文档,ESP32 中断介绍官方文档:
Interrupt allocation - ESP32 - — ESP-IDF 编程指南 latest 文档
esp_intr_alloc函数说明,一般也不会直接调用该函数
翻到这个函数因为在初始化串口时uart_driver_install函数返回错误ESP_ERR_NOT_FOUND,定义如下:
#define ESP_ERR_NOT_FOUND 0x105 /*!< Requested resource not found */
然后逐层挖下次,是esp_intr_alloc报上来的错误,实际意思是中断的资源用完,不过也不知道哪里用完了,esp32S3串口有3个,我只是开了2个串口,包含日志输出的串口
一般调用uart_driver_install时最后一个参数都是使用默认0,例子里大多数也是intr_alloc_flags 为0,intr_alloc_flags参数介绍为:
intr_alloc_flags 参数:
* @param intr_alloc_flags Flags used to allocate the interrupt. One or multiple (ORred)
* ESP_INTR_FLAG_* values. See esp_intr_alloc.h for more info. Do not set ESP_INTR_FLAG_IRAM here
* (the driver's ISR handler is not located in IRAM)
可用值:
/** @brief Interrupt allocation flags
*
* These flags can be used to specify which interrupt qualities the
* code calling esp_intr_alloc* needs.
*
*/
//Keep the LEVELx values as they are here; they match up with (1<<level)
#define ESP_INTR_FLAG_LEVEL1 (1<<1) ///< Accept a Level 1 interrupt vector (lowest priority)
#define ESP_INTR_FLAG_LEVEL2 (1<<2) ///< Accept a Level 2 interrupt vector
#define ESP_INTR_FLAG_LEVEL3 (1<<3) ///< Accept a Level 3 interrupt vector
#define ESP_INTR_FLAG_LEVEL4 (1<<4) ///< Accept a Level 4 interrupt vector
#define ESP_INTR_FLAG_LEVEL5 (1<<5) ///< Accept a Level 5 interrupt vector
#define ESP_INTR_FLAG_LEVEL6 (1<<6) ///< Accept a Level 6 interrupt vector
#define ESP_INTR_FLAG_NMI (1<<7) ///< Accept a Level 7 interrupt vector (highest priority)
#define ESP_INTR_FLAG_SHARED (1<<8) ///< Interrupt can be shared between ISRs
#define ESP_INTR_FLAG_EDGE (1<<9) ///< Edge-triggered interrupt
#define ESP_INTR_FLAG_IRAM (1<<10) ///< ISR can be called if cache is disabled
#define ESP_INTR_FLAG_INTRDISABLED (1<<11) ///< Return with this interrupt disabled
#define ESP_INTR_FLAG_LOWMED (ESP_INTR_FLAG_LEVEL1|ESP_INTR_FLAG_LEVEL2|ESP_INTR_FLAG_LEVEL3) ///< Low and medium prio interrupts. These can be handled in C.
#define ESP_INTR_FLAG_HIGH (ESP_INTR_FLAG_LEVEL4|ESP_INTR_FLAG_LEVEL5|ESP_INTR_FLAG_LEVEL6|ESP_INTR_FLAG_NMI) ///< High level interrupts. Need to be handled in assembly.
#define ESP_INTR_FLAG_LEVELMASK (ESP_INTR_FLAG_LEVEL1|ESP_INTR_FLAG_LEVEL2|ESP_INTR_FLAG_LEVEL3| \
ESP_INTR_FLAG_LEVEL4|ESP_INTR_FLAG_LEVEL5|ESP_INTR_FLAG_LEVEL6| \
ESP_INTR_FLAG_NMI) ///< Mask for all level flags
intr_alloc_flags参数最终会传给esp_intr_alloc,从错误ESP_ERR_NOT_FOUND知道中断资源用完了,ESP提供了一种共享的方式使用中断,也就是使用ESP_INTR_FLAG_SHARED代替0传入,采用共享中断的方式,直接改一个是没效果的,共享嘛,要其他和你共享,其他也要改成共享的方式才行。不重要的中断,我全部干脆都使用共享中断,改了GPIO、TWAI、音频、UART...,从文档看到使用共享中断后中断等级只能使用level-1,即最低等级中断。