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.
3.3 Lập trình với ngắt ngồi GPIO (EXTI) 3.3.1 Tổ chức ngắt ARM STM32 3.3.1 Tổ chức ngắt ARM STM32 NVIC (Nested Vectored Interrupt Controller) – điều khiển vector ngắt lồng nhau: thành phần tích hợp vi xử lý Cortex-M3 có khả xử lý ngắt linh hoạt nhanh chóng - Có 68 vector ngắt - 16 mức ưu tiên (từ ÷ 15, mức – mức ưu tiên cao nhất) - Có thể cấu hình từ đến 240 ngắt vật lý với tối đa 256 mức ưu tiên - Ưu tiên theo nhóm (Line), xử lý với độ trễ thấp - Quản lý lượng trình điều khiển ngắt - Hỗ trợ Tail-chaining phần cứng CortexM3 Interrupts: Tail Chaining Highest IRQ1 IRQ2 ARM7TDMI Interrupt Handling Push ISR 26 Cycles Cortex-M3 Interrupt Push Handling ISR 12 Cycles ARM7TDMI 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 Pop Push 16 Cycles 26 Cycles ISR Cycles Tail-Chaining ISR Pop 16 Cycles Pop 65% Saving Cycle Overhead 12 Cycles Cortex-M3 12 cycles from IRQ1 to ISR1 (Interruptible/Continual LSM) cycles from ISR1 exit to ISR2 entry 12 cycles to return from ISR2 Bảng Vector ngắt Cortex-M3 Bảng Vector ngắt Cortex-M3 Bảng Vector ngắt Cortex-M3 Bảng Vector ngắt Cortex-M3 Bảng Vector ngắt Cortex-M3 3.3 Lập trình với ngắt ngồi GPIO (EXTI) 3.3.2 Ngắt GPIO (EXTI) 3.3.2 Ngắt GPIO (EXTI) Các bước lập trình với ngắt GPIO STM CUBE B1 Cấu hình chân GPIO ngắt ngồi (trên chân PA0) Thiết lập GPIO_EXTI0 chân PA0 3.3.2 Ngắt GPIO (EXTI) Các bước lập trình với ngắt GPIO STM CUBE B2 Lựa chọn nguyên nhân gây ngắt chân GPIO – PA0 Lựa chọn GPIO 3.3.2 Ngắt ngồi GPIO (EXTI) Các bước lập trình với ngắt GPIO STM CUBE B2 Lựa chọn nguyên nhân gây ngắt chân GPIO – PA0 Thiết lập nguyên nhân gây ngắt : 3.3.2 Ngắt GPIO (EXTI) Các bước lập trình với ngắt GPIO STM CUBE B2 Lựa chọn nguyên nhân gây ngắt 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 PA0 External Interrupt Mode with Falling edge trigger detection 3.3.2 Ngắt GPIO (EXTI) Các bước lập trình với ngắt GPIO STM CUBE B2 Lựa chọn nguyên nhân gây ngắt 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 GPIO (EXTI) Các bước lập trình với ngắt GPIO STM CUBE B3 Thiết lập ưu tiên ngắt Lựa chọn NVIC 3.3.2 Ngắt GPIO (EXTI) Các bước lập trình với ngắt GPIO 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 ngồi GPIO (EXTI) Các bước lập trình với ngắt GPIO 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 GPIO (EXTI) Các bước lập trình với ngắt GPIO STM CUBE Lựa chọn chân chiều vào, chiều ra, mode Thiết lập thông số STM32CubeMX hướng dẫn lập trình với GPIO Sau chọn GENERATE CODE để tạo file Code Khung chương trình sử dụng ngắt – Ví dụ ngắt PA0 #include "main.h" void SystemClock_Config(void); static void MX_GPIO_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); while (1) {} } static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); void EXTI0_IRQHandler(void) { if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==0) { } HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0); } HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4); HAL_NVIC_SetPriority(EXTI0_IRQn, 1, 0); HAL_NVIC_EnableIRQ(EXTI0_IRQn); } 3.3.2 Ngắt ngồi GPIO (EXTI) Ví dụ 01: Lập trình điều khiển LED1 (PA10) sáng nhấp nháy (nhanh) với chu kì 200ms, 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 Khung chương trình sử dụng ngắt – Ví dụ ngắt PA0 #include "main.h" void SystemClock_Config(void); static void MX_GPIO_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); while (1) { HAL_GPIO_WritePin(GPIOA,GPIO_PIN_10,GPIO_PIN_SET); HAL_Delay(100); HAL_GPIO_WritePin(GPIOA,GPIO_PIN_10,GPIO_PIN_RESET); HAL_Delay(100); } } static void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_0; GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4); HAL_NVIC_SetPriority(EXTI0_IRQn, 1, 0); HAL_NVIC_EnableIRQ(EXTI0_IRQn); } Khung chương trình sử dụng ngắt – Ví dụ ngắt PA0 //Chương trình phục vụ ngắt – viết file “stm32f1xx_it.c” Hoặc “main.c” void EXTI0_IRQHandler(void) { if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==0) { for(int i=0;i