espflash --- Công cụ nạp firmware bootloader ROM ESP32¶
Mô-đun này cung cấp một triển khai ESPFlash tối giản, giao tiếp với bootloader ROM ESP32 qua UART. Mô-đun được thiết kế để cập nhật firmware ESP32 trực tiếp trên các mô-đun đồng hành (ví dụ: mô-đun U-blox NINA-W10 dùng trên bo mạch Arduino), và không thay thế cho tiện ích esptool đầy đủ. Các tính năng nâng cao (stub loader, các chip ESP khác, nén deflate, secure boot, v.v.) không được hỗ trợ.
Driver điều khiển RESET và GPIO0 để đưa ESP32 vào chế độ tải xuống, sau đó gửi các lệnh đóng gói SLIP để đọc kích thước bộ nhớ flash, cấu hình giao diện SPI, ghi ảnh firmware và xác minh qua băm MD5.
Ví dụ dành cho Arduino Nano RP2040 Connect (bo mạch duy nhất được OpenMV hỗ trợ có espflash đã được tích hợp sẵn). Chân reset và boot-strap của NINA-W102 lần lượt là GPIO 3 và GPIO 2 của RP2040, còn UART0 của NINA được nối với UART1 của RP2040 (TX = GPIO 8, RX = GPIO 9):
from machine import Pin, UART
from espflash import ESPFlash
reset = Pin(3, Pin.OUT) # NINA RESET
gpio0 = Pin(2, Pin.OUT) # NINA GPIO0
uart = UART(1, 115200, timeout=1000)
esp = ESPFlash(reset, gpio0, uart)
esp.bootloader()
esp.set_baudrate(921600)
size = esp.flash_read_size()
esp.flash_attach()
esp.flash_config(size)
esp.flash_write_file("NINA_FW.bin")
esp.flash_verify_file("NINA_FW.bin")
esp.reboot()
class ESPFlash¶
- class espflash.ESPFlash(reset: 'machine.Pin', gpio0: 'machine.Pin', uart: 'machine.UART', log_enabled: bool = False)¶
Khởi tạo đối tượng
ESPFlashđể điều khiển bootloader ROM ESP32.reset là một thực thể
machine.Pinđược kết nối với đườngRESETcủa ESP32, được cấu hình là đầu ra.gpio0 là một thực thể
machine.Pinđược kết nối với đườngGPIO0của ESP32, được cấu hình là đầu ra.uart là một thực thể
machine.UARTđược kết nối với các chân (pin)UART0của ESP32. Phải được khởi tạo ở tốc độ baud 115200 với thời gian chờ đọc khác không.log_enabled bật ghi nhật ký chi tiết về các khung SLIP trao đổi với bootloader. Chỉ hữu ích khi gỡ lỗi.
Hàm khởi tạo sẽ cố gắng nhập
hashlib. Nếuhashlib.md5khả dụng, băm MD5 liên tục được dùng bởiESPFlash.flash_verify_file()sẽ được tự động tính trong quá trình ghi.- set_baudrate(baudrate: int, timeout: int = 350) None¶
Thay đổi tốc độ baud UART của bootloader.
baudrate là tốc độ baud mới cần chuyển sang. Nếu khác với tốc độ baud hiện tại, lệnh
CHANGE_BAUDRATEsẽ được gửi đến bootloader trước khi UART cục bộ được cấu hình lại.timeout được dự trữ và hiện chưa được sử dụng.
Không có tác dụng nếu đối tượng UART bên dưới không triển khai phương thức
init().
- bootloader(retry: int = 6) bool¶
Điều khiển
RESETvàGPIO0để đưa ESP32 vào chế độ tải ROM và đồng bộ với bootloader.retry là số lần thử reset/đồng bộ trước khi bỏ cuộc.
Trả về
Truenếu thành công, ngược lại ném ra mộtException.
- flash_read_size() int¶
Đọc JEDEC ID của bộ nhớ flash SPI và trả về kích thước flash theo byte.
Ném ra một
Exceptionnếu các bit kích thước được báo cáo nằm ngoài phạm vi0x12-0x19dự kiến.
- flash_attach() None¶
Gắn kết với bộ nhớ flash SPI. Phải được gọi một lần sau
bootloader()và trước bất kỳ thao tác đọc/ghi flash nào.
- flash_config(flash_size: int = 2 * 1024 * 1024) None¶
Cấu hình các tham số bộ nhớ flash SPI.
flash_size là tổng kích thước flash theo byte, thường là giá trị trả về từ
flash_read_size().
Kích thước khối, sector và trang được cố định lần lượt là 64 KiB, 4 KiB và 256 byte.
- flash_write_file(path: str, blksize: int = 0x1000) None¶
Ghi một ảnh firmware vào flash bắt đầu từ offset 0.
path là đường dẫn filesystem của file binary firmware cần nạp.
blksize là kích thước tính theo byte của mỗi khối dữ liệu gửi đến bootloader. Phải là bội số của kích thước sector.
Khối cuối cùng được đệm bằng
0xFFđể đủ blksize. Nếu hỗ trợ MD5 khả dụng, băm MD5 liên tục sẽ được cập nhật trong quá trình ghi đểflash_verify_file()có thể được gọi mà không cần đối số.
- flash_verify_file(path: str, digest: bytes | None = None, offset: int = 0) None¶
Xác minh nội dung flash với một file firmware.
path là đường dẫn filesystem của file binary firmware tham chiếu; kích thước của nó xác định số byte cần xác minh.
digest là băm MD5 được mã hóa hex đã tính trước (tùy chọn) của file. Nếu là
None, băm được tính trong lần gọiflash_write_file()gần nhất sẽ được dùng.offset là offset trong flash theo byte tại đó việc xác minh bắt đầu.
Ném ra một
Exceptionnếu không có băm nào khả dụng hoặc nếu nội dung flash không khớp với băm tham chiếu.