| 第六章 外部中断试验 这一章,将向大家介绍如何使用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函数实现的。         [mw_shl_code=applescript,true]
 void EXTI_Init(PAD_Type Px, EXTI_InitTypeDef* EXTI_InitStruct);[/mw_shl_code]
 | [/table] 
 |  | 下面用一个使用范例来说明EXTI_Init函数的使用。       
 |  | [mw_shl_code=applescript,true] 
 |  | 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);[/mw_shl_code] 
 |  | 例子中选择了PC12作为外部中断源,中断的模式为外部中断,中断触发条件为下降沿触发。在来看看结构体EXTI_InitTypeDef的成员变量。       
 |  | [mw_shl_code=applescript,true] 
 |  | typedef struct 
 |  | { 
 |  | uint32_t EXTI_Line; 
 |  | EXTIMode_TypeDef EXTI_Mode; 
 |  | EXTITrigger_TypeDef EXTI_Trigger; 
 |  | }EXTI_InitTypeDef;[/mw_shl_code] | 
 
 从定义中可以看出,有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函数,该函数代码如下:      [table=98%] 
 [mw_shl_code=applescript,true]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);                                // 使能外部中断
 }[/mw_shl_code]
 
 
 可以看到将PC12引脚设置成了输入模式了之后,在选择PC12作为外部中断源。最后设置NVIC。 在看看外部中断的中断服务函数:       | [mw_shl_code=applescript,true]void EXTI_Handler(void){
 delay_soft_ms(100);
 if(GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_12) == (uint32_t)Bit_RESET)
 {
 exti_init_test();
 }
 }[/mw_shl_code]
 
 | 
 
 使用的是按键触发中断所以加了100毫秒的软件延时来消抖,因为外部中断服务函数只有一个所以要读取引脚判断是那个引脚触发了外部中断,最后通过串口2会发一串数据来验证按键中断是否被触发了。6.4 下载验证 在编译成功之后,就可以下载代码到W7500EVB上,实际验证一下程序是否正确。下载代码后,在串口调试助手里面可以看到,只要按下按键串口就会打印数据出来,如图6.4.1所示:   图6.4.1 W7500EVB外部中断试验结果   
 |