|
应用实例 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 选择32kHz振荡器作为时钟源。 6.2.2 宏 WDT_CLK_SRC_RCSYS - #define WDT_CLK_SRC_RCSYS
复制代码选择系统RC振荡器(RCSYS)作为时钟源。 6.2.3 宏 WDT_MODE_BASIC 基本模式。 6.2.4 宏 WDT_MODE_WINDOW 窗口模式。
6.3 函数定义 6.3.1 函数 wdt_clear() 重新启动看门狗定时器。 - void wdt_clear( struct wdt_dev_inst *const dev_inst)
复制代码6.3.2 函数 wdt_disable() 禁止WDT模块。 - void wdt_disable( struct wdt_dev_inst *const dev_inst )
复制代码6.3.3 函数 wdt_enable() 启用WDT模块。 - void wdt_enable( struct wdt_dev_inst *const dev_inst)
复制代码6.3.4 函数 wdt_get_config_defaults() 将一个看门狗定时器配置结构体初始化为默认值。 - void wdt_get_config_defaults( struct wdt_config *const cfg)
复制代码6.3.5 函数 wdt_get_status() 获取看门狗定时器的状态。 - uint32_t wdt_get_status( struct wdt_dev_inst *const dev_inst)
复制代码6.3.6 函数 wdt_init() 初始化WDT模块。 - 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。 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振荡器作为看门狗时钟,首先应确保已被打开: - /* Enable WDT clock source if need */
- if ((wdt_ut_stage & WDT_UT_STAGE_MASK) == WDT_UT_STAGE_WM) {
- /* Enable WDT clock source if need */
- if (BPM->BPM_PMCON & BPM_PMCON_CK32S) {
- /* Enable 32K RC oscillator */
- if (!osc_is_ready(OSC_ID_RC32K)) {
- osc_enable(OSC_ID_RC32K);
- osc_wait_ready(OSC_ID_RC32K);
- }
- } else {
- /* Enable external OSC32 oscillator */
- if (!osc_is_ready(OSC_ID_OSC32)) {
- osc_enable(OSC_ID_OSC32);
- osc_wait_ready(OSC_ID_OSC32);
- }
- }
复制代码8.3.1 设置示例代码 在C文件应用程序中添加以下代码来设置看门狗: 8.3.2 设置工作流程 1. 创建变量保存看门狗实例和配置: - // WDT instance
- struct wdt_dev_inst wdt_inst;
- // WDT configuration
- struct wdt_config wdt_cfg;
复制代码2. 获取默认的配置,修改超时时间为0.57s (Ttimeout = 2pow(PSEL+1) / Fclk_cnt = 65535 /115000)。 - wdt_get_config_defaults(&wdt_cfg);
- wdt_cfg.timeout_period = WDT_PERIOD_65536_CLK;
复制代码3. 初始化看门狗: - wdt_init(&wdt_inst, WDT, &wdt_cfg);
复制代码
8.4 应用步骤 8.4.1 应用示例代码 例如,添加到C应用文件main循环: - wdt_enable(&g_wdt_inst);
- while (1) {
- wdt_clear(&g_wdt_inst);
- // delay 100ms
- }
复制代码8.4.2 应用工作流程 1. 启用看门狗: 2. 每100ms喂狗一次。 - while (1) {
- wdt_clear(&g_wdt_inst);
- // delay 100ms
- }
复制代码3. 现在已创建守护进程程序。 使用wdt_clear后创建的MCU任务由看门狗进行监视。如果任务持续超过0.57秒,看门狗超时周期的选项应据此做出相应调整。
8.5 WDT复位MCU 通过产生WDT复位尽快复位MCU。 - bool ret;
- ret = wdt_reset_mcu();
复制代码
|