前言

说到看门狗,应该不会陌生,看门狗说白了就是一个定时器,但是它有一个非常重要的功能就是复位系统。在A20里,看门狗的操作非常简单,只有两个寄存器,不需要操作时钟相关的东西,系统起来后可以直接使用,它的最大定时时间为16秒。

一、目的

学习使用A20的看门狗,实现软件复位系统。

二、源代码说明

start.S文件。首先禁止CPU的IRQ和FIQ,设置为管理模式,需要注意的是,这里设置异常向量表的起始地址为start.S文件里的第一指令的地址,学过ARM的都知道,ARM的异常向量表可以设置在低地址(0地址),也可以设置在高地址(0xffff0000地址,通常在使能了MMU后使用),但是目前Cortex-A7体系结构已经可以指定异常向量表的地址,这样就省去了搬移的操作。然后设置堆栈指针,最后调用C语言的main函数。

 /*
* (C) Copyright conan liang <lknlfy@163.com>
*
*/ /* global entry point */
.global _start
_start:
b reset reset:
/* disable IRQ & FIQ, set the cpu to SVC32 mode */
mrs r0, cpsr
and r1, r0, #0x1f
teq r1, #0x1a
bicne r0, r0, #0x1f
orrne r0, r0, #0x13
orr r0, r0, #0xc0
msr cpsr, r0 /* set exception vector table */
ldr r0, =_start
mcr p15, , r0, c12, c0, /* setup stack, so we can call C code */
ldr sp, =( * ) /* jump to main function */
bl main
loop:
b loop

main.c文件。首先初始化看门狗,设置它在3秒后执行系统复位操作(如果参数值小于0则表示关闭看门狗),然后初始化LED所在IO管脚,设置为输出功能,并且输出低电平,即一开始两个LED是熄灭的,接着是一段延时,目的是可以看到两个LED闪烁,如果观察现象时看到两个LED闪烁,那也说明了看门狗正常工作了。

 #include "io.h"
#include "watchdog.h" #define SUNXI_PIO_BASE (0x01C20800)
#define PH_CFG2 (SUNXI_PIO_BASE + 0x104)
#define PH_DAT (SUNXI_PIO_BASE + 0x10C) /* set two LEDs on */
static void set_led_on(void)
{
unsigned int tmp; /* PH20 and PH21 output 1 */
tmp = readl(PH_DAT);
tmp |= (0x1 << );
tmp |= (0x1 << );
writel(tmp, PH_DAT);
} /* init two PIOs */
static void led_init(void)
{
unsigned int tmp; /* configure PH20 and PH21 output */
tmp = readl(PH_CFG2);
tmp &= ~(0x7 << );
tmp &= ~(0x7 << );
tmp |= (0x1 << );
tmp |= (0x1 << );
writel(tmp, PH_CFG2);
/* PH20 and PH21 output 0 */
tmp = readl(PH_DAT);
tmp &= ~(0x1 << );
tmp &= ~(0x1 << );
writel(tmp, PH_DAT);
} int main(void)
{
int i; /* let watchdog reset the system after 3 second */
sunxi_watchdog_init();
/* init LEDs */
led_init();
/* some delay, so we can see two LEDs off a while */
for (i = ; i < ; i++);
/* set two LEDs on */
set_led_on();
while (); return ;
}

watchdog.c文件。看门狗的驱动程序,非常简单。

 #include "watchdog.h"
#include "io.h" /* watchdog interval value */
static unsigned int watchdog_intv_val [] = {
0b0000, // 0.5s
0b0001, // 1s
0b0010, // 2s
0b0011, // 3s
0b0100, // 4s
0b0101, // 5s
0b0110, // 6s
0b0111, // 8s
0b0111, // 8s
0b1000, // 10s
0b1000, // 10s
0b1001, // 12s
0b1001, // 12s
0b1010, // 14s
0b1010, // 14s
0b1011, // 16s
0b1011 // 16s
}; /* reg bits */
#define WDOG_OFF (-1)
#define WDOG_RST_EN (1)
#define WDOG_EN (0)
#define WDOG_RSTART (0) static void sunxi_watchdog_set(int time)
{
if (time >= ) {
/* should not larger than 16 seconds */
if(time > )
time = ;
writel((watchdog_intv_val[time] << ) | ( << WDOG_RST_EN) | ( << WDOG_EN), SUNXI_WDOG_MODE_REG);
} else {
/* disable watchdog */
writel(, SUNXI_WDOG_MODE_REG);
}
/* restart watchdog */
writel( << WDOG_RSTART, SUNXI_WDOG_CTRL_REG);
} int sunxi_watchdog_init(int val)
{
sunxi_watchdog_set(val); return ;
}

三、验证

使用arm-linux-gnueabihf工具编译后生成watchdog.b文件,再使用mksunxiboot工具在watchdog.b文件前面加上一个头部,最终生成watchdog.bin文件,使用以下命令将watchdog.bin文件烧写到TF中:

#sudo dd if=./watchdog.bin of=/dev/sdb bs=1024 seek=8

将TF卡插入Cubieboard2,上电即可看到两个LED出现短时的周期闪烁,效果不好用图片展示,因此就不上图了。

