Lập trình với ngắt ngoài GPIO (EXTI). NVIC (Nested Vectored Interrupt Controller) – bộ điều khiển vector ngắtlồng nhau: là thành phần tích hợp của bộ vi xử lý CortexM3 có khả năngxử lý ngắt rất linh hoạt và nhanh chóng. Có 68 vector ngắt 16 mức ưu tiên (từ 0 ÷ 15, mức 0 – là mức ưu tiên cao nhất) Có thể cấu hình từ 1 đến 240 ngắt vật lý với tối đa 256 mức ưutiên. Ưu tiên theo nhóm (Line), xử lý với độ trễ thấp. Quản lý năng lượng trong quá trình điều khiển ngắt Hỗ trợ Tailchaining trong phần cứng.
Trang 13.3 Lập trình với ngắt ngoài GPIO
(EXTI)
3.3.1 Tổ chức ngắt trên ARM STM32
Trang 2 NVIC (Nested Vectored Interrupt Controller) – bộ điều khiển vector ngắtlồng nhau: là thành phần tích hợp của bộ vi xử lý Cortex-M3 có khả năng
xử lý ngắt rất linh hoạt và nhanh chóng
- Có 68 vector ngắt
- 16 mức ưu tiên (từ 0 ÷ 15, mức 0 – là mức ưu tiên cao nhất)
- Có thể cấu hình từ 1 đến 240 ngắt vật lý với tối đa 256 mức ưutiên
- Ưu tiên theo nhóm (Line), xử lý với độ trễ thấp
- Quản lý năng lượng trong quá trình điều khiển ngắt
- Hỗ trợ Tail-chaining trong phần cứng
3.3.1 Tổ chức ngắt trên ARM STM32
Trang 3Push ISR 1 Pop Push ISR 2 Pop
26 Cycles 16 Cycles 26 Cycles 16 Cycles
CortexM3 Interrupts: Tail Chaining
26 cycles from IRQ1 to ISR1
(up to 42 cycles if in LSM)
42 cycles from ISR1 exit to ISR2 entry
16 cycles to return from ISR2
ARM7TDMI
12 cycles from IRQ1 to ISR1
(Interruptible/Continual LSM)
6 cycles from ISR1 exit to ISR2 entry
12 cycles to return from ISR2
Cortex-M3
Trang 4Bảng Vector ngắt trên Cortex-M3
Trang 93.3 Lập trình với ngắt ngoài GPIO
(EXTI)
3.3.2 Ngắt ngoài GPIO (EXTI)
Trang 11 Ngắt EXTI được thực hiện khi có nguyên nhân từ bên ngoài tác động vào chân EXTI.
EXTI xử lý tất cả các tín hiệu yêu cầu ngắt đến từ tất cả các chân GPIO của vi điều khiển
Có thể thiết lập tối đa 20 nguyên nhân gây ngắt
Tín hiệu gây ngắt phải có độ rộng xung thấp hơn chu kì xung nhịp của APB2
Kích hoạt độc lập và mask trên mỗi dòng ngắt (Line
Interrupts)
Truy cập đến từng Bit trong mỗi dòng ngắt
3.3.2 Ngắt ngoài GPIO (EXTI)
Trang 123.3.2 Ngắt ngoài GPIO (EXTI)
- Tổ chức ngắt ngoài
Trang 13 Các yêu cầu ngắt được phân thành 20 line ngắt
16 line (0-15) từ các
chân GPIO (0-15)
Yêu cầu từ chân 0 –được thực hiện trênline 0
Yêu cầu từ chân 1 –được thực hiện trênline 1
…
Yêu cầu từ chân 15 –được thực hiện trênline 15
Trang 14 Các line 0, line1, line2, line3, line 4 sẽ được phân vào các vector
Trang 15 4 line ngắt EXTI còn lại đuợc nối như sau:
EXTI line 16 được nối vào PVD output
EXTI line 17 được nối vào RTC Alarm event.
EXTI line 18 được nối vào USB Wakeup event.
EXTI line 19 được nối vào Ethernet Wakeup event.
Trang 16 37 GPIO có thể thiết lập là ngắt bên ngoài bằng cách thiết lập các thanh ghi hoặc các hàm API
Interrupt mask register (EXTI_IMR)
Event mask register (EXTI_EMR)
Rising trigger selection register (EXTI_RTSR)
Falling trigger selection register (EXTI_FTSR)
Software interrupt mask register (EXTI_SWIER)
Pending register (EXTI_PR)
3.3.2 Ngắt ngoài GPIO (EXTI)
Trang 18 Ưu tiên khi sử dụng ngắt
Có 2 loại ưu tiên ngắt : Preemption Priorities và Sub Priorities
Mặc định thì ngắt nào có Preemtion Priority cao hơn thì sẽ được thực hiện trước
Khi 2 ngắt có cùng một mức Preemption Priority thì ngắt nào
có Sub Priority cao hơn thì ngắt đó được thực hiện
Khi 2 ngắt có cùng mức Preemption và Sub Priority luôn thì ngắt nào đến trước được thực hiện trước
3.3.2 Ngắt ngoài GPIO (EXTI)
Trang 19 Ưu tiên khi sử dụng ngắt
Có 5 nhóm ưu tiên ngắt
4 bit thiết lập ưu tiên
3.3.2 Ngắt ngoài GPIO (EXTI)
Priority Group Preemption Priority Level Subpriority Level
4 4 bits/16 levels 0 bit/ 0 level
3 3 bits/8 levels 1 bit/2 levels
2 2 bits/4 levels 2 bits/4 levels
1 1 bit/2 levels 3 bits/8 levels
0 0 bit/ 0 level 4 bits/16 levels
Preemption Priority
Subpriority
Trang 20 Thanh ghi thiết lập ưu tiên ngắt SCB->AIRCR
Trang 21 Các hàm API trong HAL
3.3.2 Ngắt ngoài GPIO (EXTI)
Trang 22 Các hàm API trong HAL
3.3.2 Ngắt ngoài GPIO (EXTI)
Trang 23 Các bước lập trình với ngắt GPIO
Bước 3 Cấu hình chân EXTI
- Chân ngắt phải thiết lập chiều vào dữ liệu
- Lựa chọn nguyên nhân gây ra ngắt
3.3.2 Ngắt ngoài GPIO (EXTI)
Trang 24 Các bước lập trình với ngắt GPIO
Bước 3 Cấu hình chân EXTI
- Chân ngắt phải thiết lập chiều vào dữ liệu
- Lựa chọn nguyên nhân gây ra ngắt
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
3.3.2 Ngắt ngoài GPIO (EXTI)
Trang 25 Các bước lập trình với ngắt GPIO
Bước 4 Cấu hình NVIC:
- Bật kênh ngắt trong NVIC: HAL_NVIC_EnableIRQ(EXTI0_IRQn);
- Cấu hình mức độ ưu tiên: HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);
- Cấu hình nhóm ưu tiên:
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
Bước 5 Chờ khi có ngắt
- Chờ ngắt trong chương trình chính
- Viết chương trình con phục vụ ngắt
3.3.2 Ngắt ngoài GPIO (EXTI)
Trang 26 Các bước lập trình với ngắt GPIO
Bước 5 Viết chương trình con phục vụ ngắt
Trong file "stm32f1xx_it.c“ hoặc trong “main.c”
void EXTI0_IRQHandler(void) // Ví dụ ngắt GPIO Line 0{
B1 Xóa cờ ngắt bằng hàm :
HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0);
B2 Kiểm tra điều kiện khi xảy ra ngắt GPIO: ví dụ: PA0
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==0) { //thực hiện lệnh }
B3 Xử lý yêu cầu khi có ngắt:
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
}
3.3.2 Ngắt ngoài GPIO (EXTI)
Trang 27 Các bước lập trình với ngắt GPIO trên STM CUBE
B1 Cấu hình chân GPIO là ngắt ngoài (trên chân PA0)
3.3.2 Ngắt ngoài GPIO (EXTI)
Trang 28 Các bước lập trình với ngắt GPIO trên STM CUBE
B1 Cấu hình chân GPIO là ngắt ngoài (trên chân PA0)
Thiết lập GPIO_EXTI0 trên chân PA0
3.3.2 Ngắt ngoài GPIO (EXTI)
Trang 29 Các bước lập trình với ngắt GPIO trên STM CUBE
B2 Lựa chọn nguyên nhân gây ngắt trên chân GPIO – PA0
Lựa chọn GPIO
3.3.2 Ngắt ngoài GPIO (EXTI)
Trang 30 Các bước lập trình với ngắt GPIO trên STM CUBE
B2 Lựa chọn nguyên nhân gây ngắt trên chân GPIO – PA0
Thiết lập nguyên nhân gây ngắt :
3.3.2 Ngắt ngoài GPIO (EXTI)
Trang 31 Các bước lập trình với ngắt GPIO trên STM CUBE
B2 Lựa chọn nguyên nhân gây ngắt trên chân GPIO – PA0
Thiết lập nguyên nhân gây ngắt : lựa chọn ngắt sườn âm trên PA0
External Interrupt Mode with Falling edge trigger detection
3.3.2 Ngắt ngoài GPIO (EXTI)
Trang 32 Các bước lập trình với ngắt GPIO trên STM CUBE
B2 Lựa chọn nguyên nhân gây ngắt trên chân GPIO – PA0
Thiết lập nguyên nhân gây ngắt : lựa chọn Pull-up
3.3.2 Ngắt ngoài GPIO (EXTI)
Trang 33 Các bước lập trình với ngắt GPIO trên STM CUBE
B3 Thiết lập ưu tiên ngắt
Lựa chọn NVIC
3.3.2 Ngắt ngoài GPIO (EXTI)
Trang 34 Các bước lập trình với ngắt GPIO trên STM CUBE
B3 Thiết lập ưu tiên ngắt
Lựa chọn nhóm ưu tiên NVIC
3.3.2 Ngắt ngoài GPIO (EXTI)
Trang 35 Các bước lập trình với ngắt GPIO trên STM CUBE
B3 Thiết lập ưu tiên ngắt
Lựa chọn mức ưu tiên: Preemption - Sub
3.3.2 Ngắt ngoài GPIO (EXTI)
Trang 36 Các bước lập trình với ngắt GPIO trên STM CUBE
Lựa chọn chân chiều vào, chiều ra, mode Thiết lập các thông số trênSTM32CubeMX như trong hướng dẫn lập trình với GPIO
Sau đó chọn GENERATE CODE để tạo file Code
3.3.2 Ngắt ngoài GPIO (EXTI)
Trang 37{ } HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); }
Khung chương trình sử dụng ngắt – Ví dụ ngắt PA0
Trang 38Ví dụ 01:
Lập trình điều khiển LED1 (PA10) sáng nhấp nháy (nhanh) với chu kì 200ms, khi nhấn nút PB1 (PA0) LED1 chuyển sang chế độ sáng nhấp nháy (chậm) với chu kì 1s - 10 lần, sau đó LED1 tiếp tục nháy nhanh
3.3.2 Ngắt ngoài GPIO (EXTI)
Trang 40//Chương trình con phục vụ ngắt – viết trong file “stm32f1xx_it.c”
Hoặc trong “main.c”
void EXTI0_IRQHandler(void)
{
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==0) {
for(int i=0;i<10;i++)
{ HAL_GPIO_WritePin(GPIOA,GPIO_PIN_10,GPIO_PIN_SET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_10,GPIO_PIN_RESET); HAL_Delay(500);
} }
HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
}
Khung chương trình sử dụng ngắt – Ví dụ ngắt PA0
Trang 42Bài tập:
Bài tập 1 Lập trình điều khiển LED sáng nhấp nháy (nhanh) với chu kì
100ms, khi nhấn nút UP, LED chuyển sang chế độ sáng nhấp nháy (chậm) với chu kì 1s - 10 lần, sau đó LED tiếp tục nháy nhanh
Bài tập 2 Lập trình điều khiển LED sáng nhấp nháy (nhanh) với chu kì
200ms, khi nhấn nút DOWN, LED chuyển sang chế độ sáng nhấp nháy
(chậm) với chu kì 1s - 10 lần, sau đó LED tiếp tục nháy nhanh
Bài tập 3 Lập trình điều khiển LED sáng nhấp nháy(nhanh) với chu kì
100ms, khi nhấn nút UP, LED chuyển sang chế độ sáng nhấp nháy (chậm) với chu kì 500ms - 10 lần, khi nhấn nút DOWN, LED chuyển sang chế độ sáng nhấp nháy (chậm) với chu kì 1000ms - 5 lần
3.3.2 Ngắt ngoài GPIO (EXTI)