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

DAY15.WDT实验


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


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

1. WDT简介

WDT Watch Dog Timer

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

WDT工作原理

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

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

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

2. 4412下的WDT控制器

不涉及控制引脚

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

image-20230808103558562

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

D15. WDT实验-ARM体系结构与接口技术-嵌入式学习LV9_第1张图片

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

D15. WDT实验-ARM体系结构与接口技术-嵌入式学习LV9_第2张图片

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

    D15. WDT实验-ARM体系结构与接口技术-嵌入式学习LV9_第3张图片

3. WTD寄存器详解

看门狗相关寄存器

D15. WDT实验-ARM体系结构与接口技术-嵌入式学习LV9_第4张图片

WTCON寄存器

D15. WDT实验-ARM体系结构与接口技术-嵌入式学习LV9_第5张图片

WTDAT寄存器

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

D15. WDT实验-ARM体系结构与接口技术-嵌入式学习LV9_第6张图片

WTCNT寄存器

储存当前计数值

D15. WDT实验-ARM体系结构与接口技术-嵌入式学习LV9_第7张图片

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秒后重启

D15. WDT实验-ARM体系结构与接口技术-嵌入式学习LV9_第8张图片

  • 实际上串口初始化在开发板内部已经初始化好了,上电后将初始化串口,所以我们要查看计数器的值不需要再初始化一次串口直接打印需要的值就可以
#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;
}
  • 没有赋予刷新值:减完后程序开始复位

D15. WDT实验-ARM体系结构与接口技术-嵌入式学习LV9_第9张图片

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

D15. WDT实验-ARM体系结构与接口技术-嵌入式学习LV9_第10张图片

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;
}

你可能感兴趣的:(arm开发,学习,驱动开发)