🌱 Core 8. Ngắt và bộ quản lý ngắt NVIC
Ngắt là một kỹ thuật thiết kế chương trình rất quan trọng trong lập trình Nhúng. Ngoài việc để chương trình chạy liên tục trong một vòng while(1) (kiểu polling), thì với những chương trình lớn, việc các sự kiện quan trọng không thể chờ đợi những sự kiện khác, thì việc sử dụng các ngắt là rất quan trọng.
Trong vi điều khiển STM32 hỗ trợ lên đến trên 200 ngắt khác nhau (240), chúng hoàn toàn có thể xảy ra cùng lúc, lồng nhau, ... Vì vậy, giống như một công ty hơn 200 nhân viên, chúng ta cần một nhà quản lý - đối với ngắt là NVIC - Nested Vector Interrupt Controller (Bộ điều khiển các vector ngắt lồng nhau).
👉 NVIC là gì?
NVIC - Nested Vector Interrupt Controller, là bộ điều khiển vector ngắt lồng nhau, nó là một ngoại vi của Core Cortex Mx. NVIC được sử dụng để cấu hình 240 interrupts: External, SPI, CAN, DMA, … Số lượng ngắt này là do nhà sản xuất Vi điều khiển quyết định. (Ví dụ TI chỉ dùng 154 interrupts cho TIVA MCU, trong khi ST chỉ dùng 83 interrupts cho dòng STM32F401xx).
- Sử dụng bộ thanh ghi NVIC để Enable/Disable/Pend các ngắt khác nhau và đọc trạng thái các hoạt động & pending interrupts.
- Tên gọi “Nested” – Tức là các ngắt lồng nhau xảy ra, bộ xử lý sẽ tạm thời dừng việc thực thi interrupt handler có mức ưu tiên thấp hơn khi một interrupt handler có mức độ ưu tiên cao hơn xảy ra.
- Bạn có thể cấu hình mức độ ưu tiên và phân nhóm ưu tiên.
👉 Bộ thanh ghi NVIC
💬 ISER - Interrupt Set-Enable Registers
Có 8 thanh ghi để kích hoạt ngắt – dành cho 240 ngắt khác nhau. NVIC_ISER0 => NVIC_ISER7. Mỗi thanh ghi có kích thước là 32 bits => Mỗi thanh ghi có thể kích hoạt 32 ngắt khác nhau.
💬 ICER - Interrupt Clear-Enable Registers
Có 8 thanh ghi để kích hoạt ngắt – dành cho 240 ngắt khác nhau. NVIC_ICER0 => NVIC_ICER7. Mỗi thanh ghi có kích thước là 32 bits => Mỗi thanh ghi có thể tắt 32 ngắt khác nhau.
💬 ISPR - Interrupt Set-Pending Registers
Có 8 thanh ghi để kích hoạt ngắt – dành cho 240 ngắt khác nhau. NVIC_ISPR0 => NVIC_ISPR7, dùng để buộc ngắt vào trạng thái chờ xử lý. Bộ xử lý sẽ kiểm tra mức độ ưu tiên của các ngắt đang chờ xử lý để lần lượt thực thi chúng.
💬 ICPR - Interrupt Clear-Pending Registers
Có 8 thanh ghi để kích hoạt ngắt – dành cho 240 ngắt khác nhau. NVIC_ICPR0 => NVIC_ICPR7, dùng để loại bỏ trạng thái chờ xử lý. Đọc nó để xem ngắt nào đang chờ xử lý.
💬 IABR - Interrupt Active Bit Registers
Có 8 thanh ghi, NVIC_IABR0 => NVIC_IABR7, biểu thị cho việc ngắt hoạt động hay không.
💬 IPR - Interrupt Priority Registers
NVIC_IPR0 => NVIC_IPR59 cung cấp một trường ưu tiên 8-bit cho mỗi ngắt và mỗi thanh ghi giữ 4 trường ưu tiên này. Các thanh ghi này có thể truy cập từng byte.
👉 Cách hoạt động của NVIC với ngắt
Mỗi ngắt trong vi điều khiển được đại diện bằng một IRQ number.
- Khi có sự kiện ngắt xảy ra, ngoại vi sẽ kích hoạt một tín hiệu ngắt trên đường IRQ này.
- NVIC sẽ đặt nó và trạng thái chờ - pending.
- Bộ NVIC sẽ lần lượt thực hiện các pending interrupts, tùy thuộc vào mức ưu tiên.
- Khi đến lượt của một interrupt (IRQ Enable = 1), NVIC sẽ gửi tín hiệu ngắt đến CPU.
- CPU tiếp nhận tín hiệu ngắt từ NVIC nếu ngắt tới có mức độ ưu tiên cao hơn ISR đang hoạt động.
- Khi ngắt tới được CPU chấp nhận, CPU sẽ lấy địa chỉ chương trình con phục vụ ngắt - ISR tương ứng với IRQ number từ bảng vector ngắt (Vector Table). Sau đó thực thi ISR đó.
Việc nắm được cách hoạt động của ngắt và ngoại vi NVIC là rất quan trọng khi thiết kế chương trình với ngắt.
>>>= Follow ngay =<<<
Để theo dõi 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 😊
0 Nhận xét