Vi xử lý ARM Cortex M3/4 và Quá trình khởi động của vi điều khiển STM32

Dòng vi xử lý ARM Cortex M3/4 là một dòng vi xử lý được thiết kế tối ưu cho giá thành và năng lượng tiêu thụ của vi điều khiển, được sử dụng trong rất nhiều ứng dụng nhúng khác nhau. Trong bài viết này, mình sẽ cung cấp một số thông tin về Vi xử lý ARM Cortex M, quá trình khởi động của các vi điều khiển được thiết kế dựa trên vi xử lý này và việc áp dụng các kiến thức trên để thiết kế tính năng cập nhật chương trình từ xa.

1.Vi xử lý ARM Cortex M3/4
Vi xử lý ARM Cortex-M bao gồm một lõi vi xử lý, và nhiều ngoại vi chuyên dụng xung quanh như NVIC, System Control Block, Flash Patch Breakpoint, Memory protection, Data watchpoint and trace, Bus Matrix,… Lõi vi xử lý bao gồm ALU (Arithmetic Logic Unit), nơi thực hiện các phép tính toán số học, phép toán logic và đưa ra kết quả. Nó cũng bao gồm một bộ giải mã và thực thi lệnh, nó lấy lệnh từ bộ nhớ chương trình và kiểm tra xem câu lệnh có hợp lệ hay không và thực thi lệnh. Lõi vi xử lý được thiết kế theo kỹ thuật pipeline để tăng tốc độ thực thi lệnh. Bên trong lõi vi xử lý cũng có một số thanh ghi được thiết kế để lưu trữ dữ liệu và một số thanh ghi chức năng [1]. Trong đó có hai thanh ghi quan trọng có liên quan đến quá trình khởi động của vi điều khiển là:

  • Thanh ghi R13 được gọi là StackPointer (SP). Thanh ghi này được sử dụng để theo dõi bộ nhớ stack. Và bên cạnh thanh ghi R13, có thêm hai thanh ghi nữa được chỉ ra trên hình là PSP (Processor Stack Pointer) và MSP (Main Stack pointer), những thanh ghi này được gọi là Banked version of SP.
  • Thanh ghi R15 là thanh ghi Program Counter (PC). Thanh ghi này chứa địa chỉ câu lệnh sẽ được thực thi. Khi reset, vi xử lý sẽ nạp thanh ghi PC với giá trị reset là 0x00000004.


Hình 1. Các thanh ghi của Vi xử lý ARM Cortex – M4

Tại khối System Control Block trong vi xử  lý có một thanh ghi chứa giá trị offset của bảng vector ngắt là Vector table offset register (VTOR). Thanh ghi này sẽ chứa địa chỉ bắt đầu của bảng vector, cũng chính là địa chỉ bắt đầu của chương trình trong bộ nhớ, giá trị mặc định  là 0x0000 0000. Khi vi xử lý thực thi một chương trình được lưu tại một địa chỉ khác với địa chỉ mặc định thì người dùng phải tiến hành cài đặt lại giá trị offset này có thể sử dụng được các System Exception và các Interrupt của 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. Quá trình khởi động của vi điều khiển
Mỗi khi thiết bị được cấp nguồn, hoặc khi người dùng nhấn nút khởi động lại trên thiết bị hoặc khi chương trình ứng dụng phát hiện có phiên bản cập nhật mới thì vi điều khiển sẽ thực hiện khởi động lại.

Việc đầu tiên khi vi điều khiển khởi động đó là thanh ghi Program Counter (PC) sẽ được nạp giá trị 0x0000_0000. Tiếp theo vi xử lý sẽ khởi tạo Stack Pointer bằng cách đọc giá trị bộ nhớ tại địa chỉ bộ nhớ chương trình 0x0000_0000 và nạp cho thanh ghi Main Stack Pointer. Sau đó vi xử lý sẽ đọc giá trị bộ nhớ tại địa chỉ 0x0000_0004 để nạp cho thanh ghi PC. Giá trị đọc được chính là địa chỉ của Reset_Handler. Lúc này PC nhảy tới Reset_Handler. Reset_Handler có chức năng thực hiện một số khởi tạo và từ Reset_Handler sẽ gọi hàm main() của chương trình. Đó là cách mà hàm main() được thực khi mỗi khi reset vi xử lý [2].

Hình 2. Cấu trúc một chương trình trong bộ nhớ vi điều khiển

3. Thiết kế tính năng Cập nhật chương trình từ xa 
Trong các chương trình nằm trong bộ nhớ của vi điều khiển thì Bootloader tự phát triển nằm tại vị trí bắt đầu của bộ nhớ flash, nên mỗi khi vi điều khiển khởi động thì các giá trị khởi tạo MSP và địa chỉ Reset_Handler được tự động nạp lên các thanh ghi MSP, PC của vi xử lý một cách chính xác để Bootloader có thể thực thi được. Tuy nhiên, chương trình thực hiện Cập nhật chương trình từ xa và chương trình ứng dụng thì được bố trí nằm ở các vị trí khác của bộ nhớ Flash nên để vi xử lý có thể thực thi được một trong các chương trình này mỗi khi khởi động thì nội dung chương trình của Bootloader phải thực hiện nạp giá trị Main Stack Pointer và giá trị của thanh ghi PC tương ứng với chương trình mong muốn thực thi để điều khiển vi xử lý nhảy đến và thực thi chương trình này.

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] ARM, Arm Cortex-M4 Processor Technical Reference Manual, https://developer.arm.com/
[2] Noviello, Carmine. “Mastering STM32.” A step-by-step guide to the most complete ARM Cortex-M platform, using a free and powerful development environment based on Eclipse and GCC. Leadpub (2017).

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