Lập trình STM32 – Flash Memory (STM32F10xxx)
1. Tổng quan
1.1 Chức năng
STM32F10xxx không có EPROM mà chỉ được cung cấp sẵn tối đa 512 Kbytes Flash.
Tổ chức bộ nhớ: gồm 2 phần Main memory block và Information block.
Main memory block:
- 4 Kbits × 64 bits cho low-density devices
- 16 Kbits × 64 bits cho medium-density devices
- 64 Kbits × 64 bits cho high-density devices
- 32 Kbits × 64 bits cho connectivity line devices
Information block:
- 2306 × 64 bits for connectivity line devices
- 258 × 64 bits for other devices
Chức năng của Flash memory interface:
- Read interface với bộ đệm nạp trước (2 × 64-bit words)
- Tùy chọn byte Loader
- Flash / Erase
- Bảo vệ đọc / ghi
- Chế độ năng lượng thấp
1.2 Tổ chức mô-đun Flash
Tổ chức bộ nhớ dựa trên khối bộ nhớ chính chứa 32 pages 1 Kbyte (dành cho thiết bị mật độ thấp), 128 pages 1 Kbyte (dành cho thiết bị mật độ trung bình), 128 pages 2 Kbyte (dành cho thiết bị đường truyền kết nối) hoặc 256 pages 2 Kbyte (dành cho thiết bị mật độ cao), và một khối thông tin.
Note: STM32F103C8T6 là một medium-density devices –> Hình 2





