浅析DSP28035的看门狗模块

2023-05-16

目录

      • 背景
      • 工作原理
      • 结构与寄存器
      • 代码
      • 实验结果
      • 总结

背景

嵌入式系统通常会使用DSP来实现控制功能,比如开关电源的数字控制。试想如果DSP中程序出现Bug、崩溃、跑飞了怎么办?如果不及时处理,这对整个嵌入式系统的危害将是不可预料的。

在这里插入图片描述

这时,我们就需要DSP具有一种保护机制:检测程序是否正常运行,如果不正常,就要采取某种保护措施。

其实,不止DSP具有这种机制,大多数嵌入式系统的微处理器为了保证产品的可靠性,都具备这种功能。这种保护机制就是看门狗(Watch Dog)

接下来就来聊聊TI 的TMS320F28035 芯片。

工作原理

鉴于程序跑飞时,CPU已经不再受控制了。那么,看门狗(Watch Dog)肯定是要独立于CPU模块的,而事实上也确实如此,并且看门狗的时钟信号也是通过晶振时钟进行预分频得到的。这就保证了看门狗可以完全不受CPU的影响。

当CPU死机、跑飞、或者运行到一个不明的程序陷阱时,看门狗能识别到这种状况,并产生中断或者复位信号。复位信号将CPU复位,使得CPU重新开始运行;中断信号使得CPU进入中断服务子程序,执行一系列操作。

那么,关键的问题来了:看门狗如何判断CPU是否跑飞了?

其实原理很简单,看门狗嘛,通俗点,从狗狗的角度来看,当主人每日按时给自己狗粮时,主人肯定没问题;但是,如果有一天主人突然没有给它喂饭了,那肯定出问题了啊。

看门狗机制就是如此,CPU要定期向看门狗发送特定信号,表示程序工作正常。具体来讲,看门狗内部有一个8位计数器WDCNTR,每个看门狗时钟周期都会进行加一增计数,当计数溢出时就产生中断或者复位信号;在计数溢出之前,若看门狗接收到CPU发送的特定信号后,就会把计数器清零,重新开始计数,也就不会产生复位或者中断。

CPU发送特定信号给看门狗的这种动作,也就是俗称的“喂狗”。只有定时有效地“喂狗”,才能保证看门狗不会错误地发送复位或中断指令。

结构与寄存器

看门狗模块的结构图如下:

在这里插入图片描述

上面提到了特定信号,定时有效地喂狗,那什么是特定信号?,何为定时?何为有效

特定信号: 0x55+0xAA。

定时:在8位计数器溢出之前进行喂狗。

有效:当且仅当对WDKEY写入0x55 + 0xAA,才会清零计数器。

当计数器溢出时,根据工作模式,看门狗模块会产生复位信号中断信号,该信号是一个有效电平为低电平,脉冲宽度为512个晶振时钟周期OSCCLK的脉冲信号,注意不是系统时钟信号SYSCLKOUT

接下来,再看看与看门狗相关的寄存器。

  • SCSR: 系统控制状态寄存器。主要配置看门狗的模式,包括复位模式和中断模式

  • WDCNTR: 看门狗计数寄存器。8位计数器,(当外接10MHz晶振时,最大喂狗时间: 512 / 10 e 6 ∗ 255 ≈ 13 m s ) 512 / 10e^{6} * 255 \approx 13ms) 512/10e625513ms)​​

  • WDKEY: 看门狗键值寄存器。写入0x55 + 0xAA 计数器复位。

  • WDCR: 看门狗控制寄存器,。WDDIS看门狗屏蔽位,WDPS看门狗时钟预分配位。写入0x0068,关闭看门狗;写入0x0028 开启看门狗,复位后自动使能看门狗(所以在初始化之前,通常先要关闭看门狗,等一切配置好以后,才开启看门狗)

注意:看门狗的时钟WDCLK是晶振(10MHz,具体视硬件而定)频率经过512分频得到,而不是主频SYSCLKOUT

