第26章_瑞萨MCU零基础入门系列教程之独立看门狗定时器-IWDT

news2024/12/27 12:48:20

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写,需要的同学可以在这里获取: https://item.taobao.com/item.htm?id=728461040949

配套资料获取:https://renesas-docs.100ask.net

瑞萨MCU零基础入门系列教程汇总: https://blog.csdn.net/qq_35181236/article/details/132779862


第26章 独立看门狗定时器-IWDT

本章目标

  • 了解A6M5处理器的看门狗定时器及其工作原理;
  • 学会使用RASC配置看门狗定时器,使用其接口函数;

26.1 RA6M5的WDT外设

26.1.1 WDT的特性

IWDT (Independent Watchdog Timer)由一个14位的向下计数器组成,可以将应用程序从错误中恢复处理(比如重启系统)。应用程序必须在允许的计数窗口内进行刷新计时器,如果计数器下溢了,IWDT将复位MCU或生成不可屏蔽中断(NMI)。

瑞萨RA6M5处理器的看门狗定时器的特性见下表:

独立看门狗的时钟源是一个独立的时钟IWDTCLK,PCLKB最大的时钟频率是15kHz,可以使用RASC在BSP中设置IWDTCLK的分频系数。

26.1.2 IWDT的系统框图

IWDT的系统框图如下图所示:

26.1.3 IWDT和WDT的异同

  1. 差异点

瑞萨RA6M5的独立看门狗(IWDT)与看门狗(WDT)的不同点如下:

  • 时钟源不一样,WDT使用外部时钟电路作为时钟源,而IWDT自带时钟源;
  • WDT有寄存器启动和自启动两种模式,IWDT只有自启动这一种模式;
  1. 相同点

独立看门狗(IWDT)与看门狗(WDT)也有很多相似点,主要如下:

  • 都可以选择复位的范围(窗口值);
  • 都可以设置在睡眠模式下是否启动;
  • 都可以设置NMI中断和复位重启;

26.1.4 IWDT的工作原理

  1. 超时时间计算

以IWDTCLK=15kHz为例,假设对IWDT进行了以下配置:

  • 分频系数位256
  • 超时时间周期为2048cycles

那么IWDT的超时时间为:

image3

  1. 运行状态分析

在“Option Function Select Register 0”寄存器中,对于IWDT有一个模式选择位[OFS0.IWDTSTRT]:它被写为0时,IWDT的自动启动模式被使能;写为1就是关闭IWDT的计数。

只有在复位状态下,以下对IWDT在OFS0中的设置才会有效:

  • 配置OFS0.IWDTCKS[3:0]来配置IWDT的时钟分频系数;
  • 配置OFS0.IWDTRPSS[1:0]和OFS0.IWDTRPES[1:0]来设置IWDT的窗口监测始末位置;
  • 配置OFS0.IWDTTOPS[1:0]来设置IWDT的超时周期值cycles;
  • 配置OFS0.IWDTRSTIRQS来使能IWDT的重置输出和中断请求;

当复位状态结束后,IWDT的计数器将会立刻向下计数。在RA6M5的用户手册中展示了一个IWDT的窗口刷新例图:

总结下来就是:

  • 在窗口期内刷新看门狗会让IWDT计数器重新计数且不会触发任何事件或中断;
  • 在没有到窗口期起始位置刷新会触发刷新错误事件,并触发NMI中断;
  • 在超过窗口结束位置但是计数没有溢出期间刷新,会触发刷新错误事件,并触发NMI中断;
  • 如果IWDT计数溢出了,会触发技术溢出事件,触发NMI中断;

也就是说,如果使用了窗口监测,只有在窗口期刷新定时器才会让系统正常运行,否则都会触发NMI中断。

26.2 IWDT模块的使用

26.2.1 模块配置

  1. 添加IWDT Stack

在FSP的Stacks中添加IWDT模块的步骤如下图所示:

  1. 在BSP中配置IWDT

从前文对IWDT的工作原理分析中可以看到,对于IWDT的所有操作都是在OFS0寄存器中进行配置的,而OFS0是在BSP板块里面的“RA6F5 Family”中,如下图所示:

  • Start Mode Select:IWDT启动模式选择

1.1 IWDT is automatically activated after a reset (Autostart mode)(自启动)
1.2 IWDT is Disabled

  • Timeout Period:IWDT计数周期值

1.1 128 cycles
1.2 512 cycles
1.3 1024 cycles
1.4 2048 cycles

  • Dedicated Clock Frequency Divisor:IWDT时钟分频系数(1/16/32/64/128/256),默认128;
  • Window End Position:窗口监测结束位置,默认0%,没有结束位置
  • Window Start Position:窗口监测开始位置,默认100%,没有开始位置
  • Reset Interrupt Request:选择使能触发复位的中断请求(NMI或Reset)
  • Stop Control:停止对WDT控制的条件

