立创·天空星开发板-GD32F407VE-EXTI

本文以 立创·天空星开发板-GD32F407VET6-青春版 作为学习的板子,记录学习笔记。

立创·天空星开发板-GD32F407VE-EXTI

中断

中断分为内部中断和外部中断

外部中断是由外部设备(如按键、传感器、通信接口等)产生的中断请求信号,需要通过中断控制器进行处理。

通常情况下,外部中断是通过中断输入引脚连接到中断控制器,由中断控制器检测到外部中断请求,然后触发相应的中断服务程序进行处理。

内部中断是由处理器内部产生的中断请求信号,通常是由串口、定时器、DMA控制器、系统时钟等硬件设备产生的中断请求,需要通过中断控制器进行处理。

与外部中断不同的是,内部中断不需要外部设备的触发,而是由硬件设备自身产生中断请求,由中断控制器检测到并触发相应的中断服务程序进行处理。

硬件触发中断示例

使用外部中断来检测 PA0 的电平变化。代码如下:

c 复制代码
#include "gd32f4xx.h"
#include "systick.h"

#include "ExtendedUSART.h"

// 核心板 PA0 引脚触发中断的配置
void EXTI0_config() {
	// PA0
	rcu_periph_clock_enable(RCU_GPIOA);
	gpio_mode_set(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_NONE, GPIO_PIN_0);
	
	// SYSCFG
	rcu_periph_clock_enable(RCU_SYSCFG);
	syscfg_exti_line_config(EXTI_SOURCE_GPIOA, EXTI_SOURCE_PIN0);
	
	// NVIC
	nvic_irq_enable(EXTI0_IRQn, 2, 2);
	
	// EXTI
	exti_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) { }
}

软件触发中断示例

c 复制代码
#include "gd32f4xx.h"
#include "systick.h"

#include "ExtendedUSART.h"

// 软件触发中断的配置
void EXTI2_config() {
	// NVIC
	nvic_irq_enable(EXTI2_IRQn, 2, 2);
	
	// EXTI
	exti_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) { }
}
相关推荐
Hello_Embed4 小时前
STM32HAL 快速入门(二十):UART 中断改进 —— 环形缓冲区解决数据丢失
笔记·stm32·单片机·学习·嵌入式软件
咸甜适中5 小时前
rust语言 (1.88) 学习笔记:客户端和服务器端同在一个项目中
笔记·学习·rust
Grassto5 小时前
RAG 从入门到放弃?丐版 demo 实战笔记(go+python)
笔记
Magnetic_h6 小时前
【iOS】设计模式复习
笔记·学习·ios·设计模式·objective-c·cocoa
研梦非凡6 小时前
ICCV 2025|从粗到细:用于高效3D高斯溅射的可学习离散小波变换
人工智能·深度学习·学习·3d
limengshi1383927 小时前
机器学习面试:请介绍几种常用的学习率衰减方式
人工智能·学习·机器学习
知识分享小能手8 小时前
React学习教程,从入门到精通,React 组件核心语法知识点详解(类组件体系)(19)
前端·javascript·vue.js·学习·react.js·react·anti-design-vue
周周记笔记9 小时前
学习笔记:第一个Python程序
笔记·学习
丑小鸭是白天鹅9 小时前
Kotlin协程详细笔记之切线程和挂起函数
开发语言·笔记·kotlin
潘达斯奈基~9 小时前
《大数据之路1》笔记2:数据模型
大数据·笔记