0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于RT-Thread对N32L40XCL的看门狗定时器进行测试

冬至子 来源:zealsoft 作者:zealsoft 2023-08-08 17:24 次阅读

模块介绍

N32L40XCL 内置独立看门狗(IWDG)和窗口看门狗(WWDG)定时器,解决软件错误导致的问题。看门狗定时器使用非常灵活,提高了系统的安全性和定时控制的准确性。

独立看门狗(IWDG)由运行在 40KHz 的低速内部时钟(LSI 时钟)驱动,在死循环事件或 MCU 卡死发生时,它仍然可以运行。这可以提供更高的安全级别、定时精度和看门狗的灵活性。它可以通过重置来解决由于软件故障引起的系统故障。IWDG 最适合需要看门狗在主应用程序之外作为完全独立进程运行但时序精度限制较低的应用程序。

窗口看门狗(WWDG)的时钟是由 APB1 时钟频率除以 4096 得到的,通过时间窗口的配置来检测程序运行是否异常。因此,WWDG 适用于精确定时,常用于监控因外部干扰或无法预见的逻辑条件导致应用程序偏离其正常操作顺序的软件故障。当 WWDG 递减计数器在达到窗口寄存器值之前或 WWDG_CTRL.T6 位变为 0 之后刷新时,系统复位发生。

官方WDT驱动实现的是独立看门狗(IWDG)。

开发软件
开发环境:
RT-Thread Studio 2.2.6
RT-Thread版本:4.0.2
下载工具:pyocd

步骤说明

新建工程

打开RT-Thread settings,使能Watchdog Timer,如下图所示。

1.jpg

添加保存后,进行编译,若无问题,则进行下一步。

编写测试程序

编写测试程序如下:

#include
#include
#include
/* defined the LED3 pin: PB5 /
#define LED3_PIN GET_PIN(B, 5)
#define WDT_DEVICE_NAME "wdt" /
看门狗设备名称 /
static rt_device_t wdg_dev; /
看门狗设备句柄 /
static void idle_hook(void)
{
/
在空闲线程的回调函数里喂狗 /
rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_KEEPALIVE, NULL);
//rt_kprintf("feed the dog!n ");
}
int main(void)
{
/
set LED3 pin mode to output /
rt_pin_mode(LED3_PIN, PIN_MODE_OUTPUT);
rt_err_t ret = RT_EOK;
rt_uint32_t timeout = 3000; /
溢出时间,单位:毫秒 /
char device_name[RT_NAME_MAX];
rt_strncpy(device_name, WDT_DEVICE_NAME, RT_NAME_MAX);
/
根据设备名称查找看门狗设备,获取设备句柄 /
wdg_dev = rt_device_find(device_name);
if (!wdg_dev)
{
rt_kprintf("find %s failed!n", device_name);
return RT_ERROR;
}
/
设置看门狗溢出时间 /
ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_SET_TIMEOUT, &timeout);
if (ret != RT_EOK)
{
rt_kprintf("set %s timeout failed!n", device_name);
return RT_ERROR;
}
/
启动看门狗 /
ret = rt_device_control(wdg_dev, RT_DEVICE_CTRL_WDT_START, RT_NULL);
if (ret != RT_EOK)
{
rt_kprintf("start %s failed!n", device_name);
return -RT_ERROR;
}
/
根据设备名称查找看门狗设备,获取设备句柄 /
wdg_dev = rt_device_find(device_name);
if (!wdg_dev)
{
rt_kprintf("find %s failed!n", device_name);
return RT_ERROR;
}
/
设置空闲线程回调函数 */
rt_thread_idle_sethook(idle_hook);
while (1)
{
rt_pin_write(LED3_PIN, PIN_HIGH);
rt_thread_mdelay(500);
rt_pin_write(LED3_PIN, PIN_LOW);
rt_thread_mdelay(500);
}
}

代码验证

程序很简单,初始化看门狗后,在空闲线程回调函数中不断喂狗即可。在正式使用看门狗时,取消回调函数中的打印。

下载程序后运行。

如果终端打印提示“warning: tidle0 stack is close to end of stack address.”,请在rtconfig.h文件中搜索IDLE_THREAD_STACK_SIZE,并扩大该栈空间。默认值是256,可以扩大到512。

程序中使用RT_DEVICE_CTRL_WDT_SET_TIM命令设置超时时间,需要注意对于N32L40XCL开发板的驱动程序而言,这个超时时间的单位是毫秒,而有些RT-Thread的驱动程序这个超时时间的单位是秒。

此外,这个超时时间不能设置过长,因为过长会超过N32L40XCL寄存器的范围。对于默认配置,这个超时时间不能超过376ms。否则程序会打印如下错误信息

[W/DBG] wdg set timeout parameter too large, please less than 3276 ms

set wdt timeout failed!

具体的工作原理可以参考下面这段drv_wdt.c的代码:

