看门狗定时器

1. 看门狗

看门狗: 用于设备在 程序异常(死机) 时 可以自动重启设备

实现原理:  通过定时器 进行定时 , 在定时器时间结束前 进行 "喂狗" 重置定时器时间

若时间到,还没有"喂狗",系统重启 

本质就是一个定时器, 如何定时?

定时器 本质是对 晶振时钟进行 计数 

2. 看门狗定时器实验

实验需求,  5S 无操作 复位重启 

1. uart  printf移植  

2. 原理图 内部控制器 无外部电路 

3. 看门狗控制器 

2.1 工作原理图

如图所示 

2.2 输出定时器信号的 频率

输出定时器信号的 频率 =  总线时钟 / (分频值+1) / 重载值 ;

输出定时器信号的 频率 =  总线时钟 /固定分频/ (分频值+1) / 重载值 ;

看门狗系统时钟为100M  446页

例如 5S --->  0.2hz

0.2hz = 100 MHz/ (分频值+1) / 重载值 ;    //取固定分频为128  100Mhz/128 = 781250

0.2hz = 781250 / (预分频值+1) / 重载值 ;

0.2hz = 781250  / (249+1)/ 重载值 ;

0.2hz = 3125 / 重载值 ;

重载值 = 15625

2.3 寄存器配置 : 

WTCON 看门狗控制寄存器

WTCON   [15:8]  配置预分频值  范围[0-255] =249

[5]     = 1 使能 wdt  开始定时

[4:3]    固定分频  16  32  64  128

[2]     时间到,是否触发中断信号  = 1 触发中断 

[0]     时间到,是否触发复位信号  = 1 触发复位 

WTDAT 重载寄存器

WTDAT 重载寄存器   [15:0]  取值范围 0-65535

WTCNT 计数寄存器

WTCNT 计数寄存器  [15:0]    取值范围 0-65535

WTCLRINT  中断清除寄存器

WTCLRINT 中断清除寄存器 

2.4 写程序

watch_dog------main


#include"exynos_4412.h"
#include"uart.h"
//看门狗-----复位模式
//初始化wdt实现5S内 不操作  重启
void wdt_init()
{//预分频 249WDT.WTCON = (WDT.WTCON & ~(0XFF<<8)) | (249<<8);//固定分频 128----对应的原理图的0x3WDT.WTCON = (WDT.WTCON & ~(0X3<<3)) | (0x3<<3);//触发复位 [0] 时间到,是否触发复位信号  = 1 触发复位 WDT.WTCON |= 1; //5s时间	// 重载寄存器 WDT.WTDAT = 15625;//计数寄存器WDT.WTCNT = 15625;//启动wdtWDT.WTCON |= 1<<5;
}//接收一个字符
char getc()
{//等待数据到来while( ! (UART2.UTRSTAT2 & 1) );return UART2.URXH2 & 0XFF;
}int main()
{char c;int a = 100;uart_init();printf("hello!a=%d\r\n",a);//初始化看门狗wdt_init();while(1){c = getc();//通过串口 获取字符putc(c);//输出到串口//喂狗,再次将计数寄存器重置WDT.WTCNT = 15625;}return 0;
}

3. 实现 wdt 中断模式  每秒触发一次中断 使led3闪烁

中断模式:  wdt中断 id 75

1hz = 100 MHz/ (分频值+1) / 重载值 ;    //取固定分频为128  100Mhz/128 = 781250

1hz = 781250 / (预分频值+1) / 重载值 ;

1hz = 781250  / (249+1)/ 重载值 ;

1hz = 3125 / 重载值 ;

重载值 = 3125

dog_test----main.c