1.1 Stop counting when in Sleep, Snooze mode, or Software Standby
1.2 Counting continues (Note: Device will not enter Deep Standby Mode when selected. Device will enter Software Standby Mode)

如果用户选择使用了NMI中断,还需要去RASC的Stacks中找到IWDG Stack模块,设置NMI的中断回调函数名,如下图所示:

26.2.2 配置信息解读

在RASC中配置IWDT并生成工程后,会在hal_data.c中生成结构体全局常量g_iwdt,它被用来表示IWDT设备,代码如下:

const wdt_instance_t g_wdt =
{
    .p_ctrl        = &g_iwdt_ctrl,
    .p_cfg         = &g_iwdt_cfg,
    .p_api         = &g_wdt_on_iwdt
};
  • p_ctrl:iwdt_instance_ctrl_t类型指针成员,用来记录设备状态,记录一些重要信息(比如回调函数);
  • p_cfg:指向IWDT的配置结构体,这个结构体的数值来自在RASC中对IWDT的配置,代码如下:
const wdt_cfg_t g_iwdt_cfg =
{
    .timeout = 0,
    .clock_division = 0,
    .window_start = 0,
    .window_end = 0,
    .reset_control = 0,
    .stop_control = 0,
    .p_callback = nmi_callback,
};
  • p_api:指向了一个wdt_api_t结构体,这个结构体在r_iwdt.c中实现,它封装了IWDT设备的接口函数,代码如下:
const wdt_api_t g_wdt_on_iwdt =
{
    .open        = R_IWDT_Open,
    .refresh     = R_IWDT_Refresh,
    .statusGet   = R_IWDT_StatusGet,
    .statusClear = R_IWDT_StatusClear,
    .counterGet  = R_IWDT_CounterGet,
    .timeoutGet  = R_IWDT_TimeoutGet,
    .callbackSet = R_IWDT_CallbackSet,
};

26.2.3 中断回调函数

在RASC中配置了IWDT的中断回调函数名字,会在hal_data.h中声明此回调函数:

#ifndef nmi_callback
void nmi_callback(wdt_callback_args_t * p_args);
#endif

用户需要实现这个回调函数,例如:

void nmi_callback(wdt_callback_args_t * p_args)
{
    (void)p_args;
}

26.2.4 API接口及其用法

前文已经说过,在FSP库函数中是使用wdt_api_t结构体来封装IWDT的操作方法,原型如下:

typedef struct st_wdt_api
{
    fsp_err_t (* open)(wdt_ctrl_t * const p_ctrl, wdt_cfg_t const * const p_cfg);
    fsp_err_t (* refresh)(wdt_ctrl_t * const p_ctrl);
    fsp_err_t (* statusGet)(wdt_ctrl_t * const p_ctrl, wdt_status_t * const p_status);
    fsp_err_t (* statusClear)(wdt_ctrl_t * const p_ctrl, const wdt_status_t status);
    fsp_err_t (* counterGet)(wdt_ctrl_t * const p_ctrl, uint32_t * const p_count);
    fsp_err_t (* timeoutGet)(wdt_ctrl_t * const p_ctrl, 
                             wdt_timeout_values_t * const p_timeout);
    fsp_err_t (* callbackSet)(wdt_ctrl_t * const p_api_ctrl, 
                              void (* p_callback)(wdt_callback_args_t *),
                              void const * const p_context, 
                              wdt_callback_args_t * const p_callback_memory);
} wdt_api_t;

瑞萨在r_iwdt.c中实现一个wdt_api_t结构体,IWDT和WDT共用一套操作接口,读者请参考《25.2.4 API接口及其用法》了解这些函数的用法。

26.3 独立看门狗定时器实验

26.3.1 设计目的

让用户学会使用瑞萨RA6M5的IWDT,并观察是否刷新看门狗的现象。

26.3.2 硬件连接

本实验会用到板载串口和按键,请读者参考前文配置。

26.3.3 驱动程序

  1. 初始化IWDT

调用open函数即可初始化IWDT,并启动它,代码如下:

void IWDTDrvInit(void)
{
    fsp_err_t err = g_iwdt.p_api->open(g_iwdt.p_ctrl, g_iwdt.p_cfg);
    assert(FSP_SUCCESS == err);
}
  1. 刷新IWDT

刷新IWDT比较简单,直接调用其refresh函数即可:

void IWDTDrvRefresh(void)
{
    fsp_err_t err = g_iwdt.p_api->refresh(g_iwdt.p_ctrl);
    assert(FSP_SUCCESS == err);
}
  1. NMI中断回调函数

在RASC中使能了IWDT的NMI中断,需要自己实现NMI回调函数,代码如下:

