Site icon TAPIT

Tổ chức bộ nhớ vi điều khiển lõi ARM Cortex M3/4 – Áp dụng FOTA cho STM32

Thiết kế của vi xử lý ARM Cortex M3/4 định nghĩa và phân chia các vùng nhớ khác nhau trong không gian bộ nhớ của vi xử lý. Sau đó, các hãng vi điều khiển như STMicroelectronics sẽ thiết kế các bộ nhớ khác nhau của họ như bộ nhớ FLASH, bộ nhớ SRAM và các ngoại vi khác nhau như ADC, TIMER, USB… vào các vùng nhớ tương ứng với không gian bộ nhớ của vi xử lý. Theo thiết kế của ARM, tất cả các vi xử lý ARM Cortex – M3/4 đều có 32bit địa chỉ bộ nhớ, điều này nghĩa là không gian bộ nhớ tối đa có thể lên đến 4 Gigabyte (GB). Toàn bộ 4GB không gian bộ nhớ được đánh địa chỉ liên tục và được chia thành một số vùng khác nhau. Vùng code là vùng bắt đầu với địa chỉ 0x0000_0000, Sau đó là vùng nhớ dữ liệu SRAM, vùng ngoại vi (Peripheral), và các vùng nhớ khác như External RAM, External Device, Private peripheral bus internal và external, và phần System. Bản đồ bộ nhớ (Memory Map) sẽ chỉ cho người sử dụng biết được tại những vị trí nào của bộ nhớ được dùng để chứa code và vị trí nào của bộ nhớ chứa dữ liệu hay địa chỉ nào của bộ nhớ mà họ có thể truy cập vào các ngoại vi của vi điều khiển

Hình 1. Bản đồ bộ nhớ của Vi xử lý ARM Cortex M4

1. Tổ chức bộ nhớ chương trình
Theo thiết kế của các vi xử lý lõi ARM Cortex M, vùng bộ nhớ chương trình có độ rộng 32 bit và bắt đầu từ địa chỉ 0x0000_0000, tối đa đến địa chỉ 0x1FFF_FFFF, tại địa chỉ 0x0000_0000 sẽ chứa giá trị khởi tạo stack pointer, bảng vector chứa địa chỉ của các exception handler và phần lớn còn lại của vùng này sẽ chứa mã máy của chương trình . Tổng cộng, vùng code có kích thước 512 MB. Các nhà sản xuất vi điều khiển có thể thiết kế vào đây 1 bộ nhớ Flash hoặc bộ nhớ ROM với kích cỡ tối đa là 512MB vào vùng nhớ này. Tuy nhiên thường thì dung lượng 512MB như vậy thì rất lớn, và các nhà sản xuất vi điều khiển sẽ giới hạn bộ nhớ code của họ lại khoảng bé hơn 2MB. Ví dụ như vi điều khiển STM32F411VET6 mình đang sử dụng để làm các đề tài có 512Kbyte bộ nhớ Code.

Hình 2. Vùng bộ nhớ chương trình

Hãng STMicroelectronics thiết kế sử dụng bộ nhớ Flash cho vùng nhớ code của vi điều khiển STM32 và họ thường chia vùng code này làm hai khối chính, khối bộ nhớ chính (main memory) và khối thông tin của nhà sản xuất (information memory).

 

ARM quy định bộ nhớ chương trình được đánh địa chỉ liên tục và bắt đầu từ địa chỉ 0x0000_0000, tuy nhiên các nhà sản xuất vi điều khiển có thể đánh địa chỉ bộ nhớ chương trình từ một địa chỉ cơ sở và sử dụng bí danh (memory aliasing) để nối địa chỉ cơ sở với địa chỉ 0x0000_0000. Ví dụ với các dòng STM32 thì địa chỉ cơ sở là 0x0800_0000.

Hình 3. Tổng quan về tổ chức bộ nhớ chương trình

Các hoạt động với bộ nhớ chương trình:

[KHÓA HỌC ONLINE DO TAPIT THIẾT KẾ: LẬP TRÌNH VI ĐIỀU KHIỂN STM32, VI XỬ LÝ ARM CORTEX – M]

2.Tổ chức bộ nhớ dữ liệu
Vùng bộ nhớ dữ liệu SRAM hay có thể gọi đơn giản là vùng RAM, thường nằm ngay sau vùng bộ nhớ chương trình. SRAM được sử dụng để truy xuất dữ liệu và stack.
Trong quá trình cập nhật chương trình từ xa (FOTA), mỗi khi thiết bị nhúng nhận được một gói tin chứa một phần nội dung của tập tin chương trình ứng dụng từ máy chủ quản lý tập tin thì gói tin này sẽ được lưu ở bộ nhớ dữ liệu (RAM) trước khi được ghi vào bộ nhớ chương trình (Flash).

Tùy thuộc vào tài nguyên phần cứng và thuật toán thiết kế, việc lưu trữ tạm thời chương trình mới vào bộ nhớ RAM có thể được phân làm ba loại sau [1]:

Hình 4. Tổ chức bộ nhớ dữ liệu

Tìm hiểu thêm:
Xem thêm Tổng hợp các bài hướng dẫn Lập trình vi điều khiển STM32 tại đây.
Xem thêm Tổng hợp hướng dẫn Internet of Things với NodeMCU ESP8266 và ESP32 tại đây.

Tài liệu tham khảo:
[1] Brown, Benjamin Bucklin. “Over-the-Air (OTA) Updates in Embedded Microcontroller Applications: Design Trade-Offs and Lessons Learned.“, Analog Devices, 2018.

Thuong Nguyen
Chúc các bạn thành công!