Bộ nhớ Flash được tổ chức thành các ô nhớ rộng 32 bit có thể được sử dụng để lưu trữ cả code and data constants. Mô-đun Flash nằm ở một địa chỉ cơ sở cụ thể trong bản đồ bộ nhớ của mỗi loại vi điều khiển STM32F10xxx. Để biết địa chỉ cơ sở, vui lòng tham khảo hướng dẫn tham khảo STM32F10xxx có liên quan.
Khối thông tin được chia thành hai phần:
- Bộ nhớ hệ thống (System memory) được sử dụng để khởi động thiết bị ở chế độ khởi động bộ nhớ hệ thống (System memory boot mode). Khu vực này được dành riêng cho STMicroelectronics sử dụng và chứa boot loader được sử dụng để lập trình lại bộ nhớ Flash bằng USART1. Bộ nhớ này được ST lập trình khi thiết bị được sản xuất và được bảo vệ chống lại các hoạt động ghi/xóa không mong muốn. Để biết thêm chi tiết, vui lòng tham khảo document AN2606.
- Option bytes: Các hoạt động ghi vào khối bộ nhớ chính và các byte tùy chọn được quản lý bởiFlash Program/Erase Controller (FPEC). Điện áp cao cần thiết cho các hoạt động Program/Erase được tạo ra bên trong.
Bộ nhớ Flash chính (main Flash memory) có thể được bảo vệ chống lại các loại truy cập không mong muốn khác nhau (read/write/erase). Có hai loại bảo vệ:
- Bảo vệ ghi trang (Page Write Protection)
- Bảo vệ đọc (Read Protection)
Trong quá trình ghi vào bộ nhớ Flash, bất kỳ nỗ lực nào để đọc bộ nhớ Flash sẽ làm dừng bus. Hoạt động đọc sẽ diễn ra chính xác sau khi hoạt động ghi hoàn tất. Điều này có nghĩa là không thể thực hiện việc lấy mã hoặc dữ liệu trong khi hoạt động ghi/xóa đang diễn ra.
Đối với các hoạt động ghi và xóa trên bộ nhớ Flash (ghi/xóa), bộ dao động RC bên trong (HSI) phải được BẬT.
Lưu ý: Ở chế độ công suất thấp (low-power modes), tất cả các truy cập bộ nhớ Flash đều bị hủy bỏ.
2. Thao tác đọc (Reading Flash memory)
Mô-đun Flash nhúng có thể được truy cập trực tiếp, như một không gian bộ nhớ chung. Bất kỳ hoạt động đọc dữ liệu nào cũng truy cập nội dung của mô-đun Flash thông qua các giác quan đọc chuyên dụng (dedicated read senses) và cung cấp dữ liệu được yêu cầu.
Read interface bao gồm một bộ điều khiển đọc (read controller) ở một bên để truy cập bộ nhớ Flash và một AHB interface ở bên kia để giao tiếp với CPU. Nhiệm vụ chính của read interface là tạo ra các tín hiệu điều khiển để đọc từ bộ nhớ Flash và nạp trước các khối mà CPU yêu cầu. Khối nạp trước (prefetch block) chỉ được sử dụng để nạp lệnh qua bus I-Code. Literal pool được truy cập qua bus D-Code. Vì hai bus này có cùng bộ nhớ Flash với mục tiêu, nên các truy cập bus D-code được ưu tiên hơn các truy cập nạp trước (prefetch accesses)
2.1 Tìm nạp lệnh (Instruction fetch)
Cortex-M3 lấy lệnh qua bus I-Code và literal pool (constant/data) qua bus D-code. prefetch block nhằm mục đích tăng hiệu quả truy cập bus I-Code.
2.1.1 Prefetch buffer
prefetch buffer có 2 block, mỗi block gồm 8 byte. Các prefetch blocks được ánh xạ trực tiếp. Một block có thể được thay thế hoàn toàn trong một lần đọc duy nhất vào bộ nhớ Flash vì kích thước của block khớp với băng thông của bộ nhớ Flash.
Việc triển khai bộ đệm prefetch này giúp CPU thực thi nhanh hơn khi CPU lấy từng word một với word tiếp theo có sẵn trong prefetch buffer.
2.1.2 Prefetch controller
Bộ điều khiển prefetch quyết định truy cập bộ nhớ Flash tùy thuộc vào không gian có sẵn trong bộ đệm prefetch. Bộ điều khiển khởi tạo yêu cầu đọc khi có ít nhất một khối trống trong bộ đệm prefetch.
Sau khi reset, trạng thái của bộ đệm nạp trước sẽ được bật.
2.2 Flash program and erase controller (FPEC)
Khối FPEC xử lý các hoạt động Flash program and erase controller của bộ nhớ Flash. FPEC bao gồm bảy thanh ghi 32 bit.
- FPEC key register (FLASH_KEYR)
- Option byte key register (FLASH_OPTKEYR)
- Flash control register (FLASH_CR)
- Flash status register (FLASH_SR)
- Flash address register (FLASH_AR)
- Option byte register (FLASH_OBR)
- Write protection register (FLASH_WRPR)
2.2.1 Key values
The key values are as follows:
- RDPRT key = 0x00A5
- KEY1 = 0x45670123
- KEY2 = 0xCDEF89AB
2.3 Mở khóa bộ nhớ Flash (Unlocking the Flash memory)
Sau khi thiết lập lại, khối FPEC được bảo vệ. Thanh ghi FLASH_CR không thể truy cập được ở chế độ ghi. Một trình tự mở khóa phải được ghi vào thanh ghi FLASH_KEYR để mở khối FPEC.
Trình tự này bao gồm hai write cycles, trong đó hai giá trị khóa (KEY1 và KEY2) được ghi vào địa chỉ FLASH_KEYR.
Bất kỳ trình tự sai nào cũng sẽ khóa khối FPEC và thanh ghi FLASH_CR cho đến lần thiết lập lại tiếp theo.
2.4 Ghi bộ nhớ Flash (Main Flash memory programming)
Bộ nhớ Main Flash có thể được lập trình 16 bit cùng một lúc. Hoạt động chương trình được bắt đầu khi CPU ghi a half-word vào địa chỉ bộ nhớ Main Flash với bit PG của thanh ghi FLASH_CR được set. Bất kỳ nỗ lực nào để ghi dữ liệu không dài bằng a half-word sẽ dẫn đến phản hồi lỗi bus từ FPEC. Nếu một hoạt động đọc/ghi được khởi tạo trong khi programming (bit BSY được set), CPU sẽ dừng lại cho đến khi quá trình Flash kết thúc.

Bước 1: kiểm tra cờ FLASH_CR_LOCK của Flash, nếu Cờ này đang được bật, Flash đang ở chế độ Lock và cần phải được Unlock trước khi sử dụng.
Bước 2: Sau khi xác nhận đã Unlock, Cờ FLASH_CR_PG được set lên 1.
Bước 3: Ghi dữ liệu (a half-word)vào địa chỉ tương ứng sẽ được thực thi.
Bước 4: Kiểm tra cờ FLASH_SR_BSY để đợi quá trình ghi hoàn tất.
Bước 5: Đọc giá trị đã flash và xác minh.
2.5 Xóa bộ nhớ Flash

Bước 1: kiểm tra cờ FLASH_CR_LOCK của Flash, nếu Cờ này đang được bật, Flash đang ở chế độ Lock và cần phải được Unlock trước khi sử dụng.
Bước 2: Sau khi xác nhận đã Unlock, Cờ FLASH_CR_PER được set lên 1.
Bước 3: Ghi địa chỉ của Page cần xóa được ghi vào FAR.
Bước 4: Set FLASH_CR_STRT lên 1.
Bước 5: Kiểm tra cờ FLASH_SR_BSY để đợi quá trình ghi hoàn tất.
Bước 6: Đọc giá trị đã flash và xác minh.
3. Ví dụ
1. Create new STM32 F103C8T6 project



2. Create main file



3. Memory value

