🌱 STM32 - 9. Lập trình ngắt ngoài External Interrupt Example
Muốn cấu hình External Interrupt, cần phải cấu hình chân GPIO tương ứng, bộ điều khiển ngắt NVIC và bộ External Interrupt (EXTI). External Interrupt thường đường sử dụng để phát hiện các sự kiện sườn lên/xuống trên các chân, trong các mục đích cần thiết (thay vì kiểm tra theo kiểu polling). Một ví dụ thường sử dụng External Interrupt là sử dụng nút bấm.
Trước khi config External Interrupt, các bạn cần tìm hiểu về các thanh ghi ngoại vi GPIO, EXTI và NVIC, cũng như các kiến thức liên quan đến 3 bộ này. Các bài viết trước về Core và STM32 về External Interrupt và NVIC:
- Core 8. Ngắt và bộ quản lý ngắt NVIC
- Core 9. Interrupt Priority
- STM 7. External Interrupt Overview
- STM 8. External Interrupt Registers
Cùng với đó là tham khảo địa chỉ các thanh ghi ngoại vi trong RM cũng như tài liệu về Core. Chúng ta sẽ trải qua các bước cấu hình sau để cấu hình một chân ở chế độ External Interrupt.
👉 Define địa chỉ và khai báo các thanh ghi
Các thanh ghi cần sử dụng ở đây bao gồm:
- Thanh ghi Cấu hình clock cho bus AHB1 (cấp cho GPIOA) - RCC_AHB1ENR và APB2 (cấp cho EXTI) - RCC_APB2ENR.
- Thanh ghi cấu hình Input cho GPIOA - GPIOx_MODER.
- Thanh ghi Cấu hình EXTI bao gồm thanh ghi interrupt mask EXTI_IMR, thanh ghi cấu hình sườn lên/xuống (ở đây là sườn lên) EXTI_FTSR, thanh ghi pending EXTI_PR.
- Thanh ghi cấu hình NVIC, ở đây chỉ sử dụng thanh ghi Enable IRQ (Ngoài ra còn có các thanh ghi cấu hình độ ưu tiên của các line ngắt, nếu như có nhiều ngắt).
👉 Cấu hình mode cho GPIO và cấu hình EXTI
Ở bước này chúng ta cần làm theo các bước:
- Cấu hình cho phép Clock GPIOA và Clock cho EXTI.
- Cấu hình mode cho GPIOA (Ở đây mình để là Input Floating, người ta thường sử dụng Input Pullup cho các nút nhấn).
- Cấu hình sườn lên/xuống cho EXTI (ở đây mình chọn là sườn lên).
- Cấu hình cho phép EXTI line tương ứng (ở đây là line 0).
- Cấu hình Enable NVIC.
👉 Viết chương trình con phục vụ ngắt - ISR - Interrupt Service Routine
Chương trình con phục vụ ngắt sẽ sử dụng tên hàm có định nghĩa sẵn trong file Startup. Ở đây mình dùng External Interrupt trên line 0, vì vậy, tên chương trình con phục vụ ngắt sẽ có tên: EXTI0_IRQHandler (void).
Phần còn lại là việc chúng ta thiết kế chương trình main theo ý các bạn thôi là xong!!!
Tiếp đi A ơi :))
Trả lờiXóaok em, anh k có nhiều time lắm nên mỗi ngày 1 2 bài thôi :v
XóaE gọi thẳng RCC->AHB1ENR không define các thanh ghi có sao không A ?
XóaĐó là nếu em có thư viện STD trong project rồi thì được, còn project anh đang hướng dùng thanh ghi. Thư viện ngta đã define sẵn cho mình rồi, ví dụ Struct pointer RCC ở địa chỉ nào. Nếu không dùng thư viện thì mình sẽ tự define như anh làm đó.
Xóamấy cái ngắt ADC, UART,... là của mode Event à anh?
Trả lờiXóacái đó cũng là ngắt nha em, còn event là một tính năng không gọi đến các ISR, thường dùng trong power mode
Xóacái thanh ghi ISER của core NVIC xem ở đâu vậy anh
Trả lờiXóaVới các thanh ghi của NVIC em xem trong tài liệu Cortex M Generic User Guide nhé
Xóa*pNVICIRQEnReg |= (1<<6) là Enable NVIC trên chân nào vậy ạ, em xem qua thanh ghi pNVICIRQEnReg thấy có tới 32 bit nhưng mà không biết các bit đó khác nhau như nào ạ, em cảm ơn anh
Trả lờiXóaMỗi bit trên thanh ghi này tương ứng 1 line ngắt đó e, ví dụ thanh ghi NVIC_ER0 thì bit 5 tương ứng với ngắt có IRQ number = 5
Xóa