Lưu ý khi viết hàm xử lý ngắt ngoài stm32f4
Với phương pháp polling, mọi câu lệnh đều được viết trong hàm main() và while(1) và các khối lệnh đảm nhận một chức năng của một hệ thống sẽ được thực thi một cách tuần tự bằng cách kiểm tra các biến trạng thái, điều kiện. Phương pháp này phù hợp cho các ứng dụng đơn giản không có sự phân biệt về mức độ ưu tiên giữa các nhiệm vụ trong ứng dụng đó. [HỌC ONLINE: LẬP TRÌNH VI ĐIỀU KHIỂN STM32, VI XỬ LÝ ARM CORTEX – M] Bài viết này sẽ cung cấp các bạn cơ sở lý thuyết về ngắt ngoài trên STM32F411 và hướng dẫn thực hành sử dụng phần mềm CubeMX và KeilC. II. Hiểu về line ngắt III. Mô tả hoạt động của ngắt – Thanh ghi chọn sườn lên: RTSR có 32 bit, trong đó sử dụng 16 bit thấp để cấu hình chọn sườn lên cho line ngắt tương ứng với các chân GPIO. Nếu cấu hình chọn cả sườn lên và sườn xuống cho 1 line thì yêu cầu ngắt sẽ được tạo ra trong
cả 2 trường hợp xuất hiện sườn lên và sườn xuống. V. Thực hành ngắt ngoài với nút nhấn. Bước 1: Tại ô “Part Number Search” gõ dòng chip STM32F411VE cũng là dòng chip trên Kit phát triển STM32F411DISCOVERY. Kích chọn dòng STM32F411VETx và sau đó chọn “Start Project”. Bước 2: Chọn Serial Wire để nạp code Bước 3: Click chuột phải vào chân PD12 sau đó tích vào ô GPIO_Output Bước 4: Chọn chân PA0 là chân GPIO_EXTI0. Vì sơ đồ nguyên lý của nút nhấn PA0 trên kit STM32F411DISCOVERY đã thiết kế sẵn trở kéo xuống nên trong CUBEMX ta chỉ cần cấu hình No pull-up No pull-down tại chân này và chọn sườn lên làm tín hiệu kích hoạt ngắt. Bước 5: Chuyển qua tab NVIC và tick chọn ô Enabled, cho phép xảy ra ngắt tại line 0. Để thay đổi mức độ ưu tiên của các line ngắt đang
sử dụng, các bạn vào ô NVIC ở System Core. Ở đây chúng ta có 5 nhóm Priority Group khác nhau để phân chia số bit cho pre-emption priority và subpriority. Ý nghĩa của 2 loại ưu tiên ngắt này như sau: Bước 6: Setting project và sinh code Bước 7: Click chọn Open Project và chuyển qua tab Keil C. Ở mục Function góc ngoài cùng bên phải, các bạn click vào phần mở rộng main.c. Ở đây chúng ta có thể xem tất cả các hàm hiện có trong file main. Click vào MX_GPIO_Init(void) để xem lại tất cả những cấu hình GPIO mà bạn đã khởi tạo ở phần mềm CubeMX. Ở hàm HAL_NVIC_Setpriority(), chúng có thể thấy thông số đầu tiên là EXTI Line Interrupt, thông số thứ 2 là mức độ ưu tiên của pre-empriority, thứ 3 là mức độ ưu tiên của subpriority. Bước 8: Ở file main.c, chúng ta khởi tạo hàm void HAL_GPIO_EXTI_Callback() như sau:
Ở trong hàm này, lệnh if(GPIO_Pin == GPIO_PIN_0) để phân luồng ngắt, kiểm tra rằng ngắt hiện tại đang sinh ra ở chân nào. Mỗi lần xảy ra ngắt tại chân GPIO0, led PD12 sẽ đảo trạng thái, sau đó chờ đến khi nút nhấn được thả trong 1 khoảng thời gian time out rồi xóa pending ngắt, tránh tình trạng nhảy vào hàm ngắt nhiều lần khi nhấn nút. TAPIT ARM R&D |