Bài 20: Lập trình STM32 Flash đọc, ghi và xóa dữ liệu

bai 20 lập trình stm32 flash

Flash là gì và cách lập trình flash trên STM32, tổ chức bộ nhớ STM32 flash, cách đọc,ghi, xóa bộ nhớ Flash và tại sao nó rất quan trọng trong lập trình. Đó là những kiến thức chúng ta sẽ học trong bài hôm nay.

Bài 20 trong Serie Học STM32 từ A tới Z

Flash là gì?

Bộ nhớ flash là một loại bộ nhớ máy tính kiểu bộ nhớ điện tĩnh (non-volative memory), có thể bị xóa và lập trình lại (reprogrammed).

Về mặt kỹ thuật thì bộ nhớ flash có thể được dùng như một loại EEPROM mà ở đó nó có thể được đọc/ghi bằng điện và không mất dữ liệu khi ngừng cung cấp điện. Có 2 kiểu bộ nhớ flash chính đã được tạo ra là NAND và NOR được cấu thành từ các cổng logic.

Bộ nhớ flash được cấu thành từ các phần tử (cell) nhớ riêng rẽ với các đặc tính bên trong giống như những cổng logic tương ứng đã tạo ra nó; do đó, ta có thể thực hiện thao tác đọc/ ghi, lưu trữ dữ liệu theo từng phần tử (cell) nhớ một.

Tại sao chúng ta phải sử dụng Flash, EEPROM

Bộ nhớ flash ngoài việc để lưu chương trình mà lập trình viên nạp vào, còn có một công dụng khác đó là lưu trữ dữ liệu quan trọng, không bị mất đi mỗi khi reset hoặc tắt điện.

Lấy ví dụ: Chiêc điều hòa nhà bạn, khi bạn set 27 độ và tắt điện điều hòa đi. Thì khi mở lên chúng vẫn sẽ chạy ở nhiệt độ 27 độ. Điều đó nghĩa là setting của bạn đã được lưu lại, và chúng sẽ được lưu ở Flash hoặc EEPROM. ( ROM sẽ không thể đọc, ghi nhiểu lần)

Khác biệt giữa flash và EEPROM

Bộ nhớ flash kiểu cổng NAND có thể được ghi và đọc theo từng khối (block) hoặc trang (page) nhớ, còn bộ nhớ flash kiểu cổng NOR thì có thể được đọc hoặc ghi một cách độc lập theo từng từ (word) hoặc byte nhớ của máy.

Thông thường bộ nhớ Flash trên vi điều khiển sẽ được thiết kế kiểu NAND vậy nên chúng ta phải đọc ghi theo từng khối và page.

EEPROM sẽ được đọc ghi theo từ byte và word giống NOR flash.

Vậy nên hãy lưu ý phần này khi lập trình với Flash trên vi điều khiển nhé.

Tổ chức bộ nhớ flash trên STM32f103c8t6

Bộ nhớ STM32 Flash được tổ chức như là 1 khối chính (main block) lên đến 64 Kb (hoặc 128 Kb) chia thành 128 pages, mỗi page 1 Kbytes (medium-density devices) và 1 khối thông tin (information block). Bắt đầu từ địa chỉ 0x0800 0000, bộ nhớ chương trình sẽ được lưu ở đây.

stm32 flash memory

Đọc, ghi, xóa dữ liệu trên flash

STM32 có một bộ nhớ NAND Flash được nhúng sẵn trong vi điều khiển. Tất cả mô tả về việc lập trình sẽ được mô tả trong mục 3.3.3 Embedded flash memory của reference manual stm32 

Để đọc chính xác dữ liệu từ bộ nhớ Flash, số lượng các trạng thái chờ/độ trễ (LATENCY) phải được lập trình trong thanh ghi FLASH_ACR (Flash access control register) đúng với khoảng điện áp cung cấp của thiết bị và tần số clock của CPU (HCLK).

Lưu ý: Nếu bạn không setting đúng sẽ dẫn tới trường hợp, khi nâng xung nhịp của hệ thống lên cao sẽ không đọc được flash.

Trong thư viện STM32_HAL_Flash. Phần setting này đã được lập trình đúng nên các bạn có thể yên tâm sử dụng nhé

Chi tiết sẽ được mô tả trong bảng sau:

stm32 flash number o wait

Thao tác xóa và ghi trên STM32 Flash phải thực hiện theo page (trang) hoặc xóa toàn bộ chip (mass erase).

Ngoài ra chúng ta cần khóa và mở khóa vùng nhớ để bảo vệ dữ liệu chứa trong đó.

Lập trình STM32 Flash đọc ghi dữ liệu trên STM32

Đầu tiên chúng ta sẽ định nghĩa page bắt đầu và kết thúc

stm32 flash code

Ghi dữ liệu vào Flash

  1. Mở khóa STM32 Flash
  2. Tạo biến struct để xóa
  3. Chọn kiểu xóa theo Page
  4. Địa chỉ bắt đầu xóa
  5. Số lượng page cần xoá
  6. Sau đó gọi câu lệnh xóa và truyền vào struct xóa
  7. Tiếp tới chúng ta có thể ghi dữ liệu vào bằng lện program, vì là ghi kiểu word (32 bit = 4byte). Vậy nên để ghi ô nhớ ngay sau đó, chúng ta sẽ cộng thêm 4 byte cho start page nhé.

stm32 flash write

Đọc dữ liệu từ STM32 Flash

Đọc dữ liệu ra chúng ta chỉ cần truy xuất theo địa chỉ kiểu 32bit.

stm32 flash read

Cuối cùng, trước while (1) hãy thử ghi dữ liệu vào và đọc ra nhé.

Lưu ý: Flash sẽ cần 1 khoảng thời gian xóa và ghi vậy nên chúng ta không nên xóa và ghi liên tục như biến, hãy lưu flash khi có 1 sự kiện gì đó mà thôi.

stm32 flash programing

Kết quả

Nạp và nhấn Debug. Dưới tab Memory chúng ta copy địa chỉ start page. Nhấn Run và xem kết quả.

stm32 flash ket qua

Kết

Lập trình STM32 Flash rất quan trọng, các ứng dụng đa phần đều cần sử dụng flash để lưu trữ dữ liệu. Lập trình với Flash cũng tương đối đơn giản và đễ dàng. Tuy nhiên các bạn không nên xóa và ghi flash quá nhiều lần trong 1 thời gian ngắn, có thể làm sai dữ liệu nhận được.

Nếu cảm thấy bài viết này có ích hãy chia sẻ với bạn bè nhé. Đừng quên ra nhập hội những anh em Nghiện lập trình nhé!!

5/5 - (1 bình chọn)

4 những suy nghĩ trên “Bài 20: Lập trình STM32 Flash đọc, ghi và xóa dữ liệu

  1. Tú Huỳnh nói:

    Tạo biến struct để xóa
    Chọn kiểu xóa theo Page
    Địa chỉ bắt đầu xóa
    Số lượng page cần xoá
    —————————–
    chỗ này ban đầu em đọc 3 dòng cuối hơi lúng túng vì không biết nó ở đâu ra. may là xuống dưới tí có cái ảnh ví dụ em mới : à 3 dòng đó là các biến định nghĩa trong struct xóa của cái dòng ở trên ^^.

  2. Trung nói:

    anh cho em hỏi là tại sao anh dùng 2 page cuối là 126 và 127 mà ko dùng các page đầu như page 1, 2, 3? Em cảm ơn anh

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *