Lập trình STM32F103 thanh ghi – Cấu hình NVIC trong STM32F103

Trong thế giới lập trình STM32F103 thanh ghi, NVIC (Nested Vectored Interrupt Controller) là một thành phần cốt lõi giúp vi điều khiển STM32F103 xử lý các ngắt một cách thông minh và hiệu quả. Nếu bạn đang tìm hiểu về lập trình STM32F103 thanh ghi, việc nắm vững NVIC trong STM32F103 sẽ giúp bạn xây dựng các ứng dụng thời gian thực ổn định, như hệ thống điều khiển tự động hoặc giao tiếp ngoại vi. Bài viết này sẽ giải thích chi tiết NVIC là gì, cấu trúc của nó, cách sử dụng các thanh ghi quan trọng, bảng ánh xạ IRQ, và các ví dụ code thực tế cấu hình NVIC trong STM32F103 để bạn áp dụng trong lập trình STM32F103 thanh ghi.

NVIC (Nested Vectored Interrupt Controller) là gì?

NVIC (Nested Vectored Interrupt Controller) là bộ điều khiển ngắt được tích hợp sẵn trong nhân ARM Cortex-M3 của vi điều khiển STM32F103. Đây là thành phần cốt lõi của hệ thống ngắt, đóng vai trò trung tâm trong việc tiếp nhận, quản lý và phân phối các yêu cầu ngắt từ ngoại vi đến CPU.

NVIC chịu trách nhiệm:

  • Quản lý các ngắt ngoại vi: Timer, UART, ADC, GPIO, DMA…
  • Xử lý vectored interrupt – nhảy trực tiếp đến hàm ISR tương ứng, không cần dò tìm
  • Hỗ trợ ngắt lồng nhau (nested interrupt)
    → Ngắt có mức ưu tiên cao hơn có thể chen ngang ngắt đang xử lý
  • Cho phép thiết lập mức ưu tiên (priority) cho từng nguồn ngắt

👉 Nói cách khác, NVIC chính là “bộ não của hệ thống ngắt”, giúp CPU quyết định khi nào cần tạm dừng chương trình chính để xử lý một sự kiện quan trọng.

Trong lập trình STM32F103 thanh ghi, NVIC giúp tối ưu hóa hiệu suất bằng cách hỗ trợ lên đến 68 nguồn ngắt (IRQ), với mức ưu tiên từ 0-15 (0 là cao nhất). Theo reference manual RM0008 của STMicroelectronics, NVIC được tích hợp để hỗ trợ nested-vectored interrupts, cho phép xử lý nhanh chóng mà không cần phần mềm can thiệp thủ công.

Lợi ích của NVIC trong lập trình STM32F103 thanh ghi bao gồm:

  • Phản hồi nhanh với các sự kiện ngoại vi, giảm thời gian trễ.
  • Hỗ trợ đa nhiệm bằng cách cho phép ngắt lồng ghép, hữu ích trong các ứng dụng như robot hoặc cảm biến IoT.
  • Dễ dàng cấu hình qua các thanh ghi, giúp lập trình viên kiểm soát chính xác hệ thống ngắt.

Define struct thanh ghi NVIC cho lập trình STM32F103 thanh ghi: Cấu hình NVIC trong STM32F103

Dựa trên PM0056, Section 15.4 (trang 118-129):

Define struct thanh ghi NVIC_ISERx

Hướng dẫn lập trình STM32F103 thanh ghi: Cấu hình NVIC trong STM32F103 - Thanh ghi ISER[n] – Interrupt Set-Enable Register
Thanh ghi ISER[n] – Interrupt Set-Enable Register

Define struct thanh ghi NVIC_ICERx

Hướng dẫn lập trình STM32F103 thanh ghi: Cấu hình NVIC trong STM32F103RCT6 - Thanh ghi ICER – Interrupt Clear Enable Register
Thanh ghi ICER – Interrupt Clear Enable Register

Define struct thanh ghi NVIC_ISPRx

Hướng dẫn lập trình nhúng STM32F103 thanh ghi: Cấu hình NVIC - Interrupt set pending register - NVIC_ISPRx
Interrupt set pending register – NVIC_ISPRx

