admin
发表于: 2015-5-12 22:59:35 | 显示全部楼层

应用实例 AT07902: SAM4L 看门狗定时器

原官方英文文档链接-》SAM4L Watchdog Timer - Atmel Corporation


本文档介绍了看门狗定时器(WDT)的驱动程序。该驱动程序提供到WDT控制器主要特征的访问。看门狗定时器可以用来防止由于软件陷于死循环而导致的系统死锁。它可以产生通常的复位,或者仅仅是处理器复位。

文档概览如下:

● 先决条件

● 模块概述

● 特别注意事项

● 附加信息

● 示例

● API 概述


1. 先决条件

WDT模块依赖于以下几个模块:

● 无


2. 模块概述

如果软件不定期的喂狗,看门狗定时器(WDT)会复位设备。这使得可设备以从已经导致系统不稳定的状态中恢复过来。

WDT有一个内部计数器,其时钟源自系统系统RC振荡器或者32kHz振荡器的一个时钟。

WDT计数器必须由软件定期清除,以避免看门狗复位。如果WDT计数器没有正确清除,设备将重新启动,并从启动向量执行。

如果WDT配置为中断模式,在第一个计数超时将产生中断请求,在第二次计数超时如果中断尚未清除就会产生复位。


3. 特别注意事项

● 看门狗定时器默认是关闭的,可以在conf_board.h打开。

● 当WDT被启用时,始终仍处于睡眠模式。CLK_CNT的时钟源停止时看门狗不能进入睡眠模式。试图这样做将导致芯片进入最低休眠模式,源时钟运行时WDT继续运行。看门狗复位后电源管理器的复位原因寄存器(RCAUSE)的WDT位将被置位。

● WDT总线接口的时钟(CLK_WDT)是由电源管理器生成。复位时该时钟被启用,并且可以在电源管理器中被禁用。建议在禁用时钟前先禁用WDT,防止冻结WDT进入不确定状态。看门狗定时器的时钟有两种可能的时钟源,CLK_CNT:

    1. 系统RC振荡器(RCSYS):当选择为WDT时钟源时,该振荡器始终处于开启状态。

    2. 32kHz的晶体振荡器或RC振荡器(OSC32或RC32):在被用作WDT时钟源前,此振荡器应该在备份系统控制接口寄存器(BSCIF)启用。 OSC32和RC32之间的选择应该在备份电源管理器来完成。 WDT将无法检测此时钟是否停止。

● WDT中断请求线与NVIC相连. 使用WDT中断前应预先设定NVIC。

● 调试操作。在调试操作时WDT计数器不会停止计数,除非内核挂起并且在外设调试寄存器(PDBG)中对应的WDT位被设置。如果调试过程中WDT计数器不停止计数就需要定期喂狗,避免看门狗复位。

● 保险丝。WDT可以在复位时启用。这是由WDTAUTO保险丝控制。


4. 附加信息

关于附加信息,请参阅SAM4L看门狗定时器的附加信息。这包括:

● 缩略语

● 依赖性

● 勘误表

● 模块历史


5. 示例

此驱动程序相关的示例列表,请参阅SAM4L看门狗驱动程序快速入门指南。


6. API概述

6.1 结构体定义

6.1.1 结构体 wdt_config

看门狗定时器实例的配置结构体。该结构体被用户应用程序修改之前应先使用wdt_get_config_defaults()函数初始化。

6.1.2 结构体 wdt_dev_inst

看门狗定时器驱动程序实例的设备实例结构体。该结构体应该由wdt_init() 函数初始化,将实例与设备的特定硬件模块相关联。

6.2 宏定义

6.2.1 宏 WDT_CLK_SRC_32K

  1. #define WDT_CLK_SRC_32K
复制代码

选择32kHz振荡器作为时钟源。

6.2.2 宏 WDT_CLK_SRC_RCSYS

  1. #define WDT_CLK_SRC_RCSYS
复制代码

选择系统RC振荡器(RCSYS)作为时钟源。

6.2.3 宏 WDT_MODE_BASIC

  1. #define WDT_MODE_BASIC
复制代码

基本模式。

6.2.4 宏 WDT_MODE_WINDOW

  1. #define WDT_MODE_WINDOW
复制代码

窗口模式。


6.3 函数定义

6.3.1 函数 wdt_clear()

重新启动看门狗定时器。

  1. void wdt_clear( struct wdt_dev_inst *const dev_inst)
复制代码

6.3.2  函数 wdt_disable()

禁止WDT模块。

  1. void wdt_disable(  struct wdt_dev_inst *const dev_inst )
复制代码

6.3.3 函数 wdt_enable()

启用WDT模块。

  1. void wdt_enable( struct wdt_dev_inst *const dev_inst)
复制代码

6.3.4 函数 wdt_get_config_defaults()

将一个看门狗定时器配置结构体初始化为默认值。

  1. void wdt_get_config_defaults( struct wdt_config *const cfg)
复制代码

6.3.5   函数 wdt_get_status()

获取看门狗定时器的状态。

  1. uint32_t wdt_get_status( struct wdt_dev_inst *const dev_inst)
