1. Cơ sở lý thuyết và Nguyên lý hoạt động
Trong các hệ thống nhúng thời gian thực, tính ổn định và khả năng tái lập tín hiệu phụ thuộc trực tiếp vào cách cấu hình ngoại vi phần cứng. Thay vì sử dụng phương pháp bit-banging hoặc ngắt phần mềm (vốn dễ bị trễ do các task ưu tiên cao hơn của hệ điều hành), chúng ta sử dụng ngoại vi chuyên dụng như RMT (Remote Control) hoặc TWAI (CAN-Bus) tích hợp sẵn trong silicon của ESP32.
#include "driver/rmt_rx.h"
#include "esp_log.h"
#define IR_RX_GPIO_NUM 5
#define IR_RESOLUTION_HZ 1000000 // 1MHz resolution (1 tick = 1us)
rmt_channel_handle_t rx_channel = NULL;
rmt_rx_channel_config_t rx_config = {
.clk_src = RMT_CLK_SRC_DEFAULT,
.resolution_hz = IR_RESOLUTION_HZ,
.mem_block_symbols = 64, // 64 words hardware ringbuffer
.gpio_num = IR_RX_GPIO_NUM,
};
ESP_ERROR_CHECK(rmt_new_rx_channel(&rx_config, &rx_channel));
ESP_LOGI("CHOTDIY_IR", "RMT Rx Channel initialized with 1us resolution.");2. Kiểm tra tính toàn vẹn và Phục hồi lỗi
Trước khi lưu trữ bất kỳ dữ liệu cấu hình hoặc lệnh IR nào vào bộ nhớ không bay hơi (NVS), hệ thống luôn tính toán mã kiểm tra CRC-32. Nếu phát hiện sai lệch dữ liệu do mất điện đột ngột trong chu kỳ ghi Flash, hệ thống sẽ tự động chuyển về cấu hình an toàn mặc định (Fail-safe State).