在例程中首先使用了:
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_size
、uart_queue
、intr_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