提示:其理论知识请见EXIT原理
EXIT常规流程和示例代码
- 一、EXIT配置流程
- 二、示例代码
- 三、EXIT寄存器
- 四、EXIT库函数代码
- exti_init():初始化EXTI线x
- exti_interrupt_enable():EXTI线x中断使能
- exti_interrupt_disable:EXTI线x中断禁能
- exti_flag_get():获取EXTI线x标志位 (获取exti_pd寄存器中对应exti线的值)
- exti_flag_clear:清除EXTI线x标志位(将exti_pd寄存器中对应exti线的值置为0)
- exti_interrupt_flag_get():获取EXTI线x中断标志位
- exti_interrupt_flag_clear():清除EXTI线x中断标志位
- exti_init():初始化EXTI线x
- exti_init():初始化EXTI线x
- exti_init():初始化EXTI线x
- exti_init():初始化EXTI线x
- exti_init():初始化EXTI线x
- exti_init():初始化EXTI线x
一、EXIT配置流程
检测按键上升沿来出发中断。

注意:GPIO管脚采用复用IO模式,选择GPIO的管脚。浮空输入模式。
二、示例代码
//按键的GPIO初始化
static void KeyGpioInit(void)
{
//GPIOA 对于的PIN0初始化
rcu_periph_clock_enable(RCU_GPIOA);
gpio_init(GPIOA, GPIO_MODE_IPU, GPIO_OSPEED_2MHZ, GPIO_PIN_0);
//GPIOAG 对于的PIN13和PIN14初始化
rcu_periph_clock_enable(RCU_GPIOG);
gpio_init(GPIOG, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_2MHZ, GPIO_PIN_13);
gpio_init(GPIOG, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_2MHZ, GPIO_PIN_14);
}
static void KeyExtiInit(void)
{
//################GPIOA口对于的pin13和pin14############
/*使能EXTI时钟*/
rcu_periph_clock_enable(RCU_AF);
//I/O连接到EXTI线
gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOA, GPIO_PIN_SOURCE_0);
/*exit的初始化 配置上升/下降沿*/
exti_init(EXTI_0, EXTI_INTERRUPT, EXTI_TRIG_FALLING);//INTERRUPT中断的意思
/*清除标志*/
exti_interrupt_flag_clear(EXTI_0);
/*使能中断*/
nvic_irq_enable(EXTI0_IRQn, 1, 1); //irqn
//################GPIOG口对于的pin13和pin14############
/*使能EXTI时钟 上面已经执行过一次*/
//rcu_periph_clock_enable(RCU_AF);
/*I/O连接到EXTI线*/
gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOG, GPIO_PIN_SOURCE_13);
/*配置上升/下降沿*/
exti_init(EXTI_13, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
/*清除标志*/
exti_interrupt_flag_clear(EXTI_13);
/*I/O连接到EXTI线*/
gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOG, GPIO_PIN_SOURCE_14);
/*配置上升/下降沿*/
exti_init(EXTI_14, EXTI_INTERRUPT, EXTI_TRIG_FALLING);
/*清除标志*/
exti_interrupt_flag_clear(EXTI_14);
/*使能中断*/
nvic_irq_enable(EXTI10_15_IRQn, 0, 1);
}
/**
***********************************************************
* @brief EXTI0中断服务函数,对应PA0 对于key1 优先级为1
* @param
* @return
***********************************************************
*/
void EXTI0_IRQHandler(void)
{
if (exti_interrupt_flag_get(EXTI_0) != RESET)
{
ToggleLed(LED1);
exti_interrupt_flag_clear(EXTI_0);
while (1);
}
}
/**
***********************************************************
* @brief EXTI10_15中断服务函数,对应PG13 PG14 key2 key3 优先级为00
* @param
* @return
***********************************************************
*/
void EXTI10_15_IRQHandler(void)
{
if (exti_interrupt_flag_get(EXTI_13) != RESET)
{
DelayNms(1000);
ToggleLed(LED2);
exti_interrupt_flag_clear(EXTI_13);
}
if (exti_interrupt_flag_get(EXTI_14) != RESET)
{
DelayNms(1000);
ToggleLed(LED3);
exti_interrupt_flag_clear(EXTI_14);
}
}
注意:
1、EXTI_14叫EXTI线,而EXTI10_15_IRQn叫EXTI10_15_中断。
2、除了nvic_irq_enable需要使用EXTI10_15_IRQn,其余均使用EXTI线。
3、EXTI线和EXTI中断函数对于关系。
4、每个EXTI线都有一个中断标志位(请求挂起寄存器”,代表我中断来了(程序可以通过读取这个寄存器的内容确定来的是哪个中断),当该EXTI线产生中断时,该中断标志位会置1。
exti_interrupt_flag_get(EXTI_14) 获取EXTI线的中断,
而EXTI_14线对于的中断函数为EXTI10_15_IRQHandler。

三、EXIT寄存器

EXTI_PD为 挂起寄存器”,当其置为1时,表示exti产生中断。


四、EXIT库函数代码
exti_init():初始化EXTI线x
void exti_init(exti_line_enum linex, exti_mode_enum mode,
exti_trig_type_enum trig_type)
//linex:EXTI_x
//mode:EXTI_INTERRUPT(中断模式) 和 EXTI_EVENT(中断模式)
//trig_type(触发类型):
// EXTI_TRIG_RISING 上升沿触发 EXTI_TRIG_FALLING 下降沿触发
// EXTI_TRIG_BOTH 上升沿和下降沿均触发
/* configure EXTI_0 */
exti_init(EXTI_0, EXTI_INTERRUPT, EXTI_TRIG_BOTH);
exti_interrupt_enable():EXTI线x中断使能
void exti_interrupt_enable(exti_line_enum linex);
/* enable the interrupts from EXTI line 0 */
exti_interrupt_enable(EXTI_0);
exti_interrupt_disable:EXTI线x中断禁能
void exti_interrupt_disable(exti_line_enum linex);
/* disable the interrupts from EXTI line 0 */
exti_interrupt_disable(EXTI_0);
exti_flag_get():获取EXTI线x标志位 (获取exti_pd寄存器中对应exti线的值)
和exti_interrupt_flag_get()作用一样
FlagStatus exti_flag_get(exti_line_enum linex)
//FlagStatus:SET或RESET
例如:
/* get EXTI line 0 flag status */
FlagStatus state = exti_flag_get(EXTI_0);
exti_flag_clear:清除EXTI线x标志位(将exti_pd寄存器中对应exti线的值置为0)
和exti_interrupt_flag_clear()作用一样
void exti_flag_clear(exti_line_enum linex);
/* clear EXTI line 0 flag status */
exti_flag_clear(EXTI_0);
exti_interrupt_flag_get():获取EXTI线x中断标志位
FlagStatus exti_interrupt_flag_get(exti_line_enum linex);
例如:
/* get EXTI line 0 interrupt flag status */
FlagStatus state = exti_interrupt_flag_get(EXTI_0);
exti_interrupt_flag_clear():清除EXTI线x中断标志位
void exexti_flag_get(ti_interrupt_flag_clear(exti_line_enum linex);
/* clear EXTI line 0 interrupt flag status */
exti_interrupt_flag_clear(EXTI_0);
exti_init():初始化EXTI线x
exti_init():初始化EXTI线x
exti_init():初始化EXTI线x
exti_init():初始化EXTI线x
exti_init():初始化EXTI线x
exti_init():初始化EXTI线x
594



被折叠的 条评论
为什么被折叠?



