本文以 立創·天空星開發板-GD32F407VET6-青春版 作為學習的板子,記錄學習筆記。
立創·天空星開發板-GD32F407VE-EXTI
- 中斷
- 硬件觸發中斷示例
- 軟件觸發中斷示例
中斷
中斷分為內部中斷和外部中斷
外部中斷是由外部設備(如按鍵、傳感器、通信接口等)產生的中斷請求信號,需要通過中斷控制器進行處理。
通常情況下,外部中斷是通過中斷輸入引腳連接到中斷控制器,由中斷控制器檢測到外部中斷請求,然后觸發相應的中斷服務程序進行處理。
內部中斷是由處理器內部產生的中斷請求信號,通常是由串口、定時器、DMA控制器、系統時鐘等硬件設備產生的中斷請求,需要通過中斷控制器進行處理。
與外部中斷不同的是,內部中斷不需要外部設備的觸發,而是由硬件設備自身產生中斷請求,由中斷控制器檢測到并觸發相應的中斷服務程序進行處理。
硬件觸發中斷示例
使用外部中斷來檢測 PA0 的電平變化。代碼如下:
#include "gd32f4xx.h"
#include "systick.h"#include "ExtendedUSART.h"// 核心板 PA0 引腳觸發中斷的配置
void EXTI0_config() {// PA0rcu_periph_clock_enable(RCU_GPIOA);gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_0);// SYSCFGrcu_periph_clock_enable(RCU_SYSCFG);syscfg_exti_line_config(EXTI_SOURCE_GPIOA, EXTI_SOURCE_PIN0);// NVICnvic_irq_enable(EXTI0_IRQn, 2, 2);// EXTIexti_init(EXTI_0, EXTI_INTERRUPT, EXTI_TRIG_BOTH);exti_interrupt_enable(EXTI_0);exti_interrupt_flag_clear(EXTI_0);
}void EXTI0_IRQHandler() {if(SET == exti_interrupt_flag_get(EXTI_0)) {exti_interrupt_flag_clear(EXTI_0);if(RESET == gpio_input_bit_get(GPIOA, GPIO_PIN_0)) {printf("EXTI_0 interrupted by PA0 released!");} else {printf("EXTI_0 interrupted by PA0 pressed!");}}
}int main(void) {systick_config();EXTI0_config();USART0_config();USART0_send_string("GD32 is running!\r\n");while(1) { }
}
軟件觸發中斷示例
#include "gd32f4xx.h"
#include "systick.h"#include "ExtendedUSART.h"// 軟件觸發中斷的配置
void EXTI2_config() {// NVICnvic_irq_enable(EXTI2_IRQn, 2, 2);// EXTIexti_init(EXTI_2, EXTI_INTERRUPT, EXTI_TRIG_NONE);exti_interrupt_enable(EXTI_2);exti_interrupt_flag_clear(EXTI_2);
}void EXTI2_IRQHandler() {if(SET == exti_interrupt_flag_get(EXTI_2)) {exti_interrupt_flag_clear(EXTI_2);printf("EXTI_2 interrupted!\n");}
}void USART0_on_received(uint8_t* dat, uint32_t len) {printf("received data: %s. ", dat);// 當串口收到數據后。手動觸發中斷exti_software_interrupt_enable(EXTI_2);
}int main(void) {systick_config();EXTI2_config();USART0_config();USART0_send_string("GD32 is running!\r\n");while(1) { }
}