第六章 外部中断试验 这一章,将向大家介绍如何使用 W7500 的外部输入中断。在前面几章的学习中,我们掌握了W7500 的 IO 口最基本的操作。 本章介绍如何将W7500 的 IO 口作为外部中断来使用。
本章分为如下几个部分:
6.1 W7500 外部中断简介
6.2 硬件设计
6.3 软件设计
6.4 下载验证
6.1 W7500 外部中断简介这里将介绍 W7500 IO 口的外部中断功能,通过外部中断功能,达到本章试验的效果,即:通过W7500EVB的功能按键,控制板载的 UART2 发送数据。 这章的代码主要分布在固件库的 W7500x_exti.h 和 W7500x_exti.c 文件中。 这里首先介绍一下 W7500 IO 口外部中断的一些基础概念。W7500的每个 IO 都可以作为外部中断的中断输入口。W7500的中断控制器只有1个外部中断/事件请求。 外部中断的初始化是通过 EXTI_Init函数实现的。 - void EXTI_Init(PAD_Type Px, EXTI_InitTypeDef* EXTI_InitStruct);
复制代码下面用一个使用范例来说明EXTI_Init函数的使用。 - EXTI_InitTypeDef EXTI_InitDef;
- EXTI_InitDef.EXTI_Line = GPIO_Pin_12;
- EXTI_InitDef. EXTI_Mode = EXTI_Mode_Interrupt;
- EXTI_InitDef.EXTI_Trigger = EXTI_Trigger_Falling;
- EXTI_Init(PAD_PC, &EXTI_InitDef);
- NVIC_ClearPendingIRQ(EXTI_IRQn);
- NVIC_EnableIRQ(EXTI_IRQn);
复制代码例子中选择了PC12作为外部中断源,中断的模式为外部中断,中断触发条件为下降沿触发。在来看看结构体EXTI_InitTypeDef 的成员变量。 - typedef struct
- {
- uint32_t EXTI_Line;
- EXTIMode_TypeDef EXTI_Mode;
- EXTITrigger_TypeDef EXTI_Trigger;
- }EXTI_InitTypeDef;
复制代码从定义中可以看出,有3个参数需要设置。第一个参数是中断线的标号,取值范围为GPIO_Pin0~GPIO_Pin15。 第二个参数是中断模式,可选值为中断EXTI_Mode_Interrupt 和事件EXTI_Mode_Disable。第三个参数是触发方式,可以是下降沿触发 EXTI_Trigger_Falling或上升沿触发EXTI_Trigger_Rising。 在配置完外部中断之后,接着要做的就是编写中断服务函数。在W7500x_it.c中事先有定义中断服务函数。这里需要说明一下,W7500 的 IO 口外部中断服务函数只有1个,所以进入中断后需要判断是哪个引脚触发了外部中断。
6.2 硬件设计本实验用到的硬件资源有: 1) UART2 2) 按键 3) EXTI外部中断
6.3 软件设计
在W7500EVB EXTI工程里双击exti.c文件,就可以看到该文件里面的代码,先介绍Exti_Init 函数,该函数代码如下: - void Exti_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitDef;
- EXTI_InitTypeDef EXTI_InitDef;
- /* 设置GPIO_Pin_12 为输入端口 */
- GPIO_InitDef.GPIO_Pin = GPIO_Pin_12; // 选择引脚
- GPIO_InitDef.GPIO_Mode = GPIO_Mode_IN; // 设置为输入模式
- GPIO_Init(GPIOC, &GPIO_InitDef); // 使用GPIOC
- PAD_AFConfig(PAD_PC,GPIO_Pin_12,PAD_AF1);
- /* 设置GPIO_Pin_12 为中断端口 */
- EXTI_InitDef.EXTI_Line = GPIO_Pin_12; // 设置 GPIO_Pin_12 为中断源
- EXTI_InitDef. EXTI_Mode = EXTI_Mode_Interrupt; // 选择触发中断
- EXTI_InitDef.EXTI_Trigger = EXTI_Trigger_Falling; // 设置为下降沿中断
- EXTI_Init(PAD_PC, &EXTI_InitDef); // 使用 PAD_PC
- NVIC_ClearPendingIRQ(EXTI_IRQn); // 清除中断等待位
- NVIC_EnableIRQ(EXTI_IRQn); // 使能外部中断
- }
复制代码可以看到将PC12引脚设置成了输入模式了之后,再选择PC12作为外部中断源。最后设置NVIC。 再看外部中断的中断服务函数: - void EXTI_Handler(void)
- {
- delay_soft_ms(100);
- if(GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_12) == (uint32_t)Bit_RESET)
- {
- exti_init_test();
- }
- }
复制代码因为使用的是按键触发中断,所以加了100毫秒的软件延时来消抖,因为外部中断服务函数只有一个,所以要读取引脚判断是那个引脚触发了外部中断,最后通过串口2会发一串数据来验证按键中断是否被触发了。
6.4 下载验证在编译成功之后,就可以下载代码到W7500EVB上,实际验证一下程序是否正确。下载代码后,在串口调试助手里面可以看到,只要按下按键,就会打印数据出来,如图6.4.1所示:
|