瑞萨RA2E1的看门狗评测


瑞萨RA2E1是一款高性能微控制器,具备多种功能和特性,其中包括看门狗设计。下面来对瑞萨RA2E1的看门狗进行评测。

一、看门狗概述

瑞萨RA2E1的看门狗基于硬件设计实现,采用最常见的喂狗方法,即通过定时喂狗来避免程序异常死机的情况。其定时器在实现看门狗功能时可有效避免由于程序异常而引起的系统无限死循环,从而保障了设备的可靠性和稳定性。

二、看门狗特性

超低功耗:RA2E1微控制器主要面向低功耗领域,低功耗在设备的长期稳定性和功能设计上具有重要意义。

定时喂狗:看门狗定时器的快慢可以根据用户需求进行调整,定时器可以分为多个级别,以实现不同的喂狗时间间隔。同时,RA2E1的看门狗定时器也支持外部触发,适用于实时响应系统开机时间、同时输入信号的情况。

强大的MCU性能:RA2E1微控制器拥有高速工作特性,允许在快速响应性要求的应用中使用,比如较高速率数据传输和实时响应逻辑控制等。

三、看门狗应用场景

RA2E1的看门狗在电源、工控、自动化、家用电器控制等方面应用广泛,确保设备在程序异常崩溃或卡死时仍然能正常工作,避免威胁设备生命和财产安全的异常情况。

总的来说,瑞萨RA2E1的看门狗设计能够满足大部分应用场景的需求,确保设备在强脉冲、较大温度波动和静电等环境因素的影响下具有高度的可靠性和稳定性。

编写瑞萨RA2E1看门狗程序

下面是一个简单的瑞萨RA2E1看门狗程序,用于实现看门狗定时器的初始化和启动。该程序需要先对看门狗定时器进行初始化,然后打开看门狗开关,之后通过定时器定时向看门狗喂狗。

#include "r_cg_macrodriver.h"
#include "r_cg_cgc.h"
#include "r_cg_wdt.h"


void WDT_init(void)
{
    R_WDT_Create();
    R_WDT_Start();
}


void WDT_feed(void)
{
    R_WDT_Restart();
}


int main(void)
{
    // 初始化看门狗定时器
    WDT_init();
   
    while(1)
    {
        // 喂狗
        WDT_feed();
    }

    return 0;
}
在主函数中,首先调用WDT_init函数进行看门狗定时器的初始化。接着在一个死循环中,不断调用WDT_feed函数向看门狗喂狗。在程序异常的情况下,如果程序进入死循环或无限阻塞,看门狗计时器会在超时后自动复位系统,从而避免由于程序异常而引起的系统死机。

此外,需要注意的是,喂狗操作应该尽量放在循环中,以保证定时器在规定时间内得到喂狗,防止看门狗复位系统。同时定时器的时间间隔也应根据具体应用场景进行调整。

编写瑞萨RA2E1跑马灯程序

下面是一个简单的瑞萨RA2E1跑马灯程序,使用GPIO口驱动LED灯实现跑马灯效果。

#include "r_cg_macrodriver.h"
#include "r_cg_cgc.h"

#define LED1 P5.0       //LED1
#define LED2 P5.1       //LED2
#define LED3 P5.2       //LED3
#define LED4 P5.3       //LED4

void LED_init(void)
{
    /* 设置4个LED为输出模式,初始都是熄灭状态 */
    P5 &= 0xF0;
    PM5 &= 0xF0;
}

void LED_flash(void)
{
    int i;
    for(i=0; i<4; i++)
    {
        P5 |= (1<<i);
        R_CGC_delay_us(500000); // 延时500ms
        P5 &= ~(1<<i);
    }
}

int main(void)
{
    LED_init();
   
    while(1)
    {
        LED_flash();
    }

    return 0;
}
在主函数中,首先调用LED_init函数进行GPIO初始化,设置LED端口为输出模式,并将所有LED灯都关闭。之后进入一个无限循环中,在循环中调用LED_flash函数,实现了LED灯的逐个点亮和熄灭,达到跑马灯效果。循环中通过调用R_CGC_delay_us函数实现了每个LED灯亮灭之间的延时,时间为500ms。

需要注意的是,程序中的LED灯端口和延时时间可以根据实际情况进行调整。同时,程序中使用的函数都是瑞萨提供的库函数,需要在代码前添加相应的头文件,并将对应的库文件加入工程。

下面是一个在瑞萨RA2E1芯片上实现12小时跑马灯的程序,并加入了看门狗(Watchdog)功能。

#include "r_cg_macrodriver.h"
#include "r_cg_cgc.h"
#include "r_cg_wdt.h"

#define LED1 P5.0       //LED1
#define LED2 P5.1       //LED2
#define LED3 P5.2       //LED3
#define LED4 P5.3       //LED4

void LED_init(void)
{
    /* 设置4个LED为输出模式,初始都是熄灭状态 */
    P5 &= 0xF0;
    PM5 &= 0xF0;
}

void LED_flash(void)
{
    int i;
    for(i=0; i<4; i++)
    {
        P5 |= (1<<i);
        R_CGC_delay_us(500000); // 延时500ms
        P5 &= ~(1<<i);
    }
}

int main(void)
{
    uint32_t wdt_cyc;  // 看门狗计数器,用于定时喂狗
    WDTIF = 0U;        // 清除看门狗标志位

    LED_init();

    /* 配置看门狗 */
    R_WDT_Create();
    R_WDT_Start();

    /* 程序执行12小时 */
    wdt_cyc = SystemCoreClock / 128 / 16 * 60 * 60 * 12; // 设置看门狗定时器的周期
    while(wdt_cyc > 0)
    {
        if(WDTIF == 1U)
        {
            WDTIF = 0U;
            R_WDT_Restart();
            wdt_cyc--;
        }


        LED_flash();
    }

    return 0;
}


程序添加了看门狗(Watchdog)功能,可以在特定的时间间隔内对程序进行监控,防止程序死循环等异常情况。程序中使用的WDTIF是看门狗中断标志寄存器,其通过WDT中断服务程序中断检测出看门狗定时器溢出后置位,在主函数进行清零。如果在计数期间没有发生中断,系统则会重启或进入本地电源关闭等自定义的保护操作。

在程序中,先定义了一个看门狗计数器,用于限定跑马灯程序的运行时间,本例中为12小时。通过计算得出看门狗定时器的周期,并在程序中设定。在主函数进行循环中断检测的过程中,每当看门狗计时溢出时执行喂狗操作,并将计数器自减1。同时在循环中不断地反复执行LED_flash函数,模拟LED灯跑马灯效果。

需要注意的是,瑞萨的RA2E1芯片上有两个看门狗定时器,分别为WDT和IWDT,可根据实际需求选择。此外,看门狗的定时器周期的设置需要根据实际情况和所用的芯片而定,需进行具体调试和测试。