在例程中首先使用了:

 
esp_err_t uart_driver_install(uart_port_t uart_num, int rx_buffer_size, int tx_buffer_size, int event_queue_size, QueueHandle_t *uart_queue, int intr_alloc_flags)

这个函数来初始化串口。它后面三个参数很奇怪。

event_queue_sizeuart_queueintr_alloc_flags

这个函数的源代码 如下:

它里面用了一个结构体p_uart_obj 来保存串口的一些信息,结构体如下:

看到源代码里面,这个结构体是动态申请的。uart_alloc_driver_obj(event_queue_size, tx_buffer_size, rx_buffer_size); 里面动态申请了数组和ring_buff。

该函数里面申请ring_buff的xRingbufferCreate 是ESP-IDF魔改的FreeRTOS..

FreeRTOS(附加功能) - ESP32 - — ESP-IDF 编程指南 v5.2.1 文档

然后初始化了一些参数,初始化完成后调用esp_intr_alloc ,给中断号分配中断函数。。

ESP-IDF的中断和我熟悉的STM32F1有点不同,因为它有两个核,esp_intr_alloc 这个函数就是抽象隐藏了这些细节。

中断分配 - ESP32 - — ESP-IDF 编程指南 v5.2.1 文档

intr_alloc_flags 这个参数就是决定了中断类型,可选参数为:

#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