当前位置: 首页 > article >正文

lv11 嵌入式开发 WDT实验 12

目录

1 WDT简介

2 Exynos4412下的WDT控制器

2.1 概述

2.2 WDT的特性

2.3 工作原理

2.4 其他细节

3 WDT寄存器详解

3.1 WTCON控制寄存器

3.2 WTDAT 实时中断寄存器

3.3 WTCNT 递减计数器

3.4 WTCLRINT清除中断寄存器

4 WDT编程


1 WDT简介

Watch Dog Timer即看门狗定时器,其主要作用是当发生软件故障时可产生复位信号使SOC复位,其本质是一个计数器(独立于CPU,但是集成在SOC中的芯片)

WDT工作原理

2 Exynos4412下的WDT控制器

2.1 概述

Exynos 4412 SCP中的看门狗定时器(WDT)是一种计时设备。可以使用该设备在系统错误引起的故障后恢复控制器的操作。可以将WDT用作普通的16位间隔定时器,以请求中断服务。WDT也可以生成复位信号。

2.2 WDT的特性

  • 支持带有中断请求的普通间隔定时器模式。
  • 当定时器计数值达到0(超时)时,会触发内部复位信号。
  • 支持电平触发的中断机制。

2.3 工作原理

看门狗定时器使用的时PCLK时钟,100Mhz ,由soc提供给我们

WTCNT寄存器中存入的是递减计数器的值,会自动递减。

减到0时可以发送2种信号,中断(和普通定时器一样)和复位(监控CPU)

WTCON寄存器[2]位可以设置是否中断

WTCON寄存器[0]位可以设置是否复位

WTCON寄存器[15:8]位,设置预分频器,降低频率,可以设置0~255,降低1~256倍。

WTCON寄存器[4:3]位,二级分频,再次降低频率,可以降低1/16 1/32 1/64 1/128。

公式为递减周期计算

2.4 其他细节

3 WDT寄存器详解

3.1 WTCON控制寄存器

 

3.2 WTDAT 实时中断寄存器

WTDAT寄存器可以指定超时持续时间。在初始WDT操作中,您无法将WTDAT的内容加载到计时器计数器中。然而,通过使用0x8000(初始值),可以驱动WDT计数器首次超时。设置Count reload value每当超时,都会把WTDAT里的值复制到WTCNT中,来产生实时中断。

3.3 WTCNT 递减计数器

 不好超过65535

3.4 WTCLRINT清除中断寄存器

4 WDT编程

介绍:编程实现看门狗运行,程序运行5s后开发板复位

注:exynos_4412.h见前期接口介绍。


#include "exynos_4412.h"

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

int main()
{
	/*设置一级分频*/
	WDT.WTCON = WDT.WTCON | (0xFF << 8);
	/*设置二级分频*/
	/*WTCNT递减频率 = PLCK(100000000)/(0xFF + 1)/128 = 3052*/
	WDT.WTCON = WDT.WTCON | (0x3 << 3);
	/*禁止WDT产生中断信号*/
	WDT.WTCON = WDT.WTCON & (~(1 << 2));
	/*使能WDT产生复位信号*/
	WDT.WTCON = WDT.WTCON | 1;
	/*设置计数器的初始值*/
	WDT.WTCNT = (3052 * 5);
	/*使能WDT,计数器开始递减*/
	WDT.WTCON = WDT.WTCON | (1 << 5);
	
	while(1)
	{
		printf("WDT.WTCNT = %d\n",WDT.WTCNT);
		/*喂狗*/
		//WDT.WTCNT = 3052;
		Delay(100000);
	}

	return 0;
}

练习

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


#include "exynos_4412.h"

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

int main()
{
	/*设置一级分频*/
	WDT.WTCON = WDT.WTCON | (0x4D << 8);
	/*设置二级分频*/
	/*WTCNT递减频率 = PLCK(100000000)/(0x4D + 1)/128 ≈ 10000*/
	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);
		/*喂狗*/
		//WDT.WTCNT = 10000;
		Delay(100000);
	}

	return 0;
}

效果:5s后开发板复位

注:开发板已经帮我们实现了串口的功能,所以直接调用printf即可,否则串口也不会打印上电的信息。


http://www.kler.cn/a/148446.html

相关文章:

  • 【安全通信】告别信息泄露:搭建你的开源视频聊天系统briefing
  • SpringBoot参数注解
  • 【HarmonyOS NEXT】一次开发多端部署(以轮播图、Tab栏、列表为例,配合栅格布局与媒体查询,进行 UI 的一多开发)
  • 在Java中使用ModelMapper简化Shapefile属性转JavaBean实战
  • 虚拟机安装Ubuntu 24.04服务器版(命令行版)
  • 利用滑动窗口解题
  • C语言:输入10个整数,写一个函数将其中最小的数和第一个数对换,把最大的数和最后一个数对换。(指针)
  • 14 网关实战:网关聚合API文档
  • 基于51单片机冰箱温度控制器设计
  • Sass混合器的详细使用教程
  • squid代理服务器(传统代理、透明代理、反向代理、ACL、日志分析)
  • ESP32-Web-Server编程- JS 基础 3
  • NFS 速度变慢问题排查 性能优化
  • 6、信息收集(1)
  • 23种设计模式之C++实践
  • 构建强大的接口自动化测试框架:Pytest实践指南!
  • 互联网架构演变过程梳理和架构思想的学习
  • 探秘开发app与小程序:一场技术与创新的博弈
  • Vue3-Pinia
  • 整数反转 Golang leecode_7
  • 使用python-docx在word文档中查找书签,并在书签处写入数据
  • PHP 针对人大金仓KingbaseES自动生成数据字典
  • 计算机基础知识60
  • 零基础学Python第三天||写一个简单的程序
  • 数据结构——链式二叉树的实现(详解)
  • Springboot实现增删改差