查看: 1939  |  回复: 1
M0+MAC+TCP/IP 以太网单芯片方案 W7500EVB用户手册连载(5)--实战篇
WSGustin
29
主题
48
回复
发表于2018-03-01 16:08:11 | 只看该作者
1# 电梯直达
W7500(W7500P)芯片简介: 
W7500 芯片为工业级以太网单芯片解决方案, 集成 ARM Cortex-M0,128KB Flash 及全硬件TCP/IP 核(和W5500、W5100内核一致),特别适用于物联网领域。 使用 W7500EVB, 让您轻松完成原型开发。
全硬件TCP/IP核的最大优点是他在执行联网操作时不需要占用MCU的运行资源,大大增加了MCU的工作效率。

这一章,将向大家介绍如何使用 W7500 的外部输入中断。在前面几章的学习中,我们掌握了W7500 的 IO 口最基本的操作。 本章介绍如何将W7500 的 IO 口作为外部中断来使用。

想了解更多关于WIZnet W7500更多信息,或者有技术问题请联系我们:gustin@wisioe.com
深圳炜世科技—WIZnet官方代理商,全程技术支持,价格绝对优势!
电话:0755-86568556

邮箱:support@wisioe.com


W7500EVB开发板指南.pdf 

WSGustin
29
主题
48
回复
发表于2018-03-01 16:25:23   |  只看该作者
2#

第六章 外部中断试验

这一章,将向大家介绍如何使用 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所示:

 

图6.4.1 W7500EVB外部中断试验结果





主题

回复
  • 温馨提示: 标题不合格、重复发帖、发布广告贴,将会被删除帖子或禁止发言。 详情请参考: 社区发帖规则
  • 您当前输入了 0 个文字。还可以输入 8000 个文字。 已添加复制上传图片功能,该功能目前仅支持chrome和火狐

禁言/删除

X
请选择禁言时长:
是否清除头像:
禁言/删除备注:
昵 称:
 
温馨提示:昵称只能设置一次,设置后无法修改。
只支持中文、英文和数字。

举报

X
请选择举报类型:
请输入详细内容:

顶部