复制代码

6.3.6 函数 wdt_init()

初始化WDT模块。

  1. bool wdt_init( struct wdt_dev_inst *const dev_inst, Wdt *const wdt, struct wdt_config *const cfg)
复制代码

6.3.7 函数 wdt_reset_mcu()

通过产生WDT复位尽快复位MCU。

  1. bool wdt_reset_mcu(void)
复制代码

6.4 枚举定义

6.4.1 枚举 wdt_period

枚举看门狗定时器模块的可能周期设置,需要一段多项看门狗定时器时钟节拍值。

Ttimeout 公式 Ttimeout = 2pow(PSEL+1) / Fclk_cnt

Ttimeban公式 Ttimeban = 2pow(TBAN+1) / Fclk_cnt


7. SAM4L 看门狗定时器附加信息

7.1 缩略语

下表列出了本模块中使用的缩略语,以及它们的预期含义。

7.2 依赖性


为了使用这个模块,该系统的其他部分必须正确配置。

电源管理

时钟

中断

调试操作

保险丝

WDT可以在复位时启用。这是由WDTAUTO保险丝控制。

7.3 勘误表


没有该驱动程序相关的勘误表

7.4 模块历史

下表列出了该模块历史的概述,包含自第一个发布版本至该模块的增强和修补程序的详细信息。该模块的当前版本对应于下表中的最新版本。

更新日志

文档首次发布。



8. SAM4L 看门狗定时器快速入门指南

以下是SAM4L看门狗定时器驱动程序的快速入门指南,一步一步介绍在选择的使用案例中如何配置和使用驱动程序。

使用案例包含几个代码片段。在设置步骤中的代码片段可以被复制到一个定制的初始化功能,而使用的步骤可以被复制到如main应用函数里面。


8.1 用例

● 基本用例

● WDT复位MCU


8.2 基本用例

在这个基本用例中,看门狗将使用RCSYS作为时钟源,超时时间设置为0.57s。这样看门狗每100ms将会喂狗。

8.2.1 先决条件

● 系统时钟管理(SYSCLOCK)的时钟控制


8.3 设置步骤

注:看门狗时钟(CLK_WDT)复位时打开,默认时钟源为系统RC振荡器(RCSYS)。如果你想使用32kHz振荡器作为看门狗时钟,首先应确保已被打开:

  1. /* Enable WDT clock source if need */
  2. if ((wdt_ut_stage & WDT_UT_STAGE_MASK) == WDT_UT_STAGE_WM) {
  3. /* Enable WDT clock source if need */
  4. if (BPM->BPM_PMCON & BPM_PMCON_CK32S) {
  5. /* Enable 32K RC oscillator */
  6. if (!osc_is_ready(OSC_ID_RC32K)) {
  7. osc_enable(OSC_ID_RC32K);
  8. osc_wait_ready(OSC_ID_RC32K);
  9. }
  10. } else {
  11. /* Enable external OSC32 oscillator */
  12. if (!osc_is_ready(OSC_ID_OSC32)) {
  13. osc_enable(OSC_ID_OSC32);
  14. osc_wait_ready(OSC_ID_OSC32);
  15. }
  16. }
复制代码

8.3.1 设置示例代码

在C文件应用程序中添加以下代码来设置看门狗:

8.3.2 设置工作流程

1. 创建变量保存看门狗实例和配置:

  1. // WDT instance
  2. struct wdt_dev_inst wdt_inst;
  3. // WDT configuration
  4. struct wdt_config wdt_cfg;
复制代码

2. 获取默认的配置,修改超时时间为0.57s (Ttimeout = 2pow(PSEL+1) / Fclk_cnt = 65535 /115000)。

  1. wdt_get_config_defaults(&wdt_cfg);
  2. wdt_cfg.timeout_period = WDT_PERIOD_65536_CLK;
复制代码

3. 初始化看门狗:

  1. wdt_init(&wdt_inst, WDT, &wdt_cfg);
复制代码

8.4 应用步骤

8.4.1 应用示例代码

例如,添加到C应用文件main循环:

  1. wdt_enable(&g_wdt_inst);
  2. while (1) {
  3. wdt_clear(&g_wdt_inst);
  4. // delay 100ms
  5. }
复制代码

8.4.2 应用工作流程

1. 启用看门狗:

  1. wdt_enable(&g_wdt_inst);
复制代码

2. 每100ms喂狗一次。

  1. while (1) {
  2. wdt_clear(&g_wdt_inst);
  3. // delay 100ms
  4. }
复制代码

3. 现在已创建守护进程程序。 使用wdt_clear后创建的MCU任务由看门狗进行监视。如果任务持续超过0.57秒,看门狗超时周期的选项应据此做出相应调整。


8.5 WDT复位MCU

通过产生WDT复位尽快复位MCU。

  1. bool ret;
  2. ret = wdt_reset_mcu();
复制代码






跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 28 | 回复: 31



手机版|

GMT+8, 2024-4-24 20:47 , Processed in 0.049701 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

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