逆战策士 - 专精游戏活动策略库
首页策略工坊正文

31.1.WDT简介¶

2026-01-02 02:21:15

31.4.2. 软件设计¶

编写两个 WDT 驱动文件,分别是bsp_wdt.c 和 bsp_wdt.h,用来存放 WDT 的初始化配置函数。

并开启按键1的中断,在程序运行中,需要使用按键来不停的“喂狗”,以此来防止程序进入复位或者NMI。

关于按键中断的相关知识可以查阅本教程第16章 ICU—外部中断。

31.4.2.1. 新建工程¶

由于本实验需要LED和按键中断模块,因此我们可以在前面ICU-外部中断章节的实验例程的基础上修改程序。

对于 e2 studio 开发环境:拷贝一份我们之前的 e2s 工程 “16_ICU_External_Interrupt”,

然后将工程文件夹重命名为 “30_WDT”,最后再将它导入到我们的 e2 studio 工作空间中。

对于 Keil 开发环境:拷贝一份我们之前的 Keil 工程 “16_ICU_External_Interrupt”,

然后将工程文件夹重命名为 “30_WDT”,并进入该文件夹里面双击 Keil 工程文件,打开该工程。

工程新建好之后,在工程根目录的 “src” 文件夹下面新建 wdt 文件夹,

再进入 “wdt” 文件夹里面新建源文件和头文件:“bsp_wdt.c” 和 “bsp_wdt.h”。

工程文件结构如下。

文件结构¶

30_WDT

├─ ......

└─ src

├─ led

│ ├─ bsp_led.c

│ └─ bsp_led.h

├─ wdt

│ ├─ bsp_wdt.c

│ └─ bsp_wdt.h

└─ hal_entry.c

31.4.2.2. FSP配置¶

首先打开 “30_WDT” 项目的 FSP 配置界面,接下来我们要在这个界面里配置芯片的引脚及其相应的功能。

双击 configuration.xml 打开配置界面:

然后点开依次点击 Stacks -> New Stack -> Search… 里输入 WDT 选着 Watchdog。

随后点击 “Properties” 对刚刚加入的WDT模块进行配置。

点击 BSP 的属性settings界面,找到 OFS0 register settings -> WDT 去设置 WDT 的属性。

配置完成之后可以按下快捷键“Ctrl + S”保存,

最后点右上角的 “Generate Project Content” 按钮,让软件自动生成配置代码即可。

31.4.2.3. NMI 和 复位¶

NMI就是会执行一个中断服务函数,这个中断函数是不能够被打断的,拥有最高的中断优先级。

一般是用在一些重要的数据上面,如果直接复位,这些数据将不被保存,这个时候我们可以写一个服务程序去保存重要数据,

这也是看门狗最重要的功能。

可以在NMI中断程序中通过软件复位或跳转到程序开头进行程序的重新运行。

复位就是在不断电的情况下,把当前 MCU 及运行数据清零后的启动。在本实验中使用NMI,也就是不可屏蔽中断来进行试验。

31.4.2.4. WDT初始化函数¶

初始化函数¶

/*初始化看门狗并启动计数器*/

void WDT_Init(void)

{

//如果使用J-Link调试器进行调试的话需要加上这一句话

R_DEBUG->DBGSTOPCR_b.DBGSTOP_WDT = 0;

//初始化看门狗(WDT)模块

R_WDT_Open(&g_wdt0_ctrl, &g_wdt0_cfg);

/*刷新看门狗计数器,在这里的作用是初次启动寄存模式下的看门狗计数器

*要注意,除非是在刷新允许的范围内,否则自启动模式下不应该使用该函数*/

R_WDT_Refresh(&g_wdt0_ctrl);

}

31.4.2.5. 喂狗函数¶

喂狗函数¶

/*喂狗*/

void WDT_Feed(void)

{

/*喂狗,刷新递减计数器的值*/

R_WDT_Refresh(&g_wdt0_ctrl);

}

31.4.2.6. NMI中断服务函数¶

NMI不可屏蔽中断函数¶

/* 当看门狗NMI发生时中断回调 */

void wdt_callback (wdt_callback_args_t * p_args)

{

/*防止编译器产生关于函数中没有使用形参的警告*/

(void) p_args;

/*蓝色LED亮,请注意,在这里LED灯函数为代指,

*实际应用中,这里应该放最重要的函数,比如保存重要数据等*/

LED2_ON;

R_BSP_SoftwareDelay(3, BSP_DELAY_UNITS_SECONDS);

/* 通过软件复位MCU*/

__NVIC_SystemReset();

}

31.4.2.7. 主函数¶

主函数¶

/*按键中断回调函数*/

void key1_callback(external_irq_callback_args_t *p_args)

{

(void) p_args;

/*按键按下触发中断,进行喂狗操作*/

WDT_Feed();

}

void hal_entry(void)

{

/*红色LED亮3秒*/

LED1_ON;

R_BSP_SoftwareDelay(3,BSP_DELAY_UNITS_SECONDS);

/*按键中断初始化*/

g_external_irq_on_icu.open(&key1_ctrl, &key1_cfg);

g_external_irq_on_icu.enable(&key1_ctrl);

/*初始化看门狗并开启计数器*/

WDT_Init();

while(1)

{

/*红色LED灯灭,在这里只是代指,

*实际上这部分应该写需要被WDT监控的程序*/

LED1_OFF;

}

#if BSP_TZ_SECURE_BUILD

/* Enter non-secure code */

R_BSP_NonSecureEnter();

#endif

}

注解

使用 J-Link 调试器时,WDT 计数器不计数,因此不会重置设备或生成 NMI。若要使监视器能够在调试时计数并生成重置或 NMI,请在应用程序中添加 R_DEBUG->DBGSTOPCR_b.DBGSTOP_WDT = 0 代码。

31.4.2.8. 下载验证¶

将程序下载到开发板内,红色LED灯亮三秒钟,随后启动看门狗,关闭红色LED灯,

用户需要在不超过2.6秒左右内的时间按下按键1(SW2)来刷新计数器的数值(喂狗)。

一旦超过这个时间,看门狗计数器下溢,将产生NMI,也就是不可屏蔽中断,届时蓝色LED灯会亮三秒,

随后软件复位,程序从头运行。

告别分心:7个你没试过的专注力小技巧 爆料:engoo英语怎么样,家长亲自爆料?
相关内容