#include"exynos_4412.h"
#include"uart.h"//实现 wdt 中断模式  每秒触发一次中断//初始化led3
void led3_init(){//配置引脚模式GPX1.CON = (GPX1.CON & ~(0xf<<0)) | (0x1 << 0);//配置数据寄存器// GPX1.DAT |= 1;GPX1.DAT &= ~1;//配置上下拉寄存器GPX1.PUD &= ~(0x3<<0);
}//中断初始化
exit_init(){//GIC 面向中断源//开启总中断ICDDCR = 1;//配置端口中断使能//中断模式:  wdt中断 id 75//75/32=2   75%32=11ICDISER.ICDISER2 |= 1<<11;//配置端口优先级 优先级设置为5//75/4= 18    75%4=3  ----  [15:8]ICDIPR.ICDIPR18 = (ICDIPR.ICDIPR18 & ~(0xff<<24)) | (5<<24);//配置中断源送去哪个cpu处理 0x1表示直送cpu0//寄存器分步格局 与ICDIPR 完全一样 ICDIPTR.ICDIPTR18 = (ICDIPTR.ICDIPTR18 & ~(0xff<<24)) | (0x1<<24);//GIC 面向cpu//cpu响应中断使能  =1 使能  =0 不使能CPU0.ICCICR = 1;//配置cpu过滤优先级CPU0.ICCPMR = 255;}//中断响应,c语言入口函数,在汇编汇总调用,当irq异常触发时
void do_irq(){//获取中断号int id = CPU0.ICCIAR;printf("irq_id = %d\n",id);//根据中断id来处理对应的事件switch(id){case 75:printf("exit enable!!!");//点亮led3GPX1.DAT ^= (1<<0); //先清除中断 源头的挂起 看门狗的中断//写入任何值清除WDT.WTCLRINT = 8;//在清除GIC分配器层中断挂起 与ICDISER_CPU 结构一样 id:57//置为1  清除ICDICPR.ICDICPR2 |= 1<<11;break;}//最后清除cpu中断挂起//写入中断id清除对应中断挂起CPU0.ICCEOIR = id;}//看门狗初始化
void dog_init(){//预分频WDT.WTCON = (WDT.WTCON &~(0xff<<8)) | (249<<8);//固定分频WDT.WTCON = (WDT.WTCON &~(0x3<<3)) | (3<<3);//触发中断信号  [2] 时间到,是否触发中断信号  = 1 触发中断 WDT.WTCON |= 1<<2;//重载寄存器WDT.WTDAT = 3125;//计数寄存器WDT.WTCNT =3125;//开启看门狗WDT.WTCON |= 1<<5;}int main()
{int a = 100;uart_init();printf("hello!a=%d\r\n",a);led3_init();dog_init();exit_init();while(1);return 0;
}

4. 使用WDT定时器 中断功能 实现 精确ms延时 msleep(nms)

中断模式:  wdt中断 id 75

1s = 1000ms

1ms = 0.001s = 10^-3 s

1000hz = 100 MHz/ (分频值+1) / 重载值 ;    //取固定分频为128  100Mhz/16 = 6250000

1000hz = 6250000 / (预分频值+1) / 重载值 ;

1000hz = 6250000  / (24+1)/ 重载值 ;1000hz

1000hz = 250000 / 重载值 ;

重载值 = 250

dog_delay----main.c


#include"exynos_4412.h"
#include"uart.h"//实现 wdt 中断模式  每毫秒触发一次中断
volatile unsigned int count = 0;//延时  ms
void delay(unsigned short ms){unsigned int tmp = count;//存放刚进入delay函数时 count 的数值// while(count <= tmp+ms);//这种算法没有规避溢出问题while(count-tmp < ms);//这种算法规避了溢出问题,不必纠结算法,用就完事了}//中断初始化
exit_init(){//GIC 面向中断源//开启总中断ICDDCR = 1;//配置端口中断使能//中断模式:  wdt中断 id 75//75/32=2   75%32=11ICDISER.ICDISER2 |= 1<<11;//配置端口优先级 优先级设置为5//75/4= 18    75%4=3  ----  [15:8]ICDIPR.ICDIPR18 = (ICDIPR.ICDIPR18 & ~(0xff<<24)) | (5<<24);//配置中断源送去哪个cpu处理 0x1表示直送cpu0//寄存器分步格局 与ICDIPR 完全一样 ICDIPTR.ICDIPTR18 = (ICDIPTR.ICDIPTR18 & ~(0xff<<24)) | (0x1<<24);//GIC 面向cpu//cpu响应中断使能  =1 使能  =0 不使能CPU0.ICCICR = 1;//配置cpu过滤优先级CPU0.ICCPMR = 255;}//中断响应,c语言入口函数,在汇编汇总调用,当irq异常触发时
void do_irq(){//获取中断号int id = CPU0.ICCIAR;//根据中断id来处理对应的事件switch(id){case 75:count++;//先清除中断 源头的挂起 看门狗的中断//写入任何值清除WDT.WTCLRINT = 8;//在清除GIC分配器层中断挂起 与ICDISER_CPU 结构一样 id:57//置为1  清除ICDICPR.ICDICPR2 |= 1<<11;break;}//最后清除cpu中断挂起//写入中断id清除对应中断挂起CPU0.ICCEOIR = id;}//看门狗初始化
void dog_init(){//预分频WDT.WTCON = (WDT.WTCON &~(0xff<<8)) | (24<<8);//固定分频WDT.WTCON = (WDT.WTCON &~(0x3<<3)) | (0<<3);//触发中断信号  [2] 时间到,是否触发中断信号  = 1 触发中断 WDT.WTCON |= 1<<2;//重载寄存器WDT.WTDAT = 250;//计数寄存器WDT.WTCNT =250;//开启看门狗WDT.WTCON |= 1<<5;
}int main()
{int a = 100;uart_init();printf("hello!a=%d\r\n",a);dog_init();exit_init();while(1){delay(2000);printf("hello world \r\n");delay(5000);printf("hhhhhhhhh \r\n");}return 0;
}

5. 简述 static和volatile 关键字的含义和作用。(10分)

(1)static 关键字:

对于变量:static 关键字使得局部变量具有静态存储期,在程序执行过程中只被初始化一次,并且它们的值在多次执行函数时会保持持久性。

对于函数:static 关键字将函数的作用域限制在文件内部,只能在当前文件中调用函数。

对于类中的成员:static 关键字可用于创建静态成员,这些成员在所有类对象之间是共享的,而不是每个对象拥有自己的副本。

static 关键字也可以用于限制代码的可见性。通过将函数和变量声明为 static,可以将它们的作用域限制在当前文件或当前模块,对其他文件或模块不可见。

(2)volatile 关键字:

volatile 用于修饰变量,用来指示变量可能会被程序以外的因素修改,因此编译器在对这些变量进行优化时应该小心处理。

volatile 关键字的主要作用是告诉编译器不要对变量进行优化,每次访问变量时都要从内存中读取,而不是使用缓存的值。

使用 volatile 关键字可以确保对变量的读取和写入操作不会被编译器优化掉,适用于多线程环境、硬件寄存器和中断服务程序等场景。

总结:static 关键字用于控制对象的存储方式、作用域和可见性;volatile 关键字用于指示变量的可能变动性以防止编译器优化。它们在不同的场景中有不同的作用,并且在编写代码时需要根据需要正确使用它们。

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

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

相关文章

Leetcode—144. 二叉树的前序遍历【简单】

2023每日刷题&#xff08;九十六&#xff09; Leetcode—144. 二叉树的前序遍历 实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr…

物业app开发成功案例:如何满足用户需求

在当今数字化时代&#xff0c;物业管理已经不再是一个简单的领域。随着智能手机的普及和移动互联技术的发展&#xff0c;许多物业管理公司纷纷投入物业App开发&#xff0c;以提升管理效率、改善用户体验。本文将介绍一个成功的案例&#xff0c;探讨如何满足用户需求。 物业App…

JavaScript继承与原型链

继承和原型链是什么&#xff1f; 1.1 在继承中&#xff0c;子类继承父类的特征和行为&#xff0c;使得子类对象具有父类的实例域和方法。这意味着子类可以使用父类的方法和属性&#xff0c;使用继承的目的是为了更好设置实例的公共属性和方法&#xff0c;如下例子&#xff1a; …

vue —— h函数的学习与使用

文章目录 一、h函数是什么&#xff1f;二、h函数格式说明及使用示例1&#xff1a;简单创建一个VNode&#xff08;vue3&#xff09;示例2&#xff1a;vue2中h函数用法示例3&#xff1a;vue3中h函数的用法vue2和vue3中h函数的区别&#xff1f; 三、h函数实现原理四、h函数常用场景…

深度学习 pytorch的使用(张量2)

深度学习 pytorch的使用&#xff08;张量1&#xff09; 五、张量索引操作 简单行、列索引、列表索引、范围索引、布尔索引、多维索引 import torch # 数据 data torch.randint(0,10,[4,5]) print(data) tensor([[7, 6, 9, 4, 6], [1, 9, 0, 9, 2], [5, 7, 1, …

800G光传输网络中的相干调制与PAM4技术

在800G光传输网络架构中&#xff0c;相干调制技术和PAM4&#xff08;四电平脉冲幅度调制&#xff09;技术各具优势&#xff0c;分别针对不同应用场景提供高效解决方案。 相干调制是高级光通信的核心技术之一&#xff0c;它通过精密操控光载波的频率、相位和振幅来编码信息&…

HMI-Board以太网数据监视器(二)MQTT和LVGL

E ∫ d E ∫ k d q r 2 k L ∫ d q r 2 E \int dE \int \frac{kdq}{r^2} \frac{k}{L} \int \frac{dq}{r^2} E∫dE∫r2kdq​Lk​∫r2dq​ E Q 2 π ϵ L 2 E \frac{Q}{2\pi\epsilon L^2} E2πϵL2Q​ Γ ( n ) ( n − 1 ) ! ∀ n ∈ N \Gamma(n) (n-1)!\quad\forall n…

JavaScript 学习笔记(WEB APIs Day4)

「写在前面」 本文为 b 站黑马程序员 pink 老师 JavaScript 教程的学习笔记。本着自己学习、分享他人的态度&#xff0c;分享学习笔记&#xff0c;希望能对大家有所帮助。推荐先按顺序阅读往期内容&#xff1a; 1. JavaScript 学习笔记&#xff08;Day1&#xff09; 2. JavaSc…

C#使用RabbitMQ-1_Docker部署并在c#中实现简单模式消息代理

介绍 RabbitMQ是一个开源的消息队列系统&#xff0c;实现了高级消息队列协议&#xff08;AMQP&#xff09;。 &#x1f340;RabbitMQ起源于金融系统&#xff0c;现在广泛应用于各种分布式系统中。它的主要功能是在应用程序之间提供异步消息传递&#xff0c;实现系统间的解耦和…

SpringBoot框架:入门指南(二)

一. RESTful API开发 1. 创建RESTful控制器 在企业级Java开发中&#xff0c;RESTful API扮演着至关重要的角色&#xff0c;为系统提供了灵活、可扩展的接口。下面将详细介绍如何创建高质量的RESTful控制器&#xff0c;充分利用Spring Boot注解。 1.1 RESTful设计原则 RESTf…

Ubuntu20.0.4下设置frpc开机自启动

目录 一、下载frp 二、解压 三、服务端部署 1.配置 2.运行 三、客户端部署 1、配置 2、后台运行 四、开机启动 1、拷贝frpc.service 2、修改配置 3、启用服务 五、ubuntu20.04使用 rc-local.service设置开机启动 1、建立开机服务添加 [Install] 段 2、授权rc-local.service 3、…

Anaconda常用命令、操作、镜像源

Anaconda常用操作 命令例子作用conda create -n 环境名 需要的库conda create -n pythonenv python3.8创建环境conda info --envsconda info --envs查看全部环境activate 环境名activate pythonenv激活环境conda deactivateconda deactivate退出环境conda remove -n 环境名 --a…

pytorch学习笔记(十一)

优化器学习 把搭建好的模型拿来训练&#xff0c;得到最优的参数。 import torch.optim import torchvision from torch import nn from torch.nn import Sequential, Conv2d, MaxPool2d, Flatten, Linear from torch.utils.data import DataLoaderdataset torchvision.datas…

uniapp安卓android离线打包本地打包整理

离线打包准备 下载Android studio 1.准备资源hbuilder 2.准备离线SDK 最新android平台SDK下载最新android平台SDK下载 3.离线打包key申请 4.直接导入HBuilder-Integrate-AS工程,直接运行simpleDemo项目即可 5.安装java 1.8 jdk-8u151-windows-x64 6.遇到这个报错报错Caus…

在游戏里开公司!基于ERNIE SDK的多智能体游戏应用

在虚拟世界有一座神奇的办公室&#xff0c;当你输入你的创业方向&#xff0c;办公室的智慧打工人们将团结合作&#xff0c;为你的项目勤劳奔走&#xff0c;并在过程中&#xff0c;把日报周报都写好&#xff0c;让你随时掌握项目进度和最终成果&#xff01;该项目基于ERNIE SDK开…

工厂方法模式-C#实现

该实例基于WPF实现&#xff0c;直接上代码&#xff0c;下面为三层架构的代码。 一 Model using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace 设计模式练习.Model.工厂方法模式 {internal class…

MSG3D论文解读

论文在stgcn与sta-lstm基础上做的。下面讲一下里面的方法&#xff1a; 1.准备工作 符号。这里是对符号进行解释。 一个人体骨骼图被记为G(v,E) 图卷积&#xff1a; 图卷积定义 考虑一种常用于处理图像的标准卷积神经网络 (CNN)。输入是像素网格。每个像素都有一个数据值向…

趣学贝叶斯统计:量化

概率理论不仅仅是一个数学概念&#xff0c;更是一种对随机性和不确定性的理解方式。通过量化我们对事件发生的信念&#xff0c;我们能够更准确地预测和解释各种现象。在本章中&#xff0c;我们将探讨事件概率与信念概率&#xff0c;为我们的理论和分析工具箱增添新的维度。 事…

Angular封装HttpClient文件下载

Angular HttpClient 文件下载 前言HttpRequest.tsdemo后端接口koa2示例功能优化实现下载进度监控 前言 使用Angular框架开发工作中&#xff0c;实现文件下载业务时&#xff0c;我们可以使用Angular自带的HttpClient。下面我们就封装一下HttpClient实现文件下载&#xff0c;当接…

前端网络请求之JavaScript XHR、Fetch、Axios

一、JavaScript XHR、Fetch AJAX&#xff1a;一种在无需重新加载整个网页的情况下&#xff0c;能够更新部分网页的技术。在后台与服务器进行少量数据交换&#xff0c;Ajax 可以使网页实现异步更新。在不重新加载整个网页的情况下&#xff0c;对网页的某部分进行更新 Fetch&…