野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 7129|回复: 1

M0+MAC+TCP/IP 以太网单芯片方案 W7500EVB用户手册连载(6)--实战篇

[复制链接]
发表于 2018-3-5 14:57:04 | 显示全部楼层 |阅读模式
W7500(W7500P)芯片简介:
W7500 芯片为工业级以太网单芯片解决方案, 集成 ARM Cortex-M0,128KB Flash 及全硬件TCP/IP 核(和W5500、W5100内核一致),特别适用于物联网领域。 使用 W7500EVB, 让您轻松完成原型开发。

全硬件TCP/IP核的最大优点是他在执行联网操作时不需要占用MCU的运行资源,大大增加了MCU的工作效率。

这一章,将向大家介绍如何使用 W7500 的独立看门狗。W7500 内部自带了1个看门狗。在本章中,将通过按键来喂狗,然后串口2提示复位状态。

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

回复

使用道具 举报

 楼主| 发表于 2018-3-5 15:09:58 | 显示全部楼层
第七章 独立WDT试验

这一章,将向大家介绍如何使用 W7500 的独立WDT。W7500 内部自带了1个WDT。在本章中,将通过按键来喂狗,然后串口2提示复位状态。
本章分为如下几个部分:
7.1 W7500 独立
WDT简介
7.2 硬件设计
7.3 软件设计
7.4 下载验证

7.1 W7500 独立WDT简介
WDT功能是基于一个 32 位递减计数器来实现的,这个32位的计数器可以通过WDT的重装载寄存器来设置。该计数器在WDT时钟的每个上升沿减1。并且当计数器递减到 0 之前没有进行喂狗,就发出一个复位信号。从而提供了一种将系统从程序崩溃状态中恢复的方式。
下面在了解一下与独立WDT相关联的几个寄存器,之后再讲解怎么通过库函数来实现配置。首先是锁定寄存器WDTLock,如图7.1.1所示:
7.1.1 W7500 WDTLock寄存器
想要修改WDT寄存器的值,就必须先要向WDTLock 寄存器中写入 0x1ACCE551。
这里可以调用 WDT_Unlock函数来解除WDT寄存器的写保护。
  1. void WDT_Unlock(void);
复制代码
想要设置WDT的重装载值,可以调用WDT_SetWDTLoad函数。
  1. void WDT_SetWDTLoad(uint32_t Load);
复制代码
想要设置WDT的控制寄存器可以调用WDT_SetWDTControl函数。
  1. void WDT_SetWDTControl(uint32_t Control);
复制代码
WDT_SetWDTControl主要是对WDT的控制寄存器进行操作,如图7.1.2所示:
图7.1.2 W7500 控制寄存器
  1. void WDT_Start(void);
复制代码
可以通过WDT_Start函数在指定的地方开启WDT
  1. void WDT_ Stop(void);
复制代码
WDT_ Stop函数可以在指定的地方停止WDT的计数器。
  1. void WDT_IntClear(void);
复制代码
WDT_IntClear函数可以清除WDT中断,同时计数器将重新装载WDTload的值。

7.2 硬件设计
本实验用到的硬件资源有:
1)      串口2
2)      按键
3)      WDT
前面两个在之前都有介绍,而独立WDT实验的核心是在 W7500 内部进行,并不需要外部电路。

7.3 软件设计
在W7500EVB WDT工程里,可以看到工程里面新增了wdt.c文件和wdt.h文件。
wdt.c里面的代码如下:

  1. void WDT_Configuration(uint32_t Load)
  2. {
  3.   WDT_InitTypeDef WDT_InitStruct;
  4.   WDT_InitStruct.WDTLoad = Load;               //加载值
  5.   WDT_InitStruct.WDTControl_RstEn = 0x02;  //启用<span style="background-color: rgb(255, 255, 255); font-family: Arail, 微软雅黑; font-size: 12px;">WDT</span>复位输出
复制代码
在这里可以看到将结构体里的数据设置好后,通过WDT_Init函数进行对寄存器的配置,最后清除WDT中断,就可以启动WDT计数器了。
在主程序里面先初始化系统代码,然后在初始化外部中断按键和WDT,并进入死循环打印计数器的当前计数值。只要按键按下就会进入中断服务函数里进行喂狗操作。
  1. int main()
  2. {
  3. SystemInit(); /* 系统内部时钟初始化 */
  4. delay_init();        /* 系统滴答时钟配置*/
  5. S_UART_Init(115200); /* 初始化串口通信:115200@8-n-2*/
  6. WDT_Configuration(0xffff00); /* WDT初始化 */
  7. Exti_Init(); /* 按键外部中断 */

  8. /*------------------------------------------------------------------------------------------
  9. | 炜世科技—WIZnet W7500官方代理商,全程技术支持,价格绝对优势!|
  10. ------------------------------------------------------------------------------------------*/       

  11. printf("炜世科技W7500EVB\r\n\tWDT测试\r\n");
  12. while(1)
  13. {
  14. printf("Value=%d\r\n",WDT_GetWDTValue());
  15. delay_ms(200);
  16. if(flag)
  17. {
  18. printf("喂狗成功!\r\n");
  19. flag = 0;
  20. }
  21. }
  22. }
复制代码
下面来看看的中断服务函数里的操作。
  1. void EXTI_Handler(void)
  2. {
  3. uint16_t t = 65535;
  4. while(t--);
  5. if(GPIO_ReadOutputDataBit(GPIOC,GPIO_Pin_12) == (uint32_t)Bit_RESET)
  6. {
  7. WDT_IntClear();
  8. flag = 1;
  9. }
  10. }
复制代码
7.4 下载验证
在编译成功之后,下载代码到W7500EVB上,实际验证一下程序是否正确,如图7.4.1所示:

图7.4.1 W7500EVB WDT试验结果



回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-24 14:15 , Processed in 0.040530 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表