BÀI 05 : Ngắt ngoài với STM32F1.
- Sơ lược về lý thuyết.
- 16 mức ưu tiên có thể lập trình được.
- Độ trễ thấp (xảy ra ngắt cực kì nhanh).
- Có quản lí năng lượng cho vector ngắt.
- Có các thanh ghi điều khiển quá trình ngắt.
- 68 vector ngắt(xem thêm trong reference manual).
- Kích hoạt độc lập và mặt nạ cho mỗi line sự kiện/ngắt.
- Có bit trạng thái riêng cho mỗi line ngắt.
- Có thể có tối đa 20 sự kiện/ ngắt, tham khảo thêm trong reference manual.
- Kiểm tra tín hiệu ngoài có độ rộng xung nhỏ hơn clock trên APB2.
- Cấu hình với thư viện chuẩn của ST.
- Chương trình con cấu hình ngắt ngoài và thứ tự ưu tiên:
- Cấu hình line ngắt tương ứng với chân xảy ra ngắt, ở đây chân PC13 nên line ngắt sẽ là EXTI_Line13.
- Mode GPIO sử dụng ở đây là IPU tương ứng với input có trở kéo lên, khi chưa tác động thì chân PC13 ở mức cao, và tác động thì sẽ ở mức thấp(tức là được nối GND).
- Cấu hình cạnh lên và cạnh xuống hoặc cả 2 phụ thuộc vào mục đích sử dụng. Ở đây cấu hình là cạnh xuống : EXTI_Trigger_Falling.
- Cấu hình vector ngắt ở đây là EXTI15_10_IRQn vì từ chân Px0 -> Px4 tương ứng sẽ có 1 line ngắt riêng từ EXTI0_IRQ -> EXTI4_IRQ; chân Px5 -> Px9 chỉ có 1 line ngắt là EXTI9_5_IRQn; chân Px10 -> Px15 chỉ có 1 line ngắt là EXTI15_10_IRQn. Px ở đây là chung cho tất cả các Port từ PortA -> Port G. Vd PortA, PortB….
- Cấu hình mức độ ưu tiên xảy ra khi có nhiều ngắt. Ở đây là NVIC_IRQChannelPreemptionPriority + NVIC_IRQChannelSubPriority. Đây là 2 mức ưu tiên với tổng số bit là 4 tương ứng với 16 giá trị. Bảng ở dưới tương ứng với các giá trị. NVIC_IRQChannelPreemptionPriority có giá trị càng cao thì mức ưu tiên càng thấp và ngược lại với NVIC_IRQChannelSubPriority.
- Chương trình con thực thi ngắt trong file stm32f10x_it.c:
- Xóa bit báo ngắt ở line tương ứng.
- Đảo trạng thái led ở chân PB9 tương ứng với mỗi lần nhấn nút.
- Chương trình trong main và cấu hình ban đầu:
- Một số thanh ghi quan trọng.
- EXTI_IMR – Interrupt mask register.
- EXTI_EMR- Event mask register.
- EXTI_RTSR – Rising trigger selection register.
- EXTI_FTSR – Falling trigger selection register.
- EXTI_SWIER – Software interrupt even register.
- EXTI_PR – Pending register.
- Bài tập.
- Viết chương trình đọc nút nhấn trên chân PC13 sử dụng ngắt ngoài, nhấn lần 1 đèn trên chân PB9 sáng, lần thứ 2 led trên chân PB9 tắt… lặp đi lặp lại như vậy.
- Viết chương trình đọc 2 nút nhấn trên chân PC13 và PB8 sử dụng ngắt ngoài. Nút nhấn trên chân PC13 có mức ưu tiên cao hơn chân PB8. Khi nhân nút trên chân PC13 led trên chân PB9 sáng, và khi nhấn nút trên chân PB8 led trên chân PB9 tắt. Lặp đi lặp lại quá trình đó.
NVIC - Nested vectored interrupt controller là bộ vector ngắt lồng nhau. Nghĩa là chúng ta có thể sử dụng kết hợp nhiều ngắt trong một chương trình. Ngắt là một phần quan trọng và thiết yếu của chương trình. Nếu không có ngắt thì chương trình sẽ thực hiện theo 1 trình tự từ trên xuống dưới mà không có bất kì sự can thiệp nào. Điều đó là bất lợi khi có 1 tác động ngoài xảy ra, chương trình sẽ không xử lí kịp thời dẫn đến việc bỏ qua tác động đó. Ngắt ra đời để phục vụ cho các sự cố đó.
Một số thông số ngắt chính của STM32F103:
Ngắt ngoài nằm trong 1 phần của ngắt NVIC. Mỗi EXTI – interrupt/event controller có thể được lập trình chọn loại sự kiện/ ngắt, chọn cạnh lên, cạnh xuống hoặc cả 2, mức ưu tiên ngắt.
Một số tính năng chính của ngắt ngoài:
Sơ đồ khối của các khối điều khiển ngắt ngoài:
Có 2 loại ngắt ngoài chính đó là ngắt ngoài trên các chân điều khiển ở dạng thông thường và ngắt ngoài trên các ứng dụng như : PVD, RTC, USB, Ethernet.
LƯU Ý:
Thanh ghi này cho phép có kiểm tra ngắt ngoài trên chân tương ứng hay chưa.
Thanh ghi này cho phép có cấu hình sự kiện trên chân tương ứng hay chưa.
Thanh ghi này cho phép chân xảy ra sự kiện/ ngắt là cạnh lên hay không.
Thanh ghi này cho phép chân xảy ra sự kiện/ ngắt là cạnh xuống hay không.
Thanh ghi này cho phép mô phỏng ngắt ngoài xảy ra trên chân đã được cấu hình(thay vị tác động bằng cạnh lên/xuống trên chân vi điều khiển ta có thể sử dụng nó để giả lập tác động từ bên ngoài bằng việc set hoặc reset bit tương ứng).
Thanh ghi này được sử dụng xóa bit(nhưng thực ra là ghi giá trị =1) để kiểm tra tín hiệu sự kiện/ ngắt xảy ra cho các lần tiếp theo.
Link tải chương trình ngắt có ưu tiên trên chân PC13 và PB8
cảm ơn rất nhiều vì đã chia sẻ ạ !!!
ReplyDeleteCám ơn bạn đã quan tâm đến bài viết.
Deletecảm ơn bạn rất nhiều
ReplyDeleteCám ơn bạn đã quan tâm đến bài viết.
Deletecam ơn bạn rất nhiều <3
ReplyDeleteCám ơn bạn đã quan tâm.
DeleteMình sử dụng ngắt EXTI line 4 to 15 interrupts (3 ngắt)
ReplyDelete/*Configure GPIO pins : PA4 PA5 PA6 */
GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6;
GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
Trong chương trình chính tại 1 thời điểm mình muốn enable 1 ngắt (theo sườn lên hoặc sườn xuống) và disable 2 ngắt còn lại. Nhờ bạn giúp!
Trong chương trình con cấu hình có đoạn code như sau:
Delete/*EXTI line Configuration */
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Line = EXTI_Line13;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
Hàng EXTI_InitStructure.EXTI_LineCmd = ENABLE; cho phép ENABLE ngắt ở chân Px13.Bạn chỉ cần gọi lại chương trình đó và thay bằng DISABLE là không cho phép ngắt ở chân đó. Muốn bật lại thì ENABLE nó lên(nhớ thay bằng chân bạn sử dụng nha PA4 -PA5 - PA6). Nếu bạn tìm hiểu sâu hơn có thể dùng thanh ghi để code ngắn hơn. Chúc bạn thành công.
Thank bạn!
DeleteBạn cho mình hỏi có đúng seri này bạn sử dụng thư viện spl (std) để lập trình phải ko?
ReplyDeleteCảm ơn bạn.
đúng rồi nha bạn. Mình dùng thư viện chuẩn - standard library hay còn gọi là std(spl).
Deletemình đọc vài bài bạn viết rồi, dễ hiểu.
Deletenhưng mong bạn có 1 số chỗ vướng mắc như lúc tạo project t ấy, bạn có thể nói rõ mấy file include vào là những file gì, có chức năng gì rõ đc ko ạ.
với lại mình không hiểu sao lại làm như thế ấy, ví dụ khi nháy led bài đầu thì cần cấu hình rcc trước ấy, những cái đó để biết đc quy trình thì có phải do nhờ đọc trong datasheet không ạ?
Mình cảm ơn!
Đọc datasheet là phần cốt lõi bạn ah. Nếu muốn tự học tốt thì cần phải đọc hiểu datasheet nha bạn. Còn phần mà bạn thắc mắc mình chia sẻ những gì mà mình biết như sau: Có 2 loại file cần add đó là
Deletecác file hệ thống: là file mà bất kì project nào cũng cần phải có: main.c;stm32f10x_it.c; system_stm32f10x.c, misc.c;stm32f10x_gpio.c;stm32f10x_rcc.c. startup_stm3210xxx
Các file mà người dùng cần thêm vào để sử dung cho chức năng của project mình cần: vd exti thì cần file stm32f10x_exti.c, sử dụng uart thì cần stm32f10x_usart.c....
Bạn muốn biết cần phải add file nào thì vào file example của nhà sản xuất(ST) để tham khảo thêm, chúc bạn thành công.
cảm ơn bạn nhiều
ReplyDeleteCảm ơn bài viết của bạn nhiều
ReplyDelete