ATtiny88初体验(四):看门狗

ATtiny88单片机的看门狗使用内部独立的128KHz时钟源,拥有3种工作模式:

  • Interrupt模式:超时产生中断;
  • System Reset模式:超时产生系统复位;
  • Interrupt & System Reset模式:超时产生中断,中断处理完成后产生系统复位。

当熔丝位 WDTON 被编程时(值为0),将强制将看门狗设为System Reset模式,此时 WDEWDIE 位将被锁定为 10

清除 WDE 位和修改 WDP 需要按照下面的顺序进行操作:

  1. WDCEWDE 位写1,不管 WDE 位先前是什么值,都必须写1。
  2. 在接下来的4个时钟里,修改 WDEWDP 位,清除 WDCE 位,这些必须在一次操作内完成。

注意:

  1. 为了防止程序陷入复位循环,不管有没有用到看门狗,在初始化时,都建议清除 WDRF 标志位和 WDE 位。
  2. 在任何对 WDP 位的修改之前,建议都复位看门狗,否则可能会导致意外的复位。

寄存器

  • WDRF :看门狗系统复位标志位。
  • BORF :欠压复位标志位。
  • EXTRF :外部复位标志位。
  • PORF :上电复位标志位。

  • WDIF :看门狗中断标志位。
  • WDIE :看门狗中断使能。
  • WDCE :看门狗修改使能,只有设置此位,才能修改 WDEWDP 位。
  • WDE :看门狗系统复位使能。

  • WDP[3:0] :看门狗定时器分频。

代码

代码的文件结构如下:

.
├── Makefile
├── inc
│   ├── serial.h
│   └── serial_stdio.h
└── src
├── main.c
├── serial.c
└── serial_stdio.c

其中, src/main.c 的内容如下:

#include <stdint.h>
#include <stdio.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/wdt.h>
#include <serial_stdio.h> static void watchdog_setup(void); int main(void)
{
cli();
DDRD = _BV(DDD0); // set PD0 as output
stdio_setup(); // initialize stdio
sei(); if (MCUSR & _BV(WDRF)) { // check if watchdog reset
printf("Watchdog Reset.\r\n");
}
if (MCUSR & _BV(BORF)) { // check if brown-out reset
printf("Brown-out Reset.\r\n");
}
if (MCUSR & _BV(EXTRF)) { // check if external reset
printf("External Reset.\r\n");
}
if (MCUSR & _BV(PORF)) { // check if power-on reset
printf("Power-on Reset.\r\n");
}
MCUSR = 0; // clear reset flags watchdog_setup(); // initialize watchdog as timer for (;;);
} static void watchdog_setup(void)
{
cli();
wdt_reset(); // reset watchdog counter
MCUSR &= ~_BV(WDRF); // clear watchdog reset flag
WDTCSR = _BV(WDCE) | _BV(WDE); // enable watchdog change
WDTCSR = _BV(WDIE) | _BV(WDP2) | _BV(WDP0); // interrupt mode, 0.5s
sei();
} ISR(WDT_vect)
{
uint8_t sreg = SREG;
PIND = _BV(PIND0); // toggle PD0
SREG = sreg;
}

上述代码将看门狗设置为定时器中断模式,定时周期为0.5s,在中断程序里,翻转PD0的输出状态。

参考资料

  1. ATtiny88 Datasheet