case RT_DEVICE_CTRL_WDT_SET_TIMEOUT:
    {
        RT_ASSERT(*(uint16_t *)args != 0);
        reload_value = *(uint16_t *)args;
        if(reload_value >  0xFFF * 32 *1000 / LsiFreq)
        {
            LOG_W("wdg set timeout parameter too large, please less than %d msn", 0xFFF * 32 *1000 / LsiFreq);
            return -RT_EINVAL;
        }
        /* Enable write access to IWDG_PR and IWDG_RLR registers */
        IWDG_WriteConfig(IWDG_WRITE_ENABLE);
        /* IWDG counter clock: LSI/32 */
        IWDG_SetPrescalerDiv(IWDG_PRESCALER_DIV32);
        reload_value = ((uint32_t)reload_value * LsiFreq / 1000) / 32;
        IWDG_CntReload(reload_value);
        IWDG_WriteConfig(IWDG_WRITE_DISABLE);
    }

如果注释掉上面idle_hook中的喂狗语句,则可以看到程序每3秒重启一次。

章节总结

通过测试,可以验证N32L40XCL芯片的WDT驱动程序可以正常运行。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5032

    浏览量

    117741
  • RT-Thread
    +关注

    关注

    31

    文章

    1149

    浏览量

    38894
  • MCU控制器
    +关注

    关注

    0

    文章

    27

    浏览量

    6820
  • WWDG
    +关注

    关注

    0

    文章

    19

    浏览量

    5460
  • IWDG
    +关注

    关注

    0

    文章

    21

    浏览量

    5136
收藏 人收藏

    评论

    相关推荐

    RT-Thread记录(四、RTT时钟节拍和软件定时器

    RT-Thread第4课,听听 RT-Thread 的心跳,再学习一下基于心跳的软件定时器使用。
    的头像 发表于 06-20 11:50 6572次阅读
    <b class='flag-5'>RT-Thread</b>记录(四、RTT时钟节拍和软件<b class='flag-5'>定时器</b>)

    N32L40XCL-STB的I2C测试步骤

    本人基于 rt-thread studio 对 N32L40XCL 进行I2C测试。具体表现为使用 N32L40XCL 的 I2C1 (PA
    的头像 发表于 09-18 17:35 931次阅读
    N32L<b class='flag-5'>40XCL</b>-STB的I2C<b class='flag-5'>测试</b>步骤

    RT-Thread Nano入门:独立看门狗(IWDT)

    本文主要介绍怎么用RT-Thread Nano实现独立看门狗IWDT驱动,创建一个喂狗线程,实现定时喂狗功能。
    的头像 发表于 11-22 11:04 832次阅读
    <b class='flag-5'>RT-Thread</b> Nano入门:独立<b class='flag-5'>看门狗</b>(IWDT)

    看门狗定时器硬件外设参考设计

    内部看门狗定时器属于硬件外设,几乎是所有单片微控制的一个组成部分,可与板载外设和系统时钟进行交互(图 1)。 默认情况下,内部看门狗
    发表于 07-23 09:32

    看门狗定时器是什么

    简介  看门狗定时器是单片机的一个组成部分,在单片机程序的调试和运行中都有着重要的意义。看门狗定时器(WDT,Watch Dog Timer)实际上是一个计数
    发表于 07-13 06:34

    看门狗定时器

    看门狗定时器(WDT:Watch Dog Timer)实际上是一个计数。 一般给看门狗一个大数,程序开始运行后看门狗开始倒计数。 如果程序
    发表于 07-21 07:35

    什么是看门狗定时器

    看门狗看门狗是什么看门狗定时器(WDT, Watch Dog Timer)是单片机的一个组成部分,它实际上是一个计数,一般给
    发表于 07-21 06:37

    什么是看门狗定时器

    STM32看门狗1.简介:首先我们要知道什么是看门狗看门狗定时器(WDT,Watch Dog Timer)实际上是一个计数,一般给
    发表于 07-30 08:22

    看门狗定时器概念

    目录1、看门狗定时器(WDT,Watch Dog Timer)2、嘀嗒定时器3、普通定时器和高级定时器开发板为洋桃一号开发板,MCU为STM
    发表于 07-30 07:52

    怎样去使用看门狗定时器

    看门狗定时器是什么?看门狗定时器有何应用?怎样去使用看门狗定时器呢?
    发表于 11-09 06:44

    如何对看门狗定时器WDT进行配置呢

    什么是看门狗定时器WDT呢?如何对看门狗定时器WDT进行配置呢?
    发表于 01-17 06:27

    看门狗定时器的相关资料分享

    看门狗定时器用来防止程序因供电电源、空间电磁干扰或其它原因引起的强烈干扰噪声而跑飞的事故。在很多单片机中都内置了看门狗看门狗本身是一个定时器
    发表于 01-24 07:24

    看门狗定时器WDT是什么

    看门狗定时器WDT,是微控制运行状态的监控系统,在微控制内部程序跑飞后,微控制的控制功能将进入混乱状态,这个时候
    发表于 02-15 07:07

    看门狗定时器模块的特点包括哪些呢

    看门狗定时器是一个32位定时器,可以用作看门狗或间隔定时器看门狗
    发表于 02-15 07:35

    RT-Thread中怎样使用看门狗才能让程序正常运行呢

    目前如果要在 rt-thread 中使用看门狗让程序正常运行,则需要在空线程中喂狗,或者单独起一个线程喂狗。但是这个的设计是否能胜任要求稍微高一点的产品呢?看门狗是确保软件质量的关键模块,狗叫是确保软件正常运行的兜底功能,这样的
    发表于 09-29 11:43