D15. WDT实验-ARM体系结构与接口技术-嵌入式学习LV9

DAY15.WDT实验


如果出现图片无法查看可能是网络问题,我用的GitHub+图床保存的图片,可以参考我另外一篇文章GitHub的使用方法含网络问题解决
GitHub使用教程含网络问题_github加速器_肉丸子QAQ的博客-CSDN博客


相关作业和资料已上传,请在主页自行查看

1. WDT简介

WDT Watch Dog Timer

即看门狗定时器,其主要作用是当发生软件 故障时可产生复位信号使SOC复位,其本质是一个计数器

image-20230808101414179

WDT工作原理

每当计数器减到0就会让开发板复位

  • 开发板上电后程序正常执行,计数器也会相应的往下减数,当程序运行一段时间后会向计数器重新写入值,然后重新进行正常执行,再过一段时间又给计数器写值,以此类推
  • 当程序出现错误后,程序不能正常运行也就不会每隔一段时间给计数器刷新,当计数器变为零就会复位
image-20230808102000316

出于安全的考虑添加这个功能

2. 4412下的WDT控制器

不涉及控制引脚

  • Exynos 4412 SCP中的监视器计时器(WDT)是一种计时设备。由于噪声和系统错误导致故障后,您可以使用此设备恢复控制器的操作。你可以使用WDT作为一个norma 116位间隔计时器请求中断服务。WDT产生复位信号。

image-20230808103558562

  • 可以产生两种信号中断信号和复位信号,通过WTCON[0]WTCON[2]来控制模式
image-20230808104206660
  • 一级分频,使用PCLK时钟100m,使用8位分频,WTCON[15:8]控制倍数,一级分频

image-20230808104441949

  • 二级分频:不能随意分频有固定值

image-20230808104622997

  • 时间计算,减一次花的时间

    image-20230808104849791

3. WTD寄存器详解

看门狗相关寄存器

image-20230808110424550

WTCON寄存器

image-20230808110812476

WTDAT寄存器

实时中断,定期产生一个中断,这个实验不用

image-20230808111149560

WTCNT寄存器

储存当前计数值

image-20230808111206609

4. WDT编程

#include "extnos_4412.h"

void Delay(unsigned int Time)
{
	while(Time--);
}

int main()
{

	//为了方便说明将寄存器不同位拆开赋值,自己也可以直接算出然后给这个寄存器直接赋值
	/*1. 设置一级分频*/
	WDT.WTCON = WDT.WTCON | (0xFF << 8);

	/*2. 设置二级分频*/
	/*WTCNT递减频率 = PLCK(100000000)/(0xFF + 100000000)/128 = 3052*/
	WDT.WTCON = WDT.WTCON | (0x3 << 3);

	/*3. 禁止WDT产生中断信号*/
	WDT.WTCON = WDT.WTCON & (~(1 << 2));

	/*4. 使能WDT产生复位信号*/
	WDT.WTCON = WDT.WTCON | 1;

	/*5. 设置计数器的初始初始值/
	WDT.WTCNT = (3052 * 5);//倍数就是多少秒减完

	/*6. 使能WDT,计数器开始递减,要放在最后面 */
	WDT.WTCON = WDT.WTCON | (1 << 5);

while(1)
{
	//printf("WDT.WTCNT = %d\n",WDT.WTCNT);
	/*喂狗*/
	//WDT .WTCNT = 3052;
	//Delay(100000);
}
	return 0;
}

实验现象:5秒后重启

image-20230808115916438

  • 实际上串口初始化在开发板内部已经初始化好了,上电后将初始化串口,所以我们要查看计数器的值不需要再初始化一次串口直接打印需要的值就可以
#include "extnos_4412.h"

void Delay(unsigned int Time)
{
	while(Time--);
}

int main()
{

	//为了方便说明将寄存器不同位拆开赋值,自己也可以直接算出然后给这个寄存器直接赋值
	/*1. 设置一级分频*/
	WDT.WTCON = WDT.WTCON | (0xFF << 8);

	/*2. 设置二级分频*/
	/*WTCNT递减频率 = PLCK(100000000)/(0xFF + 100000000)/128 = 3052*/
	WDT.WTCON = WDT.WTCON | (0x3 << 3);

	/*3. 禁止WDT产生中断信号*/
	WDT.WTCON = WDT.WTCON & (~(1 << 2));

	/*4. 使能WDT产生复位信号*/
	WDT.WTCON = WDT.WTCON | 1;

	/*5. 设置计数器的初始初始值/
	WDT.WTCNT = (3052 * 5);//倍数就是多少秒减完

	/*6. 使能WDT,计数器开始递减,要放在最后面 */
	WDT.WTCON = WDT.WTCON | (1 << 5);

while(1)
{
	printf("WDT.WTCNT = %d\n",WDT.WTCNT);
	/*喂狗*/
	//WDT .WTCNT = 3052; //
	Delay(100000);
}
	return 0;
}
  • 没有赋予刷新值:减完后程序开始复位

image-20230808120852640

  • 赋予刷新值后,每次减到2962就会刷新了值重新减

image-20230808121143790

5. 作业

1.编程实现将WDT的递减频率设置为10000HZ,程序运行5s后开发板复位

#include "exynos_4412.h"
 
void Delay(unsigned int Time)
{
	while(Time--);
}
 
int main()
{
	/*设置一级分频*/
	WDT.WTCON = WDT.WTCON | (0x4e << 8);
	/*设置二级分频*/
	/*WTCNT递减频率 = PLCK(100000000)/(0x4e + 1)/128 = 9889,取相近值10016也可以*/
	WDT.WTCON = WDT.WTCON | (0x3 << 3);
	/*禁止WDT产生中断信号*/
	WDT.WTCON = WDT.WTCON & (~(1 << 2));
	/*使能WDT产生复位信号*/
	WDT.WTCON = WDT.WTCON | 1;
	/*设置计数器的初始值*/
	WDT.WTCNT = (10000 * 5);
	/*使能WDT,计数器开始递减*/
	WDT.WTCON = WDT.WTCON | (1 << 5);
	
	while(1)
	{
 
		printf("WDT.WTCNT = %d\n",WDT.WTCNT);
		Delay(100000);
 
	}
 
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肉丸子QAQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值