🌱 Bootloader 6. Thao tác bộ nhớ FLASH
✌ Thao tác đọc/ghi/xóa bộ nhớ Flash là phần cực quan trọng để tạo ứng dụng Bootloader. Thông thường, chúng ta thường nạp code bằng phần mềm, và gần như không cần quan tâm đến việc chương trình được ghi vào đâu, ghi như thế nào. Ngược lại, với ứng dụng Bootloader, chúng ta cần quan tâm xem mình cần ghi gì? (Data từ File Hex), và ghi vào đâu? (Address từ File Hex) - Tham khảo bài Cấu trúc Hex File.
Ngoài ra, việc thao tác bộ nhớ Flash còn có tác dụng trong việc lưu trữ một vài dữ liệu quan trọng, mà khi reset (do mất điện hay gì đó), thì dữ liệu đó sẽ không bị mất đi, do Flash là loại bộ nhớ Non-Volatile.
✌ Có 3 thao tác chính với bộ nhớ Flash, đó là: Đọc - Read, Ghi - Write, Xóa - Erase. Trong Reference Manual (STM32F401) đã cung cấp chương 3 nói về thao tác với bộ nhớ Flash. Ở đây, mình sẽ không tập trung quá sâu vào phần này, mà chỉ cung cấp cho các bạn các hướng dẫn về các thao tác với lệnh, và code mẫu để các bạn thực hành.
➤ Hướng dẫn lập trình Flash - STM32 Register Level
👉 Lock & Unlock Flash
Bộ nhớ Flash lưu chương trình của Vi điều khiển nên việc bảo vệ nó khỏi việc "lỡ tay" thay đổi là rất quan trọng, vì vậy, nó cung cấp cho người dùng một cơ chế Lock & Unlock đơn giản. Cụ thể, thanh ghi FLASH_CR (Flash Control Register) được bảo vệ sau khi reset. Trước khi thao tác với thanh ghi này, chúng ta cần Unlock nó, và sau đó Lock nó lại.
Việc Unlock khá đơn giản, chúng ta cần lần lượt ghi 2 key vào thanh ghi FLASH_KEYR
Trong khi đó, với việc Lock, chúng ta chỉ cần set bit[0] - OPTLOCK của thanh ghi FLASH_OPTCR.
👉 Erase Flash
Bộ nhớ FLASH cho phép xóa theo từng Sector, các Sector trong vi điều khiển STM32 được nêu trong bài viết Tổ chức bộ nhớ STM32. Để xóa một Sector trong vi điều khiển STM32, chúng ta cần biết địa chỉ bắt đầu của từng Sector, và làm theo các bước sau.
Flash Erase Sequence |
- Kiểm tra xem Flash có "rảnh" không bằng cách kiểm tra cờ BSY trên thanh ghi FLASH_SR.
- Set bit SER của thanh ghi FLASH_CR lên 1 để cho phép xóa, và chọn sector xóa bằng 4 bit SNB[3:0] trên thanh ghi FLASH_CR.
- Set bit STRT trên thanh ghi FLASH_CR lên 1, xóa bit SER.
- Đợi bit BSY = 0.
👉 Write Flash
Việc ghi vào Flash thường được thực hiện theo từng Word (tức là 4 byte), vì Vi điều khiển STM32 mỗi thanh ghi/ô nhớ có 32-bit. Việc thực hiện ghi vào Flash thực hiện theo các bước sau:
Flash Write Sequence |
- Kiểm tra xem Flash có "rảnh" không bằng cách kiểm tra cờ BSY trên thanh ghi FLASH_SR.
- Set bit PG trên thanh ghi FLASH_CR lên 1 để cho phép programming Flash.
- Thực hiện ghi Data vào địa chỉ cần thiết.
- Đợi bit BSY = 0.
👉 Nói chung việc thao tác với Flash là không quá khó, chúng ta chỉ việc làm theo các chỉ dẫn trong Reference Manual là xong, dòng nào cũng vậy. Bên dưới đây mình cung cấp một số hướng dẫn để anh em có thể thực hành theo.
- Tham khảo Register Programming - Flash cho STM32F1
- Tham khảo Thư viện HAL - Flash