__WEAK void DataSaveProcess(void)
{
}
void nmi_callback(wdt_callback_args_t * p_args)
{
    (void)p_args;
    printf("\r\nWarning!Do your most important save working!!\r\n");
    DataSaveProcess();
}
  1. 按键刷新定时器

在按键消抖处理后,刷新看门狗定时器,代码如下:

void KeyProcessEvents(void)
{
    struct IODev *ptLedDev = IOGetDecvice("UserLed");
    struct IODev *ptKeyDev = IOGetDecvice("UserKey");
    ptLedDev->Write(ptLedDev, ptKeyDev->Read(ptKeyDev));
    IWDTDrvRefresh();
}

26.3.4 测试程序

在本次实验中,初始化了各个外设后,主循环中不用做任何事情,所有的操作都是在中断中完成的:

  • 按键中断
  • 滴答定时器消除按键抖动
  • NMI中断处理用户的紧急事件

测试函数代码如下:

void IWDTAppTest(void)
{
    SystickInit();
    UARTDrvInit();
    
    struct IODev *ptdev = IOGetDecvice("UserKey");
    if(NULL != ptdev)
        ptdev->Init(ptdev);
    ptdev = IOGetDecvice("UserLed");
    if(NULL != ptdev)
        ptdev->Init(ptdev);
    
    IWDTDrvInit();
    
    while(1)
    {
        /* The code that is watched by iwdt */
    }
}

26.3.5 测试结果

将编译出来的二进制可执行文件烧录到板子上并运行,如果不按按键的话会得到例如下图这样的打印信息:

image8


本章完

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1009872.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《经营者集中反垄断合规指引》发布,合规管理平台助力企业合规建设

近日,《经营者集中反垄断合规指引》的发布为企业合规建设提供了更具体和明确的指导。在这一新形势下,道本科技智慧合规管理平台作为一项强大的工具,成为企业实现合规建设的重要支持。本文将重点介绍智慧合规管理平台,探讨其对企业…

LeetCode算法心得——和可被 K 整除的子数组(前缀和+HashMap)

