EXTI(中断/事件控制器)
NVIC(嵌套式矢量型中断控制器)
EXTI有三种触发类型:上升沿触发、下降沿触发和任意沿触发。
触发响应方式:中断响应/事件响应。
EXTI可以监测指定GPIO口的电平信号,当其指定的GPIO口产生电平变化时,EXTI将立即向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU执行EXTI对应的中断程序。
EXTI框图
程序
1.使能GPIO口时钟,配置IO口模式
2.使能AF中断线时钟
3.中断来源选择(来自哪个IO口)
4.终端初始化 中断or事件模式,上升or下降or上升下降触发模式
5.设置NVIC优先组,然后基于优先级配置抢占优先级和响应优先级http://t.csdn.cn/jsRZd
6.两类标志位获取函数
#include "gd32f10x.h" // Device header
uint16_t CountSensor_Count;
void CountSensor_Init(void)
{
rcu_apb2_clock_config(RCU_APB2_CKAHB_DIV1);
rcu_periph_clock_enable(RCU_GPIOB); //使能RCU_GPIOB时钟
/* enable the AF clock */
rcu_periph_clock_enable(RCU_AF);
gpio_init(GPIOB, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, GPIO_PIN_14);
/* connect key EXTI line to key GPIO pin */
gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOB, GPIO_PIN_SOURCE_14);
/* configure key EXTI line */
exti_init(EXTI_14, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
exti_interrupt_flag_clear(EXTI_14);
/* enable and set key EXTI interrupt to the specified priority */
nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);
nvic_irq_enable(EXTI10_15_IRQn, 1U, 1U);
}
uint16_t CountSensor_Get(void)
{
return CountSensor_Count;
}
void EXTI10_15_IRQHandler(void)
{
if (exti_interrupt_flag_get(EXTI_14) == SET)
{
if(gpio_input_bit_get(GPIOB, GPIO_PIN_14) == 0)
{
CountSensor_Count++;
}
exti_interrupt_flag_clear(EXTI_14);
}
}
在中断函数里尽量不要加入运行时间过长的程序,也不要加入直接操作硬件的程序,最好是使用变量和标志位。