代码

#include "DSP28x_Project.h"       // Device Header file and Examples Include File

int flg_ServiceDog = 0;           // 喂狗标志,这里选择不喂狗
long int loop_cnt = 0;            // 主循环次数
long int wake_cnt = 0;            // 看门狗中断次数


// 看门狗中断服务子函数
__interrupt void wakeint_isr(void)
{
    wake_cnt++;
    // 允许ACK位,准备迎接下一个看门狗中断;看门狗属于 PIE group 1
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}


/**
 * main.c
 */
int main(void)
{
    InitSysCtrl();       // 系统控制初始化,关闭看门狗,使能外设时钟等
    DINT;                // 关闭CPU级总中断
    InitPieCtrl();       // 初始化外设中断扩展配置
    IER = 0x0000;        // 清除CPU级中断使能位,标志位
    IFR = 0x0000;
    InitPieVectTable();  // 初始化中断外设向量表,并使能PIE控制器

    //********************* code start here ****************************//
    EALLOW;
    PieVectTable.WAKEINT = &wakeint_isr;    // 加载看门狗中断服务子程序入口地址到中断向量表
    EDIS;

    EALLOW;
    SysCtrlRegs.SCSR = 0X0002;              // 设置看门狗工作模式,中断模式: 0x0002 ,复位模式: 0x0000
    EDIS;

    PieCtrlRegs.PIEIER1.bit.INTx8 = 1;      // 使能看门狗外设中断,看门狗中断是group1 第8位
    IER |= 0x0001;      // 使能CPU级 group 1
    
    EINT;               // 前面关了,这里开启CPU总中断
    
    ServiceDog();       // 喂狗,清零看门狗计数器 
    EALLOW;
    SysCtrlRegs.WDCR = 0x0028;     // 开启看门狗模块
    EDIS;

    while(1)
    {
        loop_cnt++;
        if(flg_ServiceDog)  // flg_ServiceDog = 0 ,不喂狗
        {
            ServiceDog();   // 喂狗,该函数在官方提供,其实就是向WDKEY写0x0055 + 0x00AA
        }
    }
    //********************* code end here ******************************//
}

实验结果

将CCS编写的程序通过仿真器,编译、烧写到开发板,然后Debug,全速仿真运行,菜单面板【Window->show view->expressions】添加表示式,并查看表达式的值,选中连续刷新,即可看到,在不喂狗的情况下,就会触发看门狗中断,进入中断服务子程序,实时增加wake_cnt的值。

在这里插入图片描述

总结

看门狗非常简单,但却非常实用,是嵌入式系统微处理器必备的一种保护机制。另外,代码中涉及到PIE模块,该模块是28035关于外设中断的一些配置,主要包括中断的开启,关闭,清除,以及中断服务子函数地址的管理等。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

浅析DSP28035的看门狗模块 的相关文章

  • C#--WinForm--表格数据控件DataGridView--绑定模式

    官方文档 DataGridView控件提供了一种强大而灵活的以表格形式显示数据的方式 用户可以使用DataGridView控件来显示少量数据的只读视图 xff0c 也可以对其进行缩放以显示特大数据集的可编辑视图 扩展DataGridView
  • ASP.NET--网站配置、发布与部署

    网站发布前的配置信息 配置文件下载 网站发布的基本步骤 写好的项目 在本机上发布 打开目录查看 xff1a 部署网站 安装IIs 打开控制面板 程序和功能 启用或关闭Windows功能 安装后 返回控制面板 管理工具 双击打开 xff1a
  • c/c++ hash表 (哈希表、字典表)

    表 1 表 存储数据 key gt value 2 表存储数据结构的困难 怎么查找 一个一个key去比较去查找 xff1f 61 61 效率不高 3 Hash算法加快查找 将字符串的key 转成整数 使用整数找到对应的value Hash算
  • c/c++ UDP通讯

    UDP通讯 1 无连接的 不需要反复的确认和握手等待 根本不关心对方是否存在 2 不可靠 可能有丢包 和先发后到 3 UDP通讯快速 占用系统资源少 4 UDP提供作为传输层协议的最基本功能 将其他的交给用户自己来管理 UDP服务端 1 创
  • c#程序流程控制与调试技术

    If选择结构 为什么要使用关系运算符 简单If 选择结构1 逻辑运算符
  • 特征融合之基于贝叶斯理论的特征融合算法

    参考文献 xff1a 1 刘渭滨 邹智元 邢薇薇 模式分类中的特征融合方法 J 北京邮电大学学报 2017 04 5 12 2 Ma A J Yuen P C Lai J H Linear Dependency Modeling for C
  • 初学者都能看懂的蒙特卡洛方法以及python实现

    项目github地址 xff1a bitcarmanlee easy algorithm interview and practice 经常有同学私信或留言询问相关问题 xff0c V号bitcarmanlee github上star的同学
  • postman安装包

    postman34位和64位安装包 xff0c 访问API 下载地址 xff1a 链接 xff1a https pan baidu com s 1p 830DPPKumXiwMPVtKYsw 提取码 xff1a 8p6k
  • STM32入门:STM32F401CDU6库函数工程文件搭建

    STM32F401CDU6库函数工程文件搭建 根据下图的结构进行复制粘贴操作 xff0c 代码部分在本文末有贴出来 xff0c STM32F4xx DSP StdPeriph Lib V1 8 0文件下载 xff08 使用part1即可 x
  • 减小vscode-cpptools的内存占用

    在VScode菜单栏文件 gt 首选项 gt 设置 搜索C Cpp intelliSenseCacheSize 修改默认的5120为512
  • Ubuntu20.04 安装tcp调试工具mNetAssist步骤

    概述 在Ubuntu20 04上安装一个比较好用的网络调试助手mNetAssist 下载链接 mNetAssist链接 提取码 vrsm 安装 进入文件 mNetAssist release amd64 deb的所在文件夹 xff0c 然后
  • 页面加载时,添加进度条,提高用户体验

    这几个月做了个项目 xff0c 在此对一些问题做一个记录 项目是前后端分离的 xff0c 前端用的 npm 43 webpack 问题 xff1a 由于系统某页面数据量过大或网络较差等原因 xff0c 导致页面还未完全加载出来 xff0c
  • matlab绘制三维图像,用ga工具箱求解有约束的优化问题(接力遗传算法)

    绘制目标函数图像 目标函数的图像绘制为 xff08 未考虑约束条件 xff09 画法1代码 有约束的三维函数图像绘制 x1 61 10 1 10 x2 61 6 1 6 x1 x2 61 meshgrid x1 x2 f 61 exp x1
  • 多元线性回归 stata

    文章目录 回归的思想 xff0c 任务 xff0c 使命 xff0c 分类线性回归一定只能用于有线性关系的变量吗数据的分类数据的标准化处理最小二乘法拟合一元线性回归方程的几个结论回归系数的解释遗漏变量会造成内生性 xff08 扰动项和变量相
  • C++编译报错:||error: ld returned 1 exit status|

    这个问题我遇到过三次了 xff0c 每次好像原因都不一样 xff0c 在网上看到很多博客都记录了这个问题 xff0c 每人原因也都不同 xff0c 所以可以有多种原因都引发这个错误 但我不懂ld returned 1 exit status
  • C++ day34 异常(三)异常规范,未捕获异常,意外异常,异常导致内存泄漏

    文章目录 异常规范 xff08 C 43 43 98添加 xff0c C 43 43 11已摒弃 xff0c 不建议使用 xff09 异常规范的作用 xff08 正是这俩作用的鸡肋和难办使它失去了粉丝 xff09 C 43 43 11支持的
  • C++ day37 标准模板库STL初识

    文章目录 简介是什么 xff1a 容器类模板 xff0c 迭代器类模板 xff0c 函数对象模板 xff0c 算法模板的集合STL不是面向对象编程 xff0c 而是泛型编程 xff01 历史 xff1a 1994年发布 模板类vector示
  • STM32烧录 Error:Flash Download Failed-“Cortex-M3“ 解决方案—ST-Link调试

    STM32烧录 Error Flash Download Failed 34 Cortex M3 34 解决方案 ST Link调试 开发环境介绍设置步骤1 于Device中选择与你的开发板相匹配的芯片 xff0c 一般主芯片上都有标注2
  • SQL (十四)插入数据(insert语句,把数据插入表中)

    文章目录 插入完整的行 xff1a values子句不安全写法安全写法 xff1a 在表名后的括号明确给出列名小结 插入行的一部分 xff1a 简单插入某些查询的结果 xff08 即检索出的数据 xff09 xff1a insert sel
  • 模2除法(CRC冗余码计算)和二进制/十进制除法

    文章目录 CRC循环冗余检验 xff1a 余数为0就没出错 xff1b 不能确定哪几个比特出错了二进制除法 xff08 和十进制除法其实一样 xff01 xff09 模2除法 xff08 不同于二进制除法 xff01 本质就是异或而已 xf

随机推荐

  • latex超链接Argument of \Hy@setref@link has an extra }.错误解决

    用了 usepackage url 来在文章中写了超链接 xff0c 如 url https www baidu com 但是直接编译后没有颜色 xff0c 就是黑色的 xff0c 参考文献也是黑色的 加入下面两句代码可以让超链接显示出颜色
  • 希捷移动硬盘更换文件系统(exfat vs NTFS)

    毕业资料多 xff0c 专门买了个移动硬盘 xff0c 希捷的 2T 第一次买移动硬盘 xff0c 以为和常规U盘一样 xff0c 买来没仔细看说明书就直接用上了 xff0c 但是使用过程中老出问题 xff0c 比如从featurize平台
  • LPWAN——Sigfox实战经验介绍

    0 序 最近半年的时间一直在从事这方面的开发工作 xff0c 到目前为止对于Sigfox有一定想法和经验 xff0c 同时目前国内对于该技术的使用和应用还处在刚刚起步的阶段 xff0c 很多博客对Sigfox的讲解是一个浅尝辄止的介绍 xf
  • 拉格朗日乘子法详解(Lagrange multiplier)

    最近在视频的变换编码里推导最优变换 xff08 KL变换 xff09 时需要用拉格朗日乘子法 xff0c 之前在机器学习的各种优化问题里也要用到这个方法 xff0c 特此仔细钻研一番 xff0c 总结如下 xff1a 注 xff1a 这篇博
  • MATLAB求解规划问题(线性规划, 整数规划, 非线性规划)

    文章目录 基础知识规划问题的数学模型的三个要素解 线性规划Linear Programing理论示例 整数规划理论示例 非线性规划理论示例 生产实践中 xff0c 经常会遇到很多资源分配的问题 xff0c 如何分配各种资源以获得最大经济效益
  • matlab画三维图像(plot3,mesh,surf)

    二维函数的图像必须用三维坐标系画 xff0c 很多函数的图像长得很好看 xff0c 很有意思 会可视化也会有利于我们理解更深刻 xff08 1 xff09 plot3 三维曲线图 在网上看到这图觉得挺好看 xff1a t 61 0 pi 3
  • 智能小车学习笔记

    教程 视频教程 xff1b 资源网站 xff1b 可以获取模块的基础资料 xff1b 有刷电机有损耗 电机选型考虑 xff1a 转速和额定电压 xff1b 电机的力矩 xff0c 减速电机减速箱的作用 xff1a 减速 增大力矩 xff08
  • C++ 容器详解

    顺序容器vectorlistdequestackqueuepriority queue 关联容器mapmultimapsetmultiset 无序容器容器的互相比较迭代器 顺序容器 顺序容器类型特点vector可变大小数组支持快速随机访问
  • Cmake入门&运行保存C/C++文件

    Cmake入门 amp 运行保存C C 43 43 文件 在ubuntu创建 保存 运行c 43 43 文件CMake入门创建文件编译 参考 最近在学习Intel realsense T265双目视觉 xff0c 其中一步需要创建源文件ma
  • NVIDIA Jetson TX2 上手指南

    文章目录 一个性能强大的边缘设备我和 NVIDIA Jetson TX2 的初体验Fresh Your TX2为什么在第一步取消Host Machine可能遇到的问题 用上最好的性能 xff0c 小风扇跳舞吧 xff5e xff5e 运行一
  • extern "C"的作用以及为什么要使用extern "C"

    实现c 43 43 代码能够调用其他c语言代码 xff0c 加上extern 34 C 34 后 xff0c 这部分代码编译器以c语言的方式进行编译和链接 xff0c 而不是按c 43 43 方式原因 xff1a c和c 43 43 对同一
  • 什么是链表?(图解)

    一 xff1a 链表是什么 1 链表是物理存储单元上非连续的 非顺序的存储结构 xff0c 数据元素的逻辑顺序是通过链表的指针地址实现 xff0c 有一系列结点 xff08 地址 xff09 组成 xff0c 结点可动态的生成 2 结点包括
  • C++ STL各个容器的区别

    1 STL容器分类 xff1a STL的容器可以分为以下几个大类 一 顺序 xff08 序列 xff09 容器 xff0c 有vector list deque string stack 适配器类 queue 适配器类 priority q
  • Bat脚本-编译及烧录keil-MDK工程

    目录 概述背景需求需求分析需求实现实现功能使用示例1 修改脚本中的编译软件路径2 将脚本的文件路径加入系统的环境变量3 通过Vscode 进行调用 可进一步优化的方向总结 概述 本文主要讲述的是一个关于调用keil MDK的软件编译对应单片
  • ubuntu部署http服务器

    一 安装apache2 sudo apt install y apache2 二 配置环境 默认是80端口 xff0c 防止冲突自定义端口 xff1a 8001 1 修改 etc apache2 ports conf文件j监听端口 List
  • c/c++math.h标准库

    math h数学函数 这个库中所有可用的函数取double参数并返回double的结果 abs 绝对值 acos 反余弦 acosh 反双曲余弦 asin 反正弦 asinh 反双曲正弦 atan2 两个参数的反正切 atan 反正切 at
  • Linux Simulink打不开——unable to run the MATLABWindow application on Linux

    Linux Simulink打不开 unable to run the MATLABWindow application on Linux 解决办法 xff1a 解决办法 xff1a 参考网页 xff1a https www mathwor
  • RTX移植STM32F103,超详细~

    目录 RTX移植前言移植1 创建工程2 配置工程3 添加LED文件4 编写测试代码5 编译烧录 RTX移植 往期回顾 为什么需要RTOS 前言 keil RTX是一款应用广泛的嵌入式RTOS xff0c 具体可见官网 为什么需要RTOS x
  • 基于28035的ePWM触发ADC采样设计

    目录 前言实验目的实验要求硬件电路实验步骤代码解释实验结果总结体会 前言 玖道最近在做一个开关电源项目 xff0c 需要用到TI 的TMS320F28035 芯片 xff0c 实现控制电路的设计 简单来说就是利用28035采集信号量 xff
  • 浅析DSP28035的看门狗模块

    目录 背景工作原理结构与寄存器代码实验结果总结 背景 嵌入式系统通常会使用DSP来实现控制功能 xff0c 比如开关电源的数字控制 试想如果DSP中程序出现Bug 崩溃 跑飞了怎么办 xff1f 如果不及时处理 xff0c 这对整个嵌入式系