Define struct thanh ghi NVIC_ICPRx

Hướng dẫn lập trình nhúng STM32F103 thanh ghi: Cấu hình NVIC - Interrupt clear pending register - NVIC_ICPRx
Interrupt clear pending register – NVIC_ICPRx

Define struct thanh ghi NVIC_IABRx

Hướng dẫn lập trình nhúng STM32F103 thanh ghi: Cấu hình thanh NVIC - Interrupt active bit register - NVIC_IABRx
Interrupt active bit register – NVIC_IABRx

Define struct thanh ghi NVIC_IPRx

Hướng dẫn lập trình STM32F103 thanh ghi: Cấu hình NVIC STM32F103RCT6 - Thanh ghi IPR – Interrupt Priority Register
Thanh ghi IPR – Interrupt Priority Register

Define struct thanh ghi NVIC_STIRx

Hướng dẫn lập trình nhúng STM32F103 thanh ghi: Cấu hình thanh ghi NVIC - Software trigger interrupt register - NVIC_STIR
Software trigger interrupt register – NVIC_STIR

Sơ đồ thanh ghi NVIC trong STM32F103 (NVIC register map)

Hướng dẫn lập trình nhúng STM32F103 thanh ghi - Sơ đồ thanh ghi NVIC (NVIC register map)
Sơ đồ thanh ghi NVIC (NVIC register map)

Hướng dẫn lập trình nhúng STM32F103 thanh ghi - Sơ đồ thanh ghi NVIC (NVIC register map)
Sơ đồ thanh ghi NVIC (NVIC register map)

Cấu trúc của NVIC trong STM32F103

Trong STM32F103, NVIC được ánh xạ vào vùng System Control Space (SCS) của Cortex-M3.

  • Base address NVIC: 0xE000E100
  • Tài liệu tham chiếu: PM0056 – Cortex-M3 Programming Manual

Các thanh ghi NVIC quan trọng

Thanh ghiChức năngSố lượng
ISER[0..2]Bật ngắt (Set Enable)3 × 32 = 96 bit → đủ cho 81 IRQ
ICER[0..2]Tắt ngắt (Clear Enable)3 thanh ghi x 32 bit
ISPR[0..2]Đặt pending (ngắt đang chờ)3 thanh ghi x 32 bit
ICPR[0..2]Xóa pending3 thanh ghi x 32 bit
IABR[0..2]Trạng thái active (đang xử lý)3 thanh ghi x 32 bit
IPR[0..20]Thiết lập mức ưu tiên (4 IRQ/thanh ghi)21 thanh ghi x 8 bit x4

STM32F103 hỗ trợ tối đa 68 IRQ ngoại vi, được chia thành các nhóm 32-bit.

Bảng ánh xạ IRQ (Interrupt Vector Table) – RẤT QUAN TRỌNG

📘 RM0008 – Trang 198–206 – Mục 10.1.2

 

Lập trình STM32F103 thanh ghi: Cấu hình NVIC STM32f103 - Vector interrupt table
Vector interrupt table
Lập trình STM32F103 thanh ghi: Cấu hình NVIC STM32f103 - Vector interrupt table 2
Vector interrupt table 2
Lập trình STM32F103 thanh ghi: Cấu hình NVIC STM32f103 - Vector interrupt table 3
Vector interrupt table 3

Bảng Interrupt Vector Table cho biết:

  • Mỗi ngoại vi (TIM, USART, EXTI, ADC…) ứng với IRQ number nào
  • Tên ISR handler tương ứng
  • Thứ tự vector trong bộ nhớ

👉 Có thể hình dung bảng IRQ giống như danh bạ điện thoại:

  • Bạn muốn gọi TIM2 → phải biết “số điện thoại” của nó là IRQ 28

Bảng IRQ dùng để làm gì?

Việc cần làmDùng bảng IRQ để…
1. Bật ngắtTìm IRQ Number → dùng trong NVIC->ISER[]
2. Tắt ngắtDùng cùng IRQ Number với NVIC->ICER[]
3. Đặt ưu tiênTính IPR[index] và PRI_x từ IRQ Number
4. Viết ISRĐặt tên hàm xử lý đúng: void TIM2_IRQHandler()

