🌱 STM32 - 20. Giới thiệu CMSIS và lý do cần có CMSIS
Các vi điều khiển dựa trên nền tảng ARM Cortex-M3/M4/M7 ngày càng phổ biến. Tuy nhiên, khi bắt đầu học hoặc làm việc với các vi điều khiển khác nhau, việc lựa chọn dòng sản phẩm phù hợp và chuyển đổi giữa chúng có thể gây ra nhiều khó khăn.
Để khắc phục vấn đề này, ARM đã giới thiệu Cortex Microcontroller Software Interface Standard (CMSIS), giúp đơn giản hóa quá trình phát triển phần mềm và tăng khả năng tái sử dụng mã nguồn. CMSIS giúp việc tương thích phần mềm giữa các vi điều khiển ARM trở nên dễ dàng hơn, từ đó hỗ trợ người học và các kỹ sư trong việc phát triển ứng dụng.
👉 Tại sao cần có CMSIS?
Khi làm việc với các ứng dụng vi điều khiển, mỗi lần có thiết bị mới, lập trình viên thường phải viết lại phần mềm điều khiển để tương thích. Ví dụ, khi chuyển từ STM32F1 lên STM32F4, bạn sẽ cần thay đổi đáng kể mã nguồn nếu không có sự chuẩn hóa.
➤ Điều này làm tăng thời gian phát triển cũng như rủi ro và giá thành của dự án.
Để khắc phục vấn đề này, các nhà sản xuất chip đã hợp tác cung cấp một khung giao diện phần mềm chuẩn miễn phí, giúp tiết kiệm thời gian và chi phí. CMSIS (Common Microcontroller Software Interface Standard) ra đời với mục tiêu giúp việc tái sử dụng mã nguồn, rút ngắn thời gian phát triển phần mềm, và giảm thiểu thời gian làm quen với các thiết bị phần cứng mới.
👉 CMSIS là viết tắt của Common Microcontroller Software Interface Standard. CMSIS là một lớp trừu tượng độc lập dành cho vi điều khiển, được xây dựng dựa trên vi xử lý ARM Cortex. Các công dụng chính của CMSIS mang lại:
- Đơn giản hóa việc tái sử dụng phần mềm.
- Giảm thời gian học tập cho người học và làm.
- Giảm thời gian tiếp cận với các thiết bị phần cứng mới.
👉 Cấu trúc CMSIS
Cấu trúc CMSIS được mô tả dưới hình sau:
CMSIS được chia thành nhiều lớp, giúp tương tác trực tiếp với phần cứng mà không cần phụ thuộc vào từng dòng vi điều khiển cụ thể. Dưới đây là mô tả chi tiết về cấu trúc CMSIS:
- Peripheral Access Layer (CMSIS-PAL)
- Cung cấp các định nghĩa tên, địa chỉ và các hàm truy cập thanh ghi cho Core và thiết bị ngoại vi.
- Định nghĩa các hàm xử lý ngoại lệ (exception) và ngắt (interrupt).
- Cung cấp các hàm khởi động, thiết lập hệ thống ban đầu như SystemInit().
- Middleware Access Layer (CMSIS-MAL)
- Cung cấp các phương thức truy cập thiết bị ngoại vi từ các lớp ứng dụng cao hơn.
- Được phát triển bởi các nhà cung cấp phần mềm như IAR, Keil, Micrium, Segger,... và nhiều nhà sản xuất khác.
➤ Các bạn có thể tham khảo Tài liệu hỗ trợ CMSIS tại đây!
👉 Cấu trúc các file trong CMSIS
➤ Dưới đây là các file chính mà bạn thường gặp trong thư viện CMSIS:
core_cm3.h
/core_cm4.h
/core_cm7.h
- Cung cấp các định nghĩa và hàm chung cho các dòng Cortex-M.
- Các API phổ biến như
__NVIC_EnableIRQ()
,__NVIC_DisableIRQ()
, v.v.
system_<device>.h
/system_<device>.c
- Chứa các hàm khởi tạo hệ thống, định nghĩa cho từng dòng chip cụ thể (ví dụ:
system_stm32f1xx.h
,system_stm32f4xx.h
). - Các hàm như
SystemInit()
,SystemCoreClockUpdate()
, v.v.
- Chứa các hàm khởi tạo hệ thống, định nghĩa cho từng dòng chip cụ thể (ví dụ:
<device>.h
- Đây là file chính đại diện cho dòng chip cụ thể (ví dụ:
STM32F4xx.h
). - File này thường include tất cả các file còn lại.
- Đây là file chính đại diện cho dòng chip cụ thể (ví dụ:
👉 Các thành phần chính trong CMSIS
CMSIS được chia thành nhiều thư viện khác nhau, mỗi thư viện đảm nhận một nhiệm vụ cụ thể. Dưới đây là các thư viện chính trong CMSIS:
1. CMSIS-Core
- Thư viện này cung cấp các định nghĩa cho các thanh ghi lõi (core registers), các hàm liên quan đến quản lý ngắt (NVIC), các cấu hình bảo vệ bộ nhớ (MPU), và các hàm khởi động hệ thống.
- CMSIS-Core bao gồm các file như
core_cm3.h
,core_cm4.h
,core_cm7.h
cho các dòng Cortex-M3, M4, và M7 tương ứng.
Các API chính:
- Quản lý ngắt: Các hàm như
__NVIC_EnableIRQ()
,__NVIC_DisableIRQ()
- Quản lý bộ nhớ: Sử dụng MPU (Memory Protection Unit) để bảo vệ các vùng bộ nhớ.
- Kiểm tra trạng thái hệ thống: Các hàm như
__get_CONTROL()
,__get_PSP()
.
2. CMSIS-Driver
- CMSIS-Driver cung cấp các interface chuẩn cho các thiết bị ngoại vi như UART, SPI, I2C, Ethernet, USB, v.v.
- Nó giúp tăng khả năng tương thích giữa các thiết bị ngoại vi của các nhà sản xuất khác nhau, giúp dễ dàng tái sử dụng mã nguồn.
Các lớp driver phổ biến: USART Driver, SPI Driver, I2C Driver, Ethernet Driver, USB Driver.
Ví dụ:
- #include "Driver_USART.h"
- extern ARM_DRIVER_USART Driver_USART1;
- void initUART(void) {
- Driver_USART1.Initialize(NULL);
- Driver_USART1.PowerControl(ARM_POWER_FULL);
- Driver_USART1.Control(ARM_USART_MODE_ASYNCHRONOUS, 115200);
- Driver_USART1.Control(ARM_USART_CONTROL_TX, 1);
- }
3. CMSIS-DSP
- CMSIS-DSP là một thư viện xử lý tín hiệu số (Digital Signal Processing) với các hàm toán học tối ưu cho các vi điều khiển Cortex-M.
- Các hàm này được tối ưu hóa cho các phép toán sử dụng số nguyên, số thực, và các thuật toán xử lý tín hiệu.
- Một ví dụ về phần này là tối ưu hóa SIMD trên các vi điều khiển lõi ARM
Các API chính:
- Xử lý tín hiệu: FFT (Fast Fourier Transform), FIR (Finite Impulse Response), IIR (Infinite Impulse Response).
- Phép toán ma trận: Nhân, cộng, chuyển vị ma trận.
- Bộ lọc tín hiệu: Low-pass, high-pass, band-pass filters.
- Các hàm toán học: Sine, cosine, sqrt, log, exp.
Ví dụ:
- #include "arm_math.h"
- #define BLOCK_SIZE 32
- float32_t inputSignal[BLOCK_SIZE] = { /* Input Signal Data */ };
- float32_t outputSignal[BLOCK_SIZE];
- void processFFT(void) {
- arm_rfft_fast_instance_f32 S;
- arm_rfft_fast_init_f32(&S, BLOCK_SIZE);
- arm_rfft_fast_f32(&S, inputSignal, outputSignal, 0);
- }
4. CMSIS-RTOS API
- CMSIS-RTOS API cung cấp một lớp trừu tượng cho các hệ điều hành thời gian thực (RTOS) như FreeRTOS, Keil RTX.
- Nó giúp bạn chuyển đổi giữa các RTOS khác nhau mà không cần thay đổi code Application.
Các API chính:
- Quản lý Task: Tạo, xóa, quản lý các task.
- Quản lý Semaphore, Mutex: Đồng bộ hóa giữa các task.
- Quản lý Timer: Tạo các timer phần mềm.
- Message Queue và Event: Giao tiếp giữa các task.
Ví dụ:
- #include "cmsis_os2.h"
- void ledTask(void *argument) {
- while (1) {
- // Bật LED
- osDelay(1000); // Dừng 1 giây
- // Tắt LED
- osDelay(1000); // Dừng 1 giây
- }
- }
- int main(void) {
- osKernelInitialize();
- osThreadNew(ledTask, NULL, NULL);
- osKernelStart();
- while (1);
- }
5. CMSIS-Pack
- CMSIS-Pack cung cấp cơ chế phân phối các gói phần mềm cho các vi điều khiển lõi ARM.
- Các gói phần mềm này bao gồm các file cấu hình, thư viện, ví dụ mẫu, và các tài liệu hướng dẫn, giúp bạn dễ dàng cài đặt và quản lý.
Các tính năng chính:
- Dễ dàng cài đặt và cập nhật: Thông qua các công cụ như Keil µVision hoặc ARM Development Studio.
- Tích hợp hệ sinh thái: Các gói phần mềm được phát triển và cung cấp bởi các nhà sản xuất chip, đảm bảo tính tương thích.
>>>>>> Follow ngay <<<<<<<
Để nhận được những bài học miễn phí mới nhất nhé 😊
Chúc các bạn học tập tốt 😊