ARM Cortex – Mx là vi xử lý được sử dụng phổ biến nhất hiện nay trong lĩnh vực hệ thống nhúng. Việc hiểu được cơ bản về kiến trúc và một số tính năng quan trọng của vi xử lý ARM Cortex Mx sẽ hỗ trợ cho các bạn rất nhiều trong việc phát triển ứng dụng nhúng, nhất là quá trình Debug. 

I. Các chế độ hoạt động

Vi xử lý ARM Cortex-Mx hoạt động ở 2 chế độ:

  1. Thread mode: Tất cả các code chương trình mà bạn viết trong main() sẽ được thực thi dưới chế độ Thread mode của vi xử lý. Chế độ này còn được gọi là “user mode.” Mặc định, vi xử lý luôn bắt đầu ở chế độ Thread mode.
  2. Handler mode: Tất cả các xử lý System Exception và Interrupt sẽ được thực thi dưới chế độ Handler mode của vi xử lý. Bất cứ khi nào vi xử lý gặp System Exception hoặc Interrupt đến từ bất cứ ngoại vi nào, thì vi xử lý sẽ ngay lập tức chuyển từ Thread mode thành Handler mode và trình phục vụ tương ứng sẽ được thực thi ở Handle mode.

II. Các thanh ghi của vi xử lý

Nếu chương trình vi điều khiển được viết bằng ngôn ngữ bật cao như C thì việc hiểu chi tiết các thanh ghi của vi xử lý không thật sự quan trọng. Vì ARM hỗ trợ CMSIS và hiện nay nhà sản suất cũng sẽ hỗ trợ các thư viện để lập trình vi điều khiển của họ thông qua các API. Tuy nhiên, việc nắm được chức năng của một số thanh lại cần thiết trong 1 số trường hợp như debug.

Nội dung của phần này sẽ thảo luận về một số thanh ghi của Vi xử lý ARM Cortex M4. Tham khảo tại mục Core registers trong tài liệu Cortex ™ -M4 Devices Generic User Guide được tải về từ http://infocenter.arm.com/

  • Các thanh ghi từ R0 đến R12 (13 thanh ghi) là những thanh ghi được sử dụng với nhiều mục đích chung như lưu trữ dữ liệu của các phép tính toán, lưu trữ địa chỉ… Tất cả những thanh ghi này đều có độ rộng 32bit.
  • 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ó 2 thêm 2 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 R14 được gọi là Link Register (LR). Nó lưu thông tin của subroutines, function call và exceptions.
  • 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.
  • Ngoài các thanh ghi được sử dụng với nhiều mục đích chung (R0-R12), SP, LR, PC thì vi xử lý ARM Cortex-M4 còn có 5 thanh ghi đặc biệt. Trong đó, thanh ghi Program status (PSR) bao gồm các thanh ghi cung cấp thông tin trạng thái của chương trình Application với các cờ N,Z,C,V,Q, chương trình Interrupt và các thanh ghi liên quan đến stack của vi xử lý. Những thanh ghi còn lại, các bạn tìm đọc trong tài liệu đã được đề cập đến ở phần trên.

 

III. Bus Interface

  • Vi xử lý ARM Cortex – M sử dụng kiến trúc bus Harvard, điều này có nghĩa là nó có bus chuyên dụng dành cho việc lấy lệnh (instruction fetch) và lấy dữ liệu (data fetch). Ưu điểm của kiến trúc này là trong khi fetch instruction thì vi xử lý có thể fetch data một cách đồng thời, điều này làm tăng hiệu năng của vi xử lý, vi xử lý không cần phải đợi cho đến khi data được fetch trước khi nó muốn lấy instruction tiếp theo và ngược lại. Vi xử lý ARM Cortex cung cấp các BUS như I-BUS, D-BUS và S-BUS để giao tiếp với phần còn lại của vi điều khiển. 

IV. Trình tự khởi động

  • Để khởi động lại, chúng ta cần gửi 1 tín hiệu reset đến vi xử lý của vi điều khiển. Từ bên ngoài, có 2 cách để tạo tín hiệu reset, hoặc là nhấn nút Reset trên board mạch hoặc là khi cấp nguồn cho board mạch thì vi điều khiển cũng Reset (Power on Reset).
  • Điều đầu tiên khi vi điều khiển bị reset đó 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 đại chỉ bộ nhớ chương trình 0x0000 0000 và nạp cho thanh ghi Main Stack Pointer (MSP = value@0x0000 0000). Bộ nhớ này có thể là FLASH hoặc RAM.
  • 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 việc 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ý.
  • Thiết kếMemory aliasing (sử dụng bí danh) cho phép vị trí bắt đầu của bộ nhớ chương trình của vi điều khiển có thể khác 0x0000 0000. Ví dụ như bộ nhớ chương trình của các vi điều khiển STM32 bắt đầu từ 0x0800 0000.

Một số nội dung khác sẽ được mình tiếp tục hoàn thiện và chia sẻ!
Theo dõi thêm:
– Phân biệt các khái niệm Processor Core, Processor và Microcontroller trong Hệ thống nhúng tại đây.
– Tổng hợp các bài hướng dẫn Lập trình vi điều khiển STM32F1 tại đây.
– Tổng hợp hướng dẫn Lập trình vi điều khiển STM32F4 tại đây.

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

Cơ bản về cấu trúc và tính năng Vi xử lý ARM Cortex – Mx
Facebook Comments: