A20 看门狗

前言

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

 

一、目的

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

 

二、源代码说明

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

 1 /*
 2  * (C) Copyright 2014 conan liang <lknlfy@163.com>
 3  * 
 4  */
 5 
 6 
 7 /* global entry point */
 8 .global _start
 9 _start:
10     b    reset
11     
12 
13 reset:
14     /* disable IRQ & FIQ, set the cpu to SVC32 mode */
15     mrs r0, cpsr
16     and r1, r0, #0x1f
17     teq r1, #0x1a
18     bicne r0, r0, #0x1f
19     orrne r0, r0, #0x13
20     orr r0, r0, #0xc0
21     msr cpsr, r0
22 
23     /* set exception vector table */
24     ldr r0, =_start
25     mcr p15, 0, r0, c12, c0, 0
26 
27     /* setup stack, so we can call C code */
28     ldr sp, =(1024 * 10)
29     
30     /* jump to main function */
31     bl main
32 loop:
33     b loop

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

 1 #include "io.h"
 2 #include "watchdog.h"
 3 
 4 
 5 #define SUNXI_PIO_BASE   (0x01C20800)
 6 #define PH_CFG2          (SUNXI_PIO_BASE + 0x104)
 7 #define PH_DAT           (SUNXI_PIO_BASE + 0x10C)
 8 
 9 
10 /* set two LEDs on */
11 static void set_led_on(void)
12 {
13     unsigned int tmp;
14     
15     /* PH20 and PH21 output 1 */
16     tmp = readl(PH_DAT);
17     tmp |= (0x1 << 20);
18     tmp |= (0x1 << 21);
19     writel(tmp, PH_DAT);
20 }
21 
22 /* init two PIOs */
23 static void led_init(void)
24 {
25     unsigned int tmp;
26     
27     /* configure PH20 and PH21 output */
28     tmp = readl(PH_CFG2);
29     tmp &= ~(0x7 << 16);
30     tmp &= ~(0x7 << 20);
31     tmp |= (0x1 << 16);
32     tmp |= (0x1 << 20);
33     writel(tmp, PH_CFG2);
34     /* PH20 and PH21 output 0 */
35     tmp = readl(PH_DAT);
36     tmp &= ~(0x1 << 20);
37     tmp &= ~(0x1 << 21);
38     writel(tmp, PH_DAT);
39 }
40 
41 
42 int main(void)
43 {
44     int i;
45 
46     /* let watchdog reset the system after 3 second */
47     sunxi_watchdog_init(3);
48     /* init LEDs */
49     led_init();
50     /* some delay, so we can see two LEDs off a while */
51     for (i = 0; i < 50000; i++);
52     /* set two LEDs on */
53     set_led_on();
54     while (1);
55     
56     return 0;
57 }

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

 1 #include "watchdog.h"
 2 #include "io.h"
 3 
 4 /* watchdog interval value */
 5 static unsigned int watchdog_intv_val [] = {
 6     0b0000, // 0.5s
 7     0b0001, // 1s
 8     0b0010, // 2s
 9     0b0011, // 3s
10     0b0100, // 4s
11     0b0101, // 5s
12     0b0110, // 6s
13     0b0111, // 8s
14     0b0111, // 8s
15     0b1000, // 10s
16     0b1000, // 10s
17     0b1001, // 12s
18     0b1001, // 12s
19     0b1010, // 14s
20     0b1010, // 14s
21     0b1011, // 16s
22     0b1011  // 16s
23 };
24 
25 /* reg bits */
26 #define WDOG_OFF     (-1)
27 #define WDOG_RST_EN  (1) 
28 #define WDOG_EN      (0)
29 #define WDOG_RSTART  (0)
30 
31 static void sunxi_watchdog_set(int time)
32 {
33     if (time >= 0) {
34         /* should not larger than 16 seconds */
35         if(time > 16)
36             time = 16;
37         writel((watchdog_intv_val[time] << 3) | (1 << WDOG_RST_EN) | (1 << WDOG_EN), SUNXI_WDOG_MODE_REG);
38     } else {
39         /* disable watchdog */
40         writel(0, SUNXI_WDOG_MODE_REG);
41     }
42     /* restart watchdog */
43     writel(1 << WDOG_RSTART, SUNXI_WDOG_CTRL_REG);
44 }
45 
46 int sunxi_watchdog_init(int val)
47 {
48     sunxi_watchdog_set(val);
49     
50     return 0;
51 }

 

