🌱 STM32 - 17. Giao tiếp bộ nhớ Flash - Register Access

🌱 STM32 - 17. Giao tiếp bộ nhớ Flash - Register Access

    Đối với các ứng dụng nhúng, việc quản lý tài nguyên, đặc biệt là bộ nhớ, là công việc rất quan trọng. Trong đó bộ nhớ FLASH là bộ nhớ chính của chương trình, và có rất nhiều vấn đề cần bàn luận xoay quanh nó. Ở bài viết này, mình sẽ giới thiệu với các bạn cách giao tiếp (Đọc/Ghi/Xóa) vào bộ nhớ Flash, sử dụng vi điều khiển STM32.

    👉 Phần cứng sử dụng: STM32F401RE - NUCLEO Board.

    👉 Phần mềm sử dụng: STM32CubeIDE ⇒ Xem hướng dẫn sử dụng.

    👉 Tổ chức vùng nhớ Flash STM32

    Bộ nhớ Flash của STM32 có một số đặc điểm/Features chính, các bạn có thể tham khảo tài liệu Reference Manual, chapter Embedded Flash Memory Interface.

    Đối với bài viết này mình sử dụng Vi điều khiển STM32F401 - Nucleo Board, vi điều khiển này có một số đặc điểm sau:

  • Dung lượng 512 KBytes. 
  • Main Memory Block chia thành 4 Sector kích thước 16 KBytes, 1 Sector 64 KBytes, 3 Sector 128 KBytes.
  • System Memory (30 KBytes) sử dụng cho Device Boots ở System Memory Boot Mode.
  • 512 Bytes OTP (One-Time Programmable) + 16 Bytes mở rộng dùng để Lock vùng OTP. 
  • 16 Option Bytes để configure việc bảo vệ đọc/ghi, watchdog software/hardware, reset khi thiết bị ở mode Standby/Stop. 
Flash Memory

    👉 Lock/Unlock Flash

    Mặc định, thanh ghi Control của Flash sẽ bị Lock để tránh các truy cập bất thường, chẳng hạn một nhiễu/ghi nhầm cũng có thể làm thanh ghi này bị thay đổi không theo mong muốn của chương trình.

    Đối với STM32, trạng thái Lock/Unlock của thanh ghi FLASH_CR được quy định bởi bit LOCK của thanh ghi FLASH_CR (LOCK = 1, thanh ghi FLASH_CR ở trạng thái Lock và ngược lại được Unlock khi bit LOCK = 0).

    Nếu Flash ở trạng thái Lock (Bit LOCK = 1), chúng ta có thể thực hiện Unlock bằng cách sau:

  • Ghi giá trị KEY1 = 0x45670123, vào thanh ghi FLASH_KEYR
  • Ghi giá trị KEY2 = 0xCDEF89AB, vào thanh ghi FLASH_KEYR
    Sau khi thực hiện theo Sequence trên, bit LOCK của thanh khi FLASH_CR sẽ tự động clear về 0.

    👉 Sequence Erase - Xóa Flash

    Đối với việc xóa, bộ nhớ Flash hỗ trợ xóa từng Sector, hoặc xóa toàn bộ các Sector (Mass Erase). Để thực hiện xóa một/toàn bộ các sector, chúng ta sẽ thực hiện theo sequense sau (Đảm bảo đã Unlock Flash):

  1. Đợi hoạt động trước đó hoàn thành, bằng cách check bit BSY của thanh ghI FLASH_SR.
  2. Set bit SER - Sector Erase, của thanh ghi FLASH_CR.
  3. Ghi giá trị Sector number vào trường SNB thanh ghi FLASH_CR.
  4. Set bit STRT của thanh ghi FLASH_CR.
  5. Đợi hành động thực hiện xong bằng bit BSY (Clear về 0), của thanh ghi FLASH_SR.

    Đối với Mass Erase, sequence sẽ tương tự như trên, chỉ khác ở điểm: Thay vì set bit SER - Sector Erase ở bước 2, chúng ta sẽ set bit MER - Mass Erase của thanh ghi FLASH_CR. Và không cần chọn sector bằng trường SNB ở bước 3, bởi vì chúng ta sẽ xóa toàn bộ nội dung của tất cả các Sector.

    👉 Sequence Write - Ghi vào Flash

        Đối với việc ghi, Flash hỗ trợ việc ghi theo từng Word (4 bytes). Để thực hiện ghi, chúng ta sẽ tuân theo sequence sau đây:
    1. Đợi hoạt động trước đó hoàn thành, bằng cách check bit BSY của thanh ghI FLASH_SR.
    2. Set bit PG - Program, của thanh ghi FLASH_CR.
    3. Thực hiện ghi dữ liệu vào vùng nhớ muốn ghi.
    4. Đợi hành động thực hiện xong bằng bit BSY (Clear về 0), của thanh ghi FLASH_SR.
        👉 Mình để lại Video sau để các bạn tham khảo nhé!

        Các bạn thấy Video hữu ích có thể cho mình xin 1 Like + 1 Subcribe nhé 💗

    >>>= Follow ngay =<<<

    Để nhận được những bài học miễn phí mới nhất nhé 😊

    Chúc các bạn học tập tốt 😊

                                            

    Nguyễn Văn Nghĩa

    Mình là một người thích học hỏi và chia sẻ các kiến thức về Nhúng IOT.

    Đăng nhận xét

    Mới hơn Cũ hơn