Bảng này rất quan trọng trong lập trình STM32F103 thanh ghi vì nó giúp ánh xạ đúng ngoại vi với NVIC, tránh lỗi như ngắt không kích hoạt.

Minh họa cấu hình NVIC với TIM2

BướcHành độngDựa vào bảng IRQ
1Tìm TIM2 trong bảng → Position = 44Position: 44
2Tính IRQ Number → 44 – 16 = 28IRQ number: 28
3Bật ngắtNVIC_Interrupt_Enable(28)
4Đặt ưu tiênNVIC_Set_Interrupt_Priority(28, 5)
5Viết ISRvoid TIM2_IRQHandler()

Sơ đồ hoạt động của NVIC

Ngoại vi → IRQ Request → NVIC (ISER + IPR + Pending) → CPU so sánh ưu tiên → Vector Table → ISR → Xử lý → return

Khi một ngắt xảy ra, NVIC sẽ kiểm tra:

  1. Ngắt đã được enable chưa?

  2. Priority có cao hơn ngắt đang chạy không?

Nếu có, NVIC sẽ tạm dừng chương trình chính, nhảy vào hàm phục vụ ngắt (ISR) tương ứng. Sau khi ISR chạy xong, CPU quay lại vị trí trước khi bị ngắt.

Trong lập trình STM32F103 thanh ghi, sơ đồ này giúp hiểu cách NVIC hỗ trợ nested interrupts, nơi ngắt ưu tiên cao có thể chen ngang, tối ưu cho các hệ thống thời gian thực.

Thanh ghi ISER – Interrupt Set Enable Register

Trong lập trình STM32F103 thanh ghi, ISER là bước đầu tiên để kích hoạt ngắt, thường kết hợp với EXTI cho GPIO.

Hướng dẫn lập trình STM32F103 thanh ghi: Cấu hình NVIC - Thanh ghi ISER[n] – Interrupt Set-Enable Register
Thanh ghi ISER[n] – Interrupt Set-Enable Register

Mô tả thanh ghi ISER

TrườngMô tả
Địa chỉ0xE000E100 + x * 4 (x = 0,1,2)
Kích thước32-bit
Phạm vi IRQISER[0]: IRQ 0–31 ISER[1]: IRQ 32–63 ISER[2]: IRQ 64–80
Cơ chếWrite-1-to-enable, Read = current state
Viết 1Bật ngắt tương ứng
Viết 0Không ảnh hưởng
ĐọcTrả về trạng thái bật/tắt

Code enable IRQ

Link Github: Download code cầu hình NVIC trong lập trình STM32F103RCT6

Thanh ghi ICER – Interrupt Clear Enable Register

ICER hữu ích để tắt ngắt tạm thời trong lập trình STM32F103 thanh ghi, tránh xung đột.

Hướng dẫn lập trình STM32F103 thanh ghi: Cấu hình NVIC STM32F103RCT6 - Thanh ghi ICER – Interrupt Clear Enable Register
Thanh ghi ICER – Interrupt Clear Enable Register

Mô tả thanh ghi ICER

TrườngMô tả
Địa chỉ0xE000E180 + x * 4
Cơ chếWrite-1-to-disable, Read = current state
Viết 1Tắt ngắt
Viết 0Không ảnh hưởng
ĐọcTrạng thái hiện tại

Code disable IRQ

Link Github: Download code cầu hình NVIC trong lập trình STM32F103RCT6

Thanh ghi IPR – Interrupt Priority Register

Trong lập trình STM32F103 thanh ghi, IPR cho phép tùy chỉnh ưu tiên.

Hướng dẫn lập trình STM32F103 thanh ghi: Cấu hình NVIC STM32F103RCT6 - Thanh ghi IPR – Interrupt Priority Register
Thanh ghi IPR – Interrupt Priority Register

Mô tả thanh ghi IPR

TrườngMô tả
Số lượng21 thanh ghi (IPR0 – IPR20)
Mỗi thanh ghiChứa 4 IRQ
Mỗi IRQDùng 8 bit, nhưng chỉ bit [7:4] có hiệu lực
Bit [3:0]Bị bỏ qua (implementation defined)

