Cubieboard2裸机开发之(五)看门狗操作
前言
说到看门狗,应该不会陌生,看门狗说白了就是一个定时器,但是它有一个非常重要的功能就是复位系统。在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裸机开发之(五)看门狗操作的更多相关文章
- Cubieboard2裸机开发之(四)定时器操作
前言 在Cubieboard2裸机开发之(三)里用到了一个延时函数delay,它的延时时间是不精确的,因此为了能够精确延时,就需要定时器的配合.定时器可以精确延时的一个重要原因是它的计时时钟(或者说频 ...
- 【分享】iTOP-iMX6UL开发板驱动看门狗 watchdog 以及 Linux-c 测试例程
iTOP-iMX6UL开发板看门狗测试例程,iTOP-iMX6UL 开发板的看门狗驱动默认已经配置,可以直接使用测试例程. 版本 V1.1:1.格式修改:2.例程修改完善,其中增加喂狗代码.1 看门狗 ...
- Cubieboard2裸机开发之(三)C语言操作LED
前言 前面通过汇编语言点亮LED,代码虽然简单,但并不是很直观.这次使用熟悉的C语言来控制LED,但是需要注意的地方有两点,第一,要想使用C语言,首先需要在调用C语言代码之前设置好堆栈:第二,调用C语 ...
- Cubieboard2裸机开发之(二)板载LED交替闪烁
前言 电路原理在文章http://www.cnblogs.com/lknlfy/p/3583806.html中已经说明,两个LED的原理图是一样的.要使两个LED交替闪烁,只需要在点亮蓝色LED,熄灭 ...
- Cubieboard2裸机开发之(一)点亮板载LED
前言 CUbieboard2板载两个LED,一个绿色的,一个蓝色的,其中绿色LED通过三极管与PH20管脚连接,蓝色LED通过三极管与PH21管脚连接,这里只以蓝色LED为例,电路原理图如图1和图2所 ...
- 基于mini2440的看门狗(裸机)
在由单片机构成的微型计算机系统中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生 ...
- stm32 窗口看门狗学习(一)
什么是窗口看门狗? 1)独立看门狗 限制喂狗时间在0-x内,x由相关寄存器决定.喂狗的时间不能过晚. 2)窗口看门狗 之所以称为窗口就是因为其 ...
- mini2440裸机试炼之——看门狗中断和复位操作
看门狗的工作原理: 设本系统程序完整执行一周期的时间是Tp,看门狗的定时周期为Ti,Ti>Tp,在程序正常执行时,定时器就不会溢出,若因为干扰等原因使系统不能在Tp时刻改动定时器的记数值,定时器 ...
- 【Linux开发】linux设备驱动归纳总结(十一):写个简单的看门狗驱动
linux设备驱动归纳总结(十一):写个简单的看门狗驱动 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...
随机推荐
- 【ASP.NET Web API教程】6.4 模型验证
本文是Web API系列教程的第6.4小节 6.4 Model Validation 6.4 模型验证 摘自:http://www.asp.net/web-api/overview/formats-a ...
- 微软BI 之SSIS 系列 - 2008 版本中变量 Int64 无法保存 bigint 类型数据的BUG
开篇介绍 这是今天在帮别人看一个 2008R2 版本的项目时发现的一个 Bug,这个 Bug 在 SQL SERVER 2012 有的版本中可能已经解决,但在论坛上看到有的仍然存在. 在 SQL SE ...
- 一页纸商业计划书 (Business Plan) 模板(转载)
本文转载自:https://blog.eood.cn/business-plan 假如你也有一个 idea ,但是还处于想法阶段,这个商业计划书模板能够帮你理清思路. 这个一页 BP 模板简单实用,分 ...
- perl在命令行中打印单引号
perl -e 'print "\'";' 这样写是不行的,这里直接执行会当作这命令未结束.反斜杠对符号做了转义,这样的命令解释成: perl -e 'print ';' (双 ...
- RSA密钥的跨平台通用
RSA使用public key加密,用private key解密(签名相反,使用private key签名,用public key验证签名).比如我跟合作方D之间的数据传输,我使用D提供给我的publ ...
- Homebrew- MAC上的包管理利器
包管理器是神马东西?让我们看看wikipedia上的介绍. In software, a package management system, also called package manager, ...
- Minifying Angular应用时产生的问题
一.产生的问题 如果你正在进行AngularJS的项目开发,生产时Minified JS文件有没有遇到下面问题: angular.module("myApp", []) .cont ...
- 【系统移植】kernel分析
内核启动流程 第二阶段 starte_kernel: | rest_init: | kernel_init | do_basic_setup(); // 加载驱动 | do_i ...
- MongoDB学习笔记——索引管理
索引 索引能够提升查询的效率.没有索引,MongoDB必须扫描集合中的所有文档,才能找到匹配查询语句的文档. 索引是一种特殊的数据结构,将一小块数据集保存为容易遍历的形式.索引能够存储某种特殊字段或字 ...
- RTTI的实现(vc)--转载
RTTI (Run Time Type info) 这个神奇的东西用于存储类的相关信息,用于在运行时识别类对象的信息.C++ 里面只记录的类的名字和类的继承关系链.使得编译成二进制的代码,对象可以知道 ...