大家好,我是晴天学长,同余定理的应用,需要的小伙伴可以关注支持一下哦!后续会继续更新的。 1) .和可被 K 整除的子数组 题目描述 给定一个整数数组 A,返回其中元素之和可被 K 整除的(连续、非空&#xff0…

如何在matlab绘图的标题中添加变量?变量的格式化字符串输出浅析

文章目录 matlab的格式化输出控制符字段宽度、精度和对齐方式的控制matlab的格式化输出总结 matlab的格式化输出控制符 Matlab在画图的时候,采用title函数可以增加标题,该函数的输入是一个字符串,有时候我们想在字符串中添加一些变量&#x…

uni-app:标签中对数据进行判断,看数据前中后是否含有需要的字符startsWith(),endsWith(),includes()

效果图 核心代码 判断数据是否存在并且此数据是否以‘-’开头 <image v-if"line && line.startsWith(-)" :src"img1" alt""></image> 判断数据是否存在并且此数据是不是以‘ing’结尾 <image v-if"line &&…

代码块的介绍

代码块 局部代码块 局部代码块&#xff0c;用大括号进行圈着&#xff0c;然后控制这个变量的内存占用时间&#xff0c;用完这个变量我们就回收&#xff0c;不占用多余空间。但是随着这个电脑的技术的发展&#xff0c;几个变量的定义对于内存那么大的电脑影响已经不大了。 构…

ubuntu 安装截图软件 flameshot

linux安装flameshot 1、去github下载对应deb版本 Releases flameshot-org/flameshot GitHub 2、先更新一次依赖 sudo apt-get install -f 3、安装依赖 # Compile-time apt install g cmake build-essential qt5-default qttools5-dev-tools libqt5svg5-dev qttools5-dev…

[Qt]控件

文章摘于 爱编程的大丙 文章目录 1. 按钮类型控件1.1 按钮基类 QAbstractButton1.1.1 标题和图标1.1.2 按钮的 Check 属性1.1.3 信号1.1.4 槽函数 1.2 QPushButton1.2.1 常用API1.2.2 按钮的使用 1.3 QToolButton1.3.1 常用API1.3.2 按钮的使用 1.4 QRadioButton1.4.1 常用API…

高压电缆护层接地环流及温度在线监测系统

高压电缆的金属护层是电缆的重要组成部分&#xff0c;当缆芯通过电流时&#xff0c;会在金属护层上产生环流&#xff0c;外护套的绝缘状态差、接地不良、金属护层接地方式不正确等等都会引起护套环流异常现象&#xff0c;严重威胁电缆运行安全。 当电缆金属护层环流出现异常时…

FFmpeg入门之Windows/Linux下FFmpeg源码编译

1.源码下载: git clone https://github.com/FFmpeg/FFmpeg.git windows : macos: ubuntu: 2.编译FFmpeg CompilationGuide – FFmpeg windows: 1.下载yasm并安装 : Download - The Yasm Modular Assembler Project 下载后复制到c:/windows 2.下载SDL 3.下载H264/265源码 git…

对缓存穿透、雪崩、击穿的理解,引入分布式锁

缓存实战 1、缓存穿透 先来了解一个小图&#xff0c; 1.1 概念&#xff1a; 缓存穿透指一个一定不存在的数据&#xff0c;由于缓存未命中这条数据&#xff0c;就会去查询数据库&#xff0c;数据库也没有这条数据&#xff0c;所以返回结果是 null。如果每次查询都走数据库&a…

Vue中的动态 Class Style

动态 Class & Style 我们平时可以直接给元素设置静态的 Class 或者是 Style&#xff0c;但是这种方式会带来很多限制&#xff0c;假设我想要内容动态的改变 Class 或者是 Style&#xff0c;通过原生的方式要通过 JavaScript 频繁操作 dom 才能够实现。而在 Vue 中我们无需…

java入坑之注解

一、注解入门 注解&#xff1a;Annotation 从JDK 1.5 引入位于源码中(代码/注释/注解)&#xff0c;使用其他工具进行处理的标签注解用来修饰程序的元素&#xff0c;但不会对被修饰的对象有直接的影响只有通过某种配套的工具才会对注解信息进行访问和处理 主要用途 提供信息给编…

【职场篇】五年游戏开发老兵,我为什么劝你学UE?

我是水曜日鸡&#xff0c;一个在游戏行业摸爬滚打了5年的行业老兵。在Unity和UE4各有两年半的开发经验。曾参与开发了索尼中国之星计划之一的 《硬核机甲》 项目&#xff0c;用的是Unity引擎。目前在上海某大厂参与研发 开放世界项目&#xff0c;用的是UE4引擎。今天我就来终结…

《重构改善代码设计》

文章目录 1.重构的原则2.代码的坏味道3.第一组重构3.1.提炼函数3.2.内联函数3.3.提炼变量3.4.内联变量3.5.修改函数名称3.6.封装变量3.7.变量改名3.8.引入参数对象3.9.函数组合成类3.10.函数组合成变换3.11.拆分阶段 4. 封装4.1. 封装记录4.2. 封装集合4.3. 以对象取代基本类型…

使用cpolar配合Plex搭建私人媒体站

文章目录 1.前言2. Plex网站搭建2.1 Plex下载和安装2.2 Plex网页测试2.3 cpolar的安装和注册 3. 本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1.前言 用手机或者平板电脑看视频&#xff0c;已经算是生活中稀松平常的场景了&#xff0c;特别是各…

如何开启Win10虚拟机Hyper-V功能

操作步骤: 使用前提&#xff1a; 1、确保系统是 Windows 10 专业版/企业版/教育版&#xff0c;且必须是64位操作系统才支持。 提示&#xff1a;Win10家庭版不支持hyper-v。 2、使用Hyper-V需要cpu支持虚拟化并处于开启状态。 3、硬件要求及如何验证硬件兼容性&#xff1a; 硬件…

Hive 使用达梦DM8 无法识别 “COMMENT” 问题

将达梦数据库驱动 DmJdbcDriver18-8.1.2.192.jar 导入到 hive 的 lib 文件夹下 修改 hive 配置文件&#xff0c;增加 dm 数据库相关信息 <property><name>javax.jdo.option.ConnectionURL</name><value>jdbc:dm://127.0.0.1:5236?SCHEMAhive</val…

vmware官网下载(VMware workstation 下载与安装)

Oracle RAC 安装配置part1 注册VMware 个人帐号 浏览器打开官方网站 下面是主页&#xff0c;单击Customer connter 单击立即注册 填入相关信息注册完成 需要到您邮件里的激活一下帐号 注册完成 下载VMware Workstation 单击转到CUSTOMER CONNECT (您也可以在主页login…

修饰符的笔记

修饰符 完整的教程参考下面的链接 菜鸟教程-修饰符 下面是我总结的比较精简的内容 常见的修饰符有权限修饰符和非权限修饰符 权限修饰符 权限修饰符就是我们所熟知的 private&#xff0c;public&#xff0c;protect&#xff0c;default&#xff08;什么都不写&#xff0c;默…

华为云云耀云服务器L实例评测|基于华为云云耀云服务器L实例搭建EMQX大规模分布式 MQTT 消息服务器场景体验

文章目录 前言一、&#x1f604;华为云云耀服务器二、&#x1f604;产品实例创建相关1、&#x1f9e8;开通华为云云耀服务器2、&#x1f9e8;创建华为云云耀服务器实例3、&#x1f9e8;终端登录4、&#x1f9e8;华为云云耀云服务器密码重置 三、&#x1f604;安装开源产品EMQX四…