三、验证

       使用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出现短时的周期闪烁,效果不好用图片展示,因此就不上图了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/433470.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python拼接大量ts文件_Python爬取.ts文件,合并为mp4

目标&#xff1a;爬影视网站ts文件到本地&#xff0c;合并成mp4文件下载ts文件本着不重复造轮子的精神(好吧其实是我懒)&#xff0c;想用迅雷批量下载爬取&#xff0c;但是迅雷提供的通配符过于简单无法构造URL&#xff0c;只能自己写脚本如下&#xff1a;# -*- coding: utf-8 …

android学习笔记之ProgressDialog的使用

在很多PC软件或手机软件中&#xff0c;我们都会看见 “加载中...” 类似的对话框&#xff0c;当然&#xff0c;在android应用程序中也是如此。如果我们想在android应用程序中使用这样的效果&#xff0c;那么就需要用到ProgressDialog。首先&#xff0c;我们来看一下ProgressDia…

asterisk 互联问题

asterisk A 和asterisk B互联。 A下面有账户1001&#xff0c;B下面有账户2001 当1001呼叫2001时&#xff0c;B的sip.conf里不能有1001。 当2001呼叫1001时&#xff0c;A的sip.conf里不能有2001。 否则&#xff0c;呼叫无法呼叫成功。 下面为截图 实际和在振铃时&#xff0…

清除python shell中的内容_如何使用python脚本定时清空文件内容?

我们一直在对大家强调关于python脚本的使用&#xff0c;但是有部分同学提出疑问&#xff0c;就是关于上期跟大家说的shell脚本没有实质性的使用效果&#xff0c;如果在实际应用里&#xff0c;要怎么使用这个脚本&#xff0c;它又能实现什么效果&#xff0c;其实针对这个内容&am…

ACCESS中不支持left join解决方案

今天在做基于 access数据库项目中,做外连接时,发现Access不支持两个以上的 left join 在网上查一下,有哥们说每个 left join 要加 () 在修改之前(不能执行,ms sql 里执行以通过) select table1.fildes1, table1.fildes2,table2.fildes1, table2.fildes2,table3.fildes…

docker mysql主从_使用docker 实现MySQL主从同步/读写分离

1. 利用 docker 实现 mysql 主从同步 / 读写分离为了保证数据的完整和安全&#xff0c;mysql 设计了主从同步&#xff0c;一个挂掉还可以用另个。最近重构论坛&#xff0c;想来改成主从吧。担心失误&#xff0c;就先拿 docker 练练手。通过本文实际你会操作到。mysql 的主从同步…

Linux中的EAGAIN含义

在Linux环境下开发经常会碰到很多错误(设置errno)&#xff0c;其中EAGAIN是其中比较常见的一个错误(比如用在非阻塞操作中)。从字面上来看&#xff0c;是提示再试一次。这个错误经常出现在当应用程序进行一些非阻塞(non-blocking)操作(对文件或socket)的时候。例如&#xff0c;…

mysql sys 数据库_mysql sys 数据库

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航&#xff0c;为用户…

python get方法请求参数_如何解决TypeError get()在使用get方法的Python请求中恰好接受2个参数(给定3个)...

在Python中使用Request对象时出现错误.下面是我的代码.class APIDOC(Document):def request_api(self):method_type self.method_typeapi self.apiparameters self.parameterssession_object requests.session()self.get_login(session_object)if method_type "POST&…

getsockname与getpeername

getsockname与getpeername是返回套接口关联的本地协议地址和远程协议地址。 int getsockname(int sockfd, struct sockaddr * localaddr, socken_t * addrlen); int getpeername(int sockfd, struct sockaddr * peeraddr, socken_t * addrlen); 返回0表示成功&#xff0c;返回1…

