ESP32 рдореЗрдВ рддреАрди UART рд╣реИрдВред рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд░рд┐рд╕реАрд╡рд░ рдХреА FIFO рдмрдлрд░ рдФрд░ рдЯреНрд░рд╛рдВрд╕рдореАрдЯрд░ рдХреА FIFO рдмрдлрд░ рдХреЛ 1024 рдмрд╛рдЗрдЯреНрд╕ (рдИрдПрд╕рдкреА 32 рддрдХрдиреАрдХреА рд╕рдВрджрд░реНрдн рдореИрдиреБрдЕрд▓ 3.5) рдХреА рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдореЗрдВ рд░рдЦрддрд╛ рд╣реИ:
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЬрдм рдореИрдВрдиреЗ UART2 рдЯреНрд░рд╛рдВрд╕рдореАрдЯрд░ рдмрдлрд░ рдХреЗ FIFO рдЖрдХрд╛рд░ рдХреЛ 128 рд╕реЗ 256 рдмрд╛рдЗрдЯреНрд╕ рддрдХ рдмрдврд╝рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рддреЛ рдореБрдЭреЗ рдПрдХ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдкреНрд░рднрд╛рд╡ рдорд┐рд▓рд╛ - рдкреНрд░реЗрд╖рд┐рдд рдбреЗрдЯрд╛ рдиреЗ UART0 рд░рд┐рд╕реАрд╡рд░ рдХреЗ рдлреАрдлреЛ рдмрдлрд░ рдХреЛ рдЦрд░рд╛рдм рдХрд░ рджрд┐рдпрд╛, рдЬреЛ рдХрд┐ рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдкреНрд░рд▓реЗрдЦрди (ESP32 рддрдХрдиреАрдХреА рд╕рдВрджрд░реНрдн рдореИрдиреБрдЕрд▓ 3.5) рдореЗрдВ рдлреАрдлреЛ рдмрдлрд░ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдХрд╛ рдХреЛрдИ рд╡рд┐рд╡рд░рдг рдирд╣реАрдВ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, esp-idf рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ (uart_struct.h рдореЗрдВ) рдкрд╛рдП рдЧрдП:
1) рдЯреНрд░рд╛рдВрд╕рдореАрдЯрд░ рдмрдлрд░ рдХреЗ рдлреАрдлреЛ рд╕реНрдерд┐рддрд┐ рд░рдЬрд┐рд╕реНрдЯрд░ (рдЖрдзрд╛рд░ рдкрддреЗ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдСрдлрд╕реЗрдЯ 0x5c):
union { struct { uint32_t status:24; uint32_t reserved24: 8; }; uint32_t val; } mem_tx_status;
2) рд░рд┐рд╕реАрд╡рд░ рдмрдлрд░ рдХреЗ FIFO рд╕реНрдерд┐рддрд┐ рд░рдЬрд┐рд╕реНрдЯрд░ (рдЖрдзрд╛рд░ рдкрддреЗ 0x60 рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдСрдлрд╕реЗрдЯ):
union { struct { uint32_t status: 24; uint32_t reserved24: 8; }; struct { uint32_t reserved0: 2; uint32_t rd_addr: 11; uint32_t wr_addr: 11; uint32_t reserved: 8; }; uint32_t val; } mem_rx_status;
рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ mem_tx_status mem_rx_status рдмрд┐рдЯреНрд╕ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рд╣рдо FIFO рдмрдлрд╝рд░реНрд╕ рдХреЗ рдкрддреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
#include "freertos/FreeRTOS.h" #include "freertos/task.h" #include <driver/uart.h> void print_uart_st(uart_dev_t *u,int num) { printf("UART%d:\n",num); printf("rx_st=0x%X\n",(unsigned int)u->mem_rx_status.val); printf("rx_rd=0x%X\n",(unsigned int)u->mem_rx_status.rd_addr); printf("rx_wr=0x%X\n",(unsigned int)u->mem_rx_status.wr_addr); uint32_t tx_s = u->mem_tx_status.val; printf("tx_st=0x%X\n",tx_s); printf("tx_rd=0x%X\n",(tx_s>>2)&2047); printf("tx_wr=0x%X\n",(tx_s>>13)&2047); } uart_config_t uart_config = { .baud_rate = 115200, .data_bits = UART_DATA_8_BITS, .parity = UART_PARITY_DISABLE, .stop_bits = UART_STOP_BITS_1, .flow_ctrl = UART_HW_FLOWCTRL_DISABLE }; void UARTtest(void * param) { uart_param_config(UART_NUM_1,&uart_config); uart_param_config(UART_NUM_2,&uart_config); uart_driver_install(UART_NUM_1, 256, 0, 0, NULL, 0); uart_driver_install(UART_NUM_2, 256, 0, 0, NULL, 0); uart_set_pin(UART_NUM_1, UART_PIN_NO_CHANGE, GPIO_NUM_16, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE); uart_set_pin(UART_NUM_2, UART_PIN_NO_CHANGE, GPIO_NUM_16, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE); vTaskDelay(1000/portTICK_PERIOD_MS); while (1) { print_uart_st(&UART0,0); print_uart_st(&UART1,1); print_uart_st(&UART2,2); vTaskDelay(2000/portTICK_PERIOD_MS); char s[256]; uart_write_bytes(UART_NUM_1, s, 1); uart_write_bytes(UART_NUM_2, s, 2); if(gets(s)!=NULL) { printf("recived=%s\n",s); } } } void app_main(void) { xTaskCreate(UARTtest, "UARTtest", 4096, NULL, 5, NULL); }
рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ:
UART0:
rx_st = 0x300600
rx_rd = 0x180
rx_wr = 0x180
tx_st = 0xCE058
tx_rd = 0x16
tx_wr = 0x67
UART1:
rx_st = 0x400800
rx_rd = 0x200
rx_wr = 0x200
tx_st = 0x100200
tx_rd = 0x80
tx_wr = 0x80
UART2:
rx_st = 0x500A00
rx_rd = 0x280
rx_wr = 0x280
tx_st = 0x200400
tx_rd = 0x100
tx_wr = 0x100
рдЖрдЙрдЯрдкреБрдЯ UART0 рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП tx_wr рдФрд░ tx_rd 0. рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВред рдкреНрд░рд╛рдкреНрдд рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, FIFO рдмрдлрд╝рд░реНрд╕ UART0,1,2 рдХреЗ рдмреАрдЪ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрди рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИ:
рдкрддрд╛ | UART |
---|
0x00 ... 0x7F | UART0 TX_FIFO |
0x80 ... 0xFF | UART1 TX_FIFO |
0x100 ... 0x17F | UART2 TX_FIFO |
0x180 ... 0x1FF | UART0 RX_FIFO |
0x200 ... 0x27F | UART1 RX_FIFO |
0x280 ... 0x2FF | UART2 RX_FIFO |
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, FIFO рдмрдлрд╝рд░реНрд╕ рдХреА рд╕реНрдерд┐рддрд┐ рд░рдЬрд┐рд╕реНрдЯрд░реЛрдВ рдореЗрдВ 11 рдмрд┐рдЯреНрд╕ рдХреА рдереЛрдбрд╝реА рдХреНрд╖рдорддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ FIFO рдмрдлрд░ = 2Kb рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрд┐рдд рдореЗрдореЛрд░реА рдХрд╛ рдЖрдХрд╛рд░ рд╕рдВрднрд╡ рд╣реИред UART0.mem_conf.tx_size = 15 рд╕реЗрдЯ рдХрд░рддреЗ рд╕рдордп (рдореЗрдореЛрд░реА 128 рдмрд╛рдЗрдЯреНрд╕ рд▓рдВрдмреЗ рдЯреБрдХрдбрд╝реЛрдВ рдореЗрдВ рдЖрд╡рдВрдЯрд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ), 1920 рдмрд╛рдЗрдЯреНрд╕ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ, рдФрд░ рд░рдЬрд┐рд╕реНрдЯрд░ tx_wr рдЯреНрд░рд╛рдВрд╕рдорд┐рд╢рди рдХреЗ рджреМрд░рд╛рди 1919 рдореЗрдВ рдЧрд┐рдирд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ 0 рд╕реЗ рдЧрд┐рдирддреА рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдЧрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╕реНрдореГрддрд┐ рдХреЛ рдХреЗрд╡рд▓ ml рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред 10 рдмрд┐рдЯреНрд╕ рдпрд╛рдиреА FIFO рдмрдлрд░ = 1 рдХреЗрдмреА рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрд┐рдд рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреБрд▓ рдореЗрдореЛрд░реАред
рдХреБрд▓:
- рдлреАрдлреЛ UART рдХреЗ рд▓рд┐рдП ESP32 рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рд╕рд╛рдЭрд╛ рдореЗрдореЛрд░реА рдХрд╛ рдЖрд╡рдВрдЯрди рддрдХрдиреАрдХреА рд╕рдВрджрд░реНрдн рдореИрдиреБрдЕрд▓ 3.5 рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛ рд╣реИ;
- рд╕рд╛рдЭрд╛ рдХреА рдЧрдИ рдореЗрдореЛрд░реА FIFO UART = 1Kb рдХреА рдорд╛рддреНрд░рд╛ред