Cubieboard2裸机开发之(五)看门狗操作的更多相关文章

  1. Cubieboard2裸机开发之(四)定时器操作

    前言 在Cubieboard2裸机开发之(三)里用到了一个延时函数delay,它的延时时间是不精确的,因此为了能够精确延时,就需要定时器的配合.定时器可以精确延时的一个重要原因是它的计时时钟(或者说频 ...

  2. 【分享】iTOP-iMX6UL开发板驱动看门狗 watchdog 以及 Linux-c 测试例程

    iTOP-iMX6UL开发板看门狗测试例程,iTOP-iMX6UL 开发板的看门狗驱动默认已经配置,可以直接使用测试例程. 版本 V1.1:1.格式修改:2.例程修改完善,其中增加喂狗代码.1 看门狗 ...

  3. Cubieboard2裸机开发之(三)C语言操作LED

    前言 前面通过汇编语言点亮LED,代码虽然简单,但并不是很直观.这次使用熟悉的C语言来控制LED,但是需要注意的地方有两点,第一,要想使用C语言,首先需要在调用C语言代码之前设置好堆栈:第二,调用C语 ...

  4. Cubieboard2裸机开发之(二)板载LED交替闪烁

    前言 电路原理在文章http://www.cnblogs.com/lknlfy/p/3583806.html中已经说明,两个LED的原理图是一样的.要使两个LED交替闪烁,只需要在点亮蓝色LED,熄灭 ...

  5. Cubieboard2裸机开发之(一)点亮板载LED

    前言 CUbieboard2板载两个LED,一个绿色的,一个蓝色的,其中绿色LED通过三极管与PH20管脚连接,蓝色LED通过三极管与PH21管脚连接,这里只以蓝色LED为例,电路原理图如图1和图2所 ...

  6. 基于mini2440的看门狗(裸机)

    在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生 ...

  7. stm32 窗口看门狗学习(一)

    什么是窗口看门狗? 1)独立看门狗                限制喂狗时间在0-x内,x由相关寄存器决定.喂狗的时间不能过晚. 2)窗口看门狗               之所以称为窗口就是因为其 ...

  8. mini2440裸机试炼之——看门狗中断和复位操作

    看门狗的工作原理: 设本系统程序完整执行一周期的时间是Tp,看门狗的定时周期为Ti,Ti>Tp,在程序正常执行时,定时器就不会溢出,若因为干扰等原因使系统不能在Tp时刻改动定时器的记数值,定时器 ...

  9. 【Linux开发】linux设备驱动归纳总结(十一):写个简单的看门狗驱动

    linux设备驱动归纳总结(十一):写个简单的看门狗驱动 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...

随机推荐

  1. qooxdoo 3.0 发布,JavaScript 的 GUI 框架

    qooxdoo 3.0 是一个主要的版本,包含很多新特性和内部的改动,qooxdoo 3.0 是一个通用的 JS 框架,主要改进体现在 qx.Desktop, qx.Mobile, 和 qx.Webs ...

  2. 控制ASP.NET Web API 调用频率与限流

    ASP.NET MVC 实现 https://github.com/stefanprodan/MvcThrottle ASP.NET WEBAPI 实现 https://github.com/stef ...

  3. Linux:用户&用户组操作

    用户:查看用户:whoami.who am i.who mom likes创建用户:adduser dgw切换登录用户:su -l dgw退出当前用户: exit删除用户:deluser dgw -- ...

  4. 如何在ASP.NET中用C#将XML转换成JSON

    本文旨在介绍如果通过C#将获取到的XML文档转换成对应的JSON格式字符串,然后将其输出到页面前端,以供JavaScript代码解析使用.或许你可以直接利用JavaScript代码通过Ajax的方式来 ...

  5. 如何给input[file]定义cursor

    来源:http://stackoverflow.com/questions/1537223/change-cursor-type-on-input-type-file Simple question. ...

  6. atitit.GMT UTC Catitit.GMT UTC CST DST CET 星期 月份 节日 时间的不同本质and起源

    atitit.GMT UTC Catitit.GMT UTC CST DST CET 星期 月份 节日 时间的不同本质and起源 1. GMT(Greenwich Mean Time)是格林尼治平时 ...

  7. paip.提升安全性----Des加密 java php python的实现总结

    paip.提升安全性----Des加密 java php python的实现总结 ///////////    uapi         private static String decryptBy ...

  8. 已知2个一维数组:a[]={3,4,5,6,7},b[]={1,2,3,4,5,6,7};把数组a与数组b 对应的元素乘积再赋值给数组b,如:b[2]=a[2]*b[2];最后输出数组b的元素。

    package hanqi; import java.util.Scanner; public class Test7 { public static void main(String[] args) ...

  9. mysql优化之表建设

    就拿常见的用户表.文章类的表.日志表来分析如下 CREATE TABLE `user` (   `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMEN ...

  10. 密码太多记不住?SSO帮你轻松访问VDI及外部资源

    单点登录(SSO)有多种方式,简单来讲,SSO是一个允许用户使用单一登录访问多个资源的认证过程.使用云应用的VDI用户可能需要某种方式的认证访问桌面外部的应用.SSO只需要用户单次输入认证信息就可以访 ...