KingPaper初探ThinkPHP3.1.2之目录部署(二)

在我们使用Thinkphp搭建项目时&#xff0c;目录部署是必不可少的一个环节接下来我们来学习以下目录部署在APP目录下面现在项目目录下所拥有的文件 ThinkPHP目录 存放thinkphp框架系统目录Home 我们创建的应用目录index.php我们的入口文件 我们还需要创建Public 网站所有的公共…

mysql函数match_Mysql全文搜索match…against的用法 | 学步园

全文检索在 MySQL 中就是一个 FULLTEXT 类型索引。FULLTEXT索引用于 MyISAM 表&#xff0c;可以在 CREATE TABLE 时或之后使用 ALTER TABLE 或 CREATE INDEX 在CHAR、 VARCHAR 或 TEXT 列上创建。对于大的数据库&#xff0c;将数据装载到一个没有 FULLTEXT 索引的表中&#x…

华为手机可以安装python吗_何安装python2.6

由于机器上的python 版本比较高&#xff0c;需要安装一个低版本的python具体执行步骤&#xff1a;1. 使用如下命令下载到2.6版本wget http://www.python.org/ftp/python/2.6/Python-2.6.tgz2. 解压pythontar xzf Python-2.6.tgzcd Python-2.63. 编译安装python./configure --pr…

Linux串口编程

.串口概述 常见数据通信方式:并行通信&#xff0c;串行通信 UART的主要操作&#xff1a; >数据发送及接受 >产生中断 >产生波特率 >Loopback模式 >红外模式 >自动流控模式 串口参数的配置主要包括:波特率、数据位、停止位、流控协议…

[转]如何在.NET MVC中使用jQuery并返回JSON数据

本文转自&#xff1a;http://blog.sina.com.cn/s/blog_48e42dc90100xp1p.html 二、开始实践 - jQuery端 假设我们要从服务器端获取一个文章列表&#xff0c;并把文章条目显示在页面中&#xff0c;而加载的过程要用ajax实现&#xff0c;即实现异步加载。那么我们先来完成jquery向…

mysql查当前用户的的命令_mysql命令大全用户管理相关命令

grant 普通数据用户&#xff0c;查询、插入、更新、删除 数据库中所有表数据的权利。grant select on testdb.* to common_user’%’grant insert on testdb.* to common_user’%’grant update on testdb.* to common_user’%’grant delete on testdb.* to common_user’%’或…

ud分区删除工具_硬盘分区GPT分区怎么转MBR呢?硬盘分区GPT分区转MBR教程

很多用户的电脑预装的是win10系统&#xff0c;想要重装成win7系统。不过新电脑一般都是GPT分区&#xff0c;想要把win10重装成win7&#xff0c;首先需要将GPT分区转MBR。那么&#xff0c;硬盘分区GPT分区怎么转MBR呢?下面就让小编为大家带来硬盘分区GPT分区转MBR教程。提示:单…

串口

1. 5350串口可以设置阻塞模式&#xff0c;3352只能是非阻塞模式 2. termios结构体为全局变量或局部变量&#xff0c;5350分别为阻塞或非阻塞 3. termios结构体在使用前必须清0&#xff0c;否则会出现有时收不到数据的情况 4. termios结构体必须被设置&#xff0c;否则会出现发送…

python中的ix是啥_详谈Pandas中iloc和loc以及ix的区别

Pandas库中有iloc和loc以及ix可以用来索引数据&#xff0c;抽取数据。但是方法一多也容易造成混淆。下面将一一来结合代码说清其中的区别。1. iloc和loc的区别&#xff1a;iloc主要使用数字来索引数据&#xff0c;而不能使用字符型的标签来索引数据。而loc则刚好相反&#xff0…

mysql 结构体_mysql模块使用结构体生成数据库表,不识别long类型

windows环境&#xff1a;windows10&#xff0c;vs2017&#xff0c;编译器最新&#xff0c;支持c17.问题描述&#xff1a;例如结构体&#xff1a;struct test_create_table{//__int64 id; //可以long id; //不可以&#xff0c;编译报错string name;};REFLECTION(test_create_tab…