👉 Priority càng nhỏ → độ ưu tiên càng cao

Cấu trúc 1 thanh ghi IPR

Bit 31–24Bit 23–16Bit 15–8Bit 7–0
IRQ (4n+3)IRQ (4n+2)IRQ (4n+1)IRQ (4n)

Code set priority

Link Github: Download code cầu hình NVIC trong lập trình STM32F103RCT6

Kiểm tra cấu hình NVIC trong STM32F103 bằng Keil uVision

Ví dụ cấu hình TIM2 IRQ priority = 5

Bật bảng trạng thái thanh ghi NVIC: Từ giao diện uVision, Chọn Menu > Peripherals > System Viewer > NVIC.

Hướng dẫn lập trình STM32F103 thanh ghi: Cấu hình NVIC - Mở cửa số KEIL C xem thanh ghi NVIC
Mở cửa số KEIL C xem thanh ghi NVIC

TIMER2 IRQ nằm ở vị trí thứ 28 trong bảng vector ngắt:

Lập trình STM32F103 thanh ghi: Cấu hình NVIC - Kiểm tra cấu hình mức độ ưu tiên TIMER2 thanh ghi NVIC
Kiểm tra cấu hình mức độ ưu tiên TIMER2 thanh ghi NVIC

Set mức độ ưu tiên ngắt TIMER2 là 5 và ở vị trí 28 nên thanh ghi PR7 và IPR_0 được set giá trị 0x50. Vì mỗi thanh ghi PR có 4 thanh ghi IPR, tương ứng IRQn, IRQn+1, IRQn+3, IRQn+4.

Hướng dẫn lập trình thanh ghi STM32F103 - Kiểm tra cấu hình NVIC
Kiểm tra cấu hình NVIC

Lỗi Thường Gặp Khi Lập Trình STM32F103 Thanh Ghi Với NVIC Và Cách Khắc Phục

  • Lỗi 1: Ngắt không kích hoạt – Nguyên nhân: Chưa bật ISER hoặc sai IRQ number. Khắc phục: Kiểm tra bảng vector trong RM0008 và sử dụng NVIC_Interrupt_Enable đúng.
  • Lỗi 2: Ưu tiên không hoạt động – Nguyên nhân: Sai bit shift trong IPR. Khắc phục: Luôn shift level << 4 như trong code ví dụ.
  • Lỗi 3: Ngắt lồng ghép gây stack overflow – Nguyên nhân: Ưu tiên quá gần nhau. Khắc phục: Đặt khoảng cách ưu tiên lớn và kiểm tra stack size.

Kết Luận: Tại Sao NVIC Quan Trọng Trong Lập Trình STM32F103 Thanh Ghi?

NVIC trong STM32F103 là công cụ mạnh mẽ giúp lập trình viên xây dựng hệ thống ngắt đáng tin cậy. Bằng cách nắm vững các thanh ghi như ISER, ICER, IPR và bảng IRQ, bạn có thể tối ưu hóa dự án của mình. Nếu bạn mới bắt đầu lập trình STM32F103 thanh ghi, hãy thử ví dụ với TIMER2 để thực hành. Tham khảo thêm tài liệu chính thức từ STMicroelectronics để đi sâu hơn.

  • NVIC là trái tim của hệ thống ngắt STM32F103
  • Hiểu rõ IRQ mapping + ISER + IPR là nền tảng để:
    • Lập trình timer
    • Xử lý ngắt GPIO
    • Viết driver UART, ADC, DMA
  • Lập trình NVIC bằng thanh ghi giúp:
    • Hiểu sâu kiến trúc Cortex-M3
    • Tối ưu hiệu năng
    • Debug dễ dàng hơn HAL

FAQ Về NVIC Trong STM32F103

  • NVIC hỗ trợ bao nhiêu mức ưu tiên? 16 mức (0-15).
  • Làm thế nào để bật ngắt toàn cục? Sử dụng __enable_irq().
  • Tài liệu nào cần đọc? RM0008 (STM32 reference manual) và PM0056 (Cortex-M3 programming manual).

Viết một bình luận

This site uses Akismet to reduce spam. Learn how your comment data is processed.