ATtiny88初体验(四):看门狗的更多相关文章

  1. Spring Cloud Alibaba 初体验(四) Sentinel

    一.Sentinel 下载与运行 本文使用 Sentinel 1.7.1:https://github.com/alibaba/Sentinel/releases 使用自定义端口 8089 运行 Se ...

  2. Xamarin+Prism开发详解四:简单Mac OS 虚拟机安装方法与Visual Studio for Mac 初体验

    Mac OS 虚拟机安装方法 最近把自己的电脑升级了一下SSD固态硬盘,总算是有容量安装Mac 虚拟机了!经过心碎的安装探索,尝试了国内外的各种安装方法,最后在youtube上找到了一个好方法. 简单 ...

  3. 香蕉派(or 皮?)上手初体验 -- 外观鉴赏,安装,配置&amp;总结

    一.前言及简单介绍 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbG9uZ2Vyem9uZQ==/font/5a6L5L2T/fontsize/400/f ...

  4. Node.js 网页瘸腿爬虫初体验

    延续上一篇,想把自己博客的文档标题利用Node.js的request全提取出来,于是有了下面的初哥爬虫,水平有限,这只爬虫目前还有点瘸腿,请看官你指正了. // 内置http模块,提供了http服务器 ...

  5. 【Knockout.js 学习体验之旅】(1)ko初体验

    前言 什么,你现在还在看knockout.js?这货都已经落后主流一千年了!赶紧去学Angular.React啊,再不赶紧的话,他们也要变out了哦.身旁的90后小伙伴,嘴里还塞着山东的狗不理大蒜包, ...

  6. 在同一个硬盘上安装多个 Linux 发行版及 Fedora 21 、Fedora 22 初体验

    在同一个硬盘上安装多个 Linux 发行版 以前对多个 Linux 发行版的折腾主要是在虚拟机上完成.我的桌面电脑性能比较强大,玩玩虚拟机没啥问题,但是笔记本电脑就不行了.要在我的笔记本电脑上折腾多个 ...

  7. Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验

    Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验 相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出E ...

  8. win7升win10,初体验

    跟宿舍哥们聊着聊着,聊到最近发布正式版的win10,听网上各种评论,吐槽,撒花的,想想,倒不如自己升级一下看看,反正不喜欢还可以还原.于是就开始了win10的初体验了,像之前装黑苹果双系统一样的兴奋, ...

  9. 【尝新】微信小程序初体验

    文档地址:https://mp.weixin.qq.com/debug/wxadoc/dev/?t=1474644089434 根据文档地址中下载微信开发工具后,按照文档指引可以创建一个快速体验的小d ...

  10. [ZigBee] 12、ZigBee之看门狗定时器——饿了就咬人的GOOD DOG

    引言:硬件中的看门狗,不是门卫的意思,而是一只很凶的狗!如果你不按时喂它,它就会让系统重启!这反而是我们想要的功能~ 1.看门狗概述 看门狗定时器(WDT,Watch Dog Timer)是单片机的一 ...

随机推荐

  1. Django接入SwaggerAPI接口文档-完整操作(包含错误处理)

    Swagger的简介: Swagger是一个规范和完整的框架,用于生成.描述.调用和可视化RESTful风格的Web服务,在做后端开发的同时自动生成一个API文档供前端查看,当接口有变动时,对应的接口 ...

  2. Django4全栈进阶之路9 STATIC静态文件路径设置、MEDIA媒体文件路径设置

    在 Django 4 中,可以在 settings.py 文件中设置 STATICFILES_DIRS 来指定应用程序静态文件所在的文件夹路径,设置 STATIC_ROOT 来指定收集所有应用程序静态 ...

  3. vue全家桶进阶之路44:Vue3 Element Plus el_row和el_col组件

    在 Vue 3 中,Element Plus 也提供了 ElRow 和 ElCol 组件,用于实现栅格布局. ElRow 组件的常用属性: gutter:栅格间距,默认为 0. type:布局模式,可 ...

  4. 500行代码手写docker-以新命名空间运行程序

    (2)500行代码手写docker-以新命名空间运行程序 本系列教程主要是为了弄清楚容器化的原理,纸上得来终觉浅,绝知此事要躬行,理论始终不及动手实践来的深刻,所以这个系列会用go语言实现一个类似do ...

  5. 使用ptrace将标准输出重定位到文件

    首先使用PTRACE_SYSCALL获取到系统调用号,如果是write则将文件描述符从标准输出变为我们打开的文件 #include <stdio.h> #include <fcntl ...

  6. 数据科学工具 Jupyter Notebook 教程(一)

    ipython notebook 是一个基于浏览器的 python 数据分析工具,使用起来非常方便,具有极强的交互方式和富文本的展示效果.jupyter 是它的升级版,它的安装也非常方便,一般 Ana ...

  7. ImageIO的应用

    ImageIO的应用 一.关于IO流 在讲imageio之前,我们先来复习一下IO流的使用. 这里我建立一个Java类,用来实现读取文档中的内容,并且能够识别换行,话不多说,上代码: package ...

  8. 2023-06-19:讲一讲Redis分布式锁的实现?

    2023-06-19:讲一讲Redis分布式锁的实现? 答案2023-06-19: Redis分布式锁最简单的实现 要实现分布式锁,确实需要使用具备互斥性的Redis操作.其中一种常用的方式是使用SE ...

  9. Devexpress如何获取RadioGroup选中项的值和显示值

    分享一个小技巧,如题目所示,DEV控件如何获取RadioGroup选中项的值和显示值.也是在网上找了很久,看了大家都是通过SelectIndex的值定位选中的按钮,并没有说取选中项的值,所以自己研究了 ...

  10. kafka学习笔记03消息队列的两种模式

     ①点对点模式   该种模式就是消费者会自动消费消息,消息收到之后会向消息队列进行确认收到消息,然后将该数据进行删除.  ②发布/订阅模式   可以有多个的topic,topic在英语中有主题的意思, ...