文章目录
前言
一、EXTI-外部中断
二、程序说明
1.主函数
2.中断函数
总结
前言
学习嵌入式的时候不可避免会接触到中断这个概念,我们平时接触也是最多的,在刚开始学习stm32单片机的时候,听到中断这个概念一头雾水,慢慢接触多了后发现这个是真的好用,也非常简单。在学习国产GD32系列单片机的时候,中断的学习也是基本适用,所以很快上手。
`
一、EXTI-外部中断
GD32F303的Cortex-M4集成了嵌套式矢量型中断控制器(Nested Vectored Interrupt Controller (NVIC))来实现高效的异常和中断处理。NVIC实现了低延迟的异常和中断处理,以及电源管理控制。它和内核是紧密耦合的。更多关于NVIC 的说明请参考《Cortex-M4 技术参考手册》。EXTI(中断/事件控制器)包括20个相互独立的边沿检测电路并且能够向处理器内核产生中断请求或唤醒事件。EXTI有三种触发类型:上升沿触发、下降沿触发和任意沿触发。EXTI中的每一个边沿检测电路都可以独立配置和屏蔽。 外部中断的控制逻辑如下图,检测外部中断线上的电平信号,设置成上升沿触发、下降沿触发和任意沿触发,任意沿触发就是发生上升沿或下降沿都会触发,在不确定外部初始电平的情况下使用。当发生了一个边沿跳变,信号就会到NVIC中断控制器,然后交给内核处理是否响应中断,除了外部中断外,其它所有的中断都要经过NVIC中断控制寄存器处理,每个中断源都可以在中断向量表中找到。
下图就是外部中断线在向量表中的位置。还有一些其它重要的中断请参考数据手册。 上图就详细说明了外部中断线对应的引脚情况,跟32单片机类似,GPIO_PIN_X相同的脚对应相同的EXTI_X。所以在使用两个外部中断以上时,引脚的PIN序号不能一样。
二、程序说明
1.主函数
例如,使用EXTI1作为外部中断源,所以PA/PB/PC/PD_1任选一个引脚作为外部输入,如PA_1 下面一步步分析。
//配置PA1外部中断
rcu_periph_clock_enable(RCU_GPIOA);//GPIOA时钟使能
gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_1);//PA1配置成浮空输入
gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOA, GPIO_PIN_SOURCE_1);//connect key EXTI line to key GPIO pin
exti_init(EXTI_1, EXTI_INTERRUPT, EXTI_TRIG_FALLING);//下降沿中断
exti_interrupt_flag_clear(EXTI_1);//清中断标志
nvic_irq_enable(EXTI1_IRQn, 2U, 0U);//enable and set key EXTI interrupt to the lowest priority
首先打开GPIOA的时钟,这个很好理解,运行之前,“心脏”肯定得打开,接着是初始化配置GPIO,设置成浮空输入模式,速度50Mhz,GPIO的1引脚。此脚连接了按键,可以实现边沿跳变。 第三步是将GPIOA_1设置成外部中断触发源,我们看下函数
/*!
\brief select GPIO pin exti sources
\param[in] output_port: gpio event output port
only one parameter can be selected which are shown as below:
\arg GPIO_PORT_SOURCE_GPIOA: output port source A
\arg GPIO_PORT_SOURCE_GPIOB: output port source B
\arg GPIO_PORT_SOURCE_GPIOC: output port source C
\arg GPIO_PORT_SOURCE_GPIOD: output port source D
\arg GPIO_PORT_SOURCE_GPIOE: output port source E
\arg GPIO_PORT_SOURCE_GPIOF: output port source F
\arg GPIO_PORT_SOURCE_GPIOG: output port source G
\param[in] o