看门狗定时器

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…

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函数常用场景…

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;实现系统间的解耦和…

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开…

MSG3D论文解读

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

Windows10上使Git Bash支持rsync命令操作步骤

rsync命令是linux上常用的工具之一&#xff0c;用于远程以及本地系统中拷贝/同步文件和文件夹。 Windows Git Bash默认并不支持rsync&#xff0c;如下图所示&#xff1a; 使Git Bash支持rsync命令操作步骤&#xff1a; 1.从https://repo.msys2.org/msys/x86_64/ 下…

一、MongoDB、express的安装和基本使用

数据库【Sqlite3、MongoDB、Mysql】简介&小记 Sqlite3&#xff1a; SQLite3是一个轻量级的数据库系统&#xff0c;它被设计成嵌入式数据库。这意味着它是一个包含在应用程序中的数据库&#xff0c;而不是独立运行的系统服务。适用场景&#xff1a;如小型工具、游戏、本地…

算力总规模位列全球第二!中创:助推数据中心建设

近日&#xff0c;国新办举办新闻发布会&#xff0c;介绍2023年工业和信息化发展情况。算力、数据中心、云计算等与数字化转型、能源利用息息相关&#xff0c;被多次提及。 工业和信息化部新闻发言人、运行监测协调局局长陶青表示&#xff1a; 数字基础设施支撑有力&#xff0c;…

力扣算法-Day18

18.四数之和 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元素一一对应&#xff0c;则认为两个四元组重复&#xff09;&#xff1…

亚马逊鲲鹏系统:批量注册买家号的新利器

近年来&#xff0c;随着电商市场的迅速发展&#xff0c;亚马逊作为全球最大的在线零售平台之一&#xff0c;其买家号的需求也日益增长。而亚马逊鲲鹏系统是一个能够批量全自动注册亚马逊买家号的系统。而对于全自动批量注册&#xff0c;账号资料方面&#xff0c;也有一定的要求…

vue3 + antd 封装动态表单组件(二)

传送带&#xff1a; vue3 antd 封装动态表单组件&#xff08;一&#xff09; 前置条件&#xff1a; vue版本 v3.3.11 ant-design-vue版本 v4.1.1 vue3 antd 封装动态表单组件&#xff08;一&#xff09;是基础版本&#xff0c;但是并不好用&#xff0c; 因为需要配置很多表…

【QT+QGIS跨平台编译】之八:【zstd+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、zstd介绍二、文件下载三、文件分析四、pro文件五、编译实践一、zstd介绍 ZSTD(Zstandard的缩写),是一种快速压缩算法,提供了高压缩比功能。ZSTD还为小数据提供了一种特殊的模式,称为字典压缩。ZSTD库使用BSD许可证作为开放源码软件提供的。它的格式是稳定的,…

【java题解】题目 1779: 你的第一个程序;题目 1779: 你的第一个程序;题目 1173: 计算球体积

目录 题目 1779: 你的第一个程序 题目描述 输入格式 输出格式 样例输入 样例输出 题解 题目 1173: 计算球体积 题目描述 输入格式 输出格式 样例输入 样例输出 题解 题目 1267: AB Problem 题目描述 输入格式 输出格式 样例输入 样例输出 题解 从今天开始…

TS学习笔记十:装饰器及三斜线指令

本节介绍TS中的装饰器和三斜线指令&#xff0c; 装饰器&#xff08;Decorators&#xff09;为我们在类的声明及成员上通过元编程语法添加标注提供了一种方式。   三斜线指令是包含单个XML标签的单行注释。 注释的内容会做为编译器指令使用。 讲解视频 20240116-205052装饰器…