ARM中的看门狗程序

发布者:脑力驿站最新更新时间:2016-06-22 来源: eefocus关键字:ARM  看门狗程序 手机看文章 扫描二维码
随时随地手机看文章
在ARM中,有一个硬件部分叫WATCH DOG。这个硬件,一直在做一件事情:就是,从某一数值,一直数,各一段时间减一,隔一段时间减一,直到减到0的时候将会触发重启或者中断。而有时候,为了预防死机,我们在操作系统跑起来的时候会有一个特定的程序来做一件事情:减到特定是值的时候数值将会重新置到100.这样,看门狗将会循环往复做一件事情:一直数数,而不会死机。

这个程序叫做守护程序:又叫做喂狗程序。

看门狗的逻辑运算图如下:

ARM中的看门狗程序

 

今天,有看门狗来写了一个程序:隔一段时间来触发一个中断,每次中断来的时候,将会让板子上面的灯和蜂鸣器做出相应的反映:

首先:在头文件中将具体的寄存器声明:

 1 
  2 #define gpiobase        0x11
  3 #define GPM4CON         (*(volatile unsigned long *)(gpiobase + 0x02E0)) 
  4 #define GPM4DAT         (*(volatile unsigned long *)(gpiobase + 0x02E4))
  5 #define GPX3CON         (*(volatile unsigned long *)(gpiobase + 0x0C60))
  6 #define GPX3DAT         (*(volatile unsigned long *)(gpiobase + 0x0C64))
  7 #define GPD0CON         (*(volatile unsigned long *)(gpiobase + 0x4A0))
  8 #define GPD0DAT         (*(volatile unsigned long *)(gpiobase + 0x4A4))
  9 
 10 #define ICC 0x10480
 11 
 12 #define ICCICR_CPU0     (*(volatile unsigned long *)(ICC + 0x0)) 
 13 #define ICCPMR_CPU0     (*(volatile unsigned long *)(ICC + 0x4)) 
 14 #define ICCBPR_CPU0     (*(volatile unsigned long *)(ICC + 0x8)) 
 15 #define ICCIAR_CPU0     (*(volatile unsigned long *)(ICC + 0xC)) 
 16 #define ICCEOIR_CPU0    (*(volatile unsigned long *)(ICC + 0x0010)) 
 17 #define ICCRPR_CPU0     (*(volatile unsigned long *)(ICC + 0x0014)) 
 18 #define ICCHPIR_CPU0    (*(volatile unsigned long *)(ICC + 0x0018)) 
 19 #define ICCABPR_CPU0    (*(volatile unsigned long *)(ICC + 0x001C)) 
 20 #define INTEG_EN_C_CPU0 (*(volatile unsigned long *)(ICC + 0x0040)) 
 21 #define ICCIIDR         (*(volatile unsigned long *)(ICC + 0x00FC))
 22 
 23 #define ICD 0x10490
 24 
 25 #define ICDDCR            (*(volatile unsigned long *)(ICD + 0x0))
 26 #define ICDICTR           (*(volatile unsigned long *)(ICD + 0x4))
 27 #define ICDIIDR           (*(volatile unsigned long *)(ICD + 0x8))
 28 #define ICDISR0_CPU0      (*(volatile unsigned long *)(ICD + 0x0080))
 29 #define ICDISER0_CPU0     (*(volatile unsigned long *)(ICD + 0x0100))
 30 #define ICDISER2_CPU0     (*(volatile unsigned long *)(ICD + 0x0108))
 31 #define ICDICER0_CPU0     (*(volatile unsigned long *)(ICD + 0x0180))
 32 #define ICDISPR0_CPU0     (*(volatile unsigned long *)(ICD + 0x0200))
 33 #define ICDICPR0_CPU0     (*(volatile unsigned long *)(ICD + 0x0280))
 34 #define ICDABR0_CPU0      (*(volatile unsigned long *)(ICD + 0x0300))
 35 #define ICDIPR0_CPU0      (*(volatile unsigned long *)(ICD + 0x0400))
 36 #define ICDIPR1_CPU0      (*(volatile unsigned long *)(ICD + 0x0404))
 37 #define ICDIPR2_CPU0      (*(volatile unsigned long *)(ICD + 0x0408))
 38 #define ICDIPR3_CPU0      (*(volatile unsigned long *)(ICD + 0x040C))
 39 #define ICDIPR4_CPU0      (*(volatile unsigned long *)(ICD + 0x0410))
 40 #define ICDIPR5_CPU0      (*(volatile unsigned long *)(ICD + 0x0414))
 41 #define ICDIPR6_CPU0      (*(volatile unsigned long *)(ICD + 0x0418))
 42 #define ICDIPR7_CPU0      (*(volatile unsigned long *)(ICD + 0x041C))
 43 #define ICDIPR18_CPU0      (*(volatile unsigned long *)(ICD + 0x448))
 44 
 45 #define ICDIPTR0_CPU0   (*(volatile unsigned long *)(ICD + 0x0800))
 46 #define ICDIPTR1_CPU0   (*(volatile unsigned long *)(ICD + 0x0804))
 47 #define ICDIPTR18_CPU0  (*(volatile unsigned long *)(ICD + 0x0848))
 48 #define ICDSGIR     (*(volatile unsigned long *)(ICD + 0x0F00))
 49 
 50 
 51 #define WTCON    (*(volatile unsigned long *)0x10060)
 52 #define WTDAT    (*(volatile unsigned long *)0x10064)
 53 #define WTCNT    (*(volatile unsigned long *)0x10068)
 54 #define WTCLRINT (*(volatile unsigned long *)0x1006C) 
 55 
 56 
 57 

在主要的文件中:

  1 #include"regs.h"
  2 
  3 int (*printf)(char *, ...) = 0xc3e114d8;
  4 int(*delay)(int)=0xc3e25f90;
  5 
  6 void init_ttb(unsigned long *addr);
  7 void enable_mmu(void);
  8 unsigned long data_abort_init();
  9 void memcopy(unsigned long* dest,unsigned long* source,int len);
 10 void do_irq();
 11 void pwm_on(void);
 12 void pwm_off(void);
 13 void led_on(void);
 14 void led_on(void);
 15 
 16 
 17 
 18 int main()
 19 {
 20      *(unsigned long *)0x66 = do_irq;
 21 
 22     //发生异常时会进入异常模式跳转到0 4地址处理异常事件   
 23     unsigned long source_addr=data_abort_init();
 24     //异常事件处理函数
 25     printf("swi_souce addr is %x\n",source_addr);
 26     //将异常处理地址的值放到0x64
 27     memcopy(0x60,source_addr,0x1);
 28 
 29     enable_mmu();
 30     //内存映射将0x04映射到0x6004    
 31 
 32      //step 1: cpu cpsr
 33       __asm__ __volatile__(
 34           "mrs r0, cpsr\n"
 35           "bic r0, r0, #0x80\n"//设置CPSR的I位,将IRQ位打开
 36           "msr cpsr, r0\n"
 37           ::: "r0"
 38       );
 39 
 40       //step 2: GIC 
 41       ICCICR_CPU0 = 1;//CPU接口控制寄存器
 42       ICCPMR_CPU0 = 0xff;//中断优先标志寄存器
 43 
 44      //75
 45      ICDDCR = 1;
 46      //ICDIPR0_CPU0 = (0x00 << 0);
 47      ICDIPR18_CPU0 = (0x0 << 24);
 48      //ICDIPTR0_CPU0 = 1;
 49      ICDIPTR18_CPU0 = (0x1 << 24);
 50      //ICDISER0_CPU0 = (1 << 0);
 51      ICDISER2_CPU0 = (1 << 11);
 52 
 53      //step 3: interrupt source watchdog
 54      WTCON = 0  (1 << 2)  (3 << 3)  (1 << 5)  (250 << 8);
 55      WTCNT = 0x8;
 56      WTDAT = 0x1;
 57 
 58     printf("welcome back! \n");
 59 
 60 
 61 }
 62 
 63 void pwm_on(void)
 64     {
 65         GPD0CON &= ~0xffff;
 66         GPD0CON = 0x1;//配置寄存器为2
 67         GPD0DAT = 0x1;//date=0xf
 68     }
 69 
 70 void pwm_off(void)
 71     {
 72         GPD0CON &= ~0xffff;
 73         GPD0CON = 0x0;
 74     //  GPD0DAT &=0x0 ;//date=0xf
 75 
 76     }
 77 void led_off(void)
 78     {
 79         GPM4CON &= ~0xffff;//清零
 80         GPM4CON = 0x0;//03位清零
 81         GPM4DAT = 0x0;//date=0xf关闭置一
 82     }
83 void led_on(void)
 84     {
 85         GPM4CON &= ~0xffff;
 86         GPM4CON = 0x1;//配置寄存器3-0--3-3全为1,全为输出模式
 87         GPM4DAT &= ~0xf;//打开置0-4位为0
 88     }
 89 
 90 void do_irq()
 91     {
 92         unsigned long data = ICCIAR_CPU0;
 93         unsigned long irq_id = data & 0x3ff;
 94         unsigned long cpu_id = (data >> 10) & 0x7;
 95         ICCEOIR_CPU0 = irq_id  (cpu_id << 10);
 96         printf("irq is %d, cpu is %d\n", irq_id, cpu_id);
 97 
 98          pwm_on();
 99          led_on();
100         printf("hello dog!\n");
101          delay(6);
102          pwm_off();
103          led_off();
104         WTCLRINT = 0x1;
105     }
106 
107 void memcopy(unsigned long* dest, unsigned long* source,int len)
108 {
109     int i=0;;
110     for(i=0;i> 20] = pa  2;
217         //2的目的是将0-2位置为10此时将是小页模式4K
218     }
219 
220     //00-10   ====  6070
221     for(va=0x00; va<=0x10; va+=0x100){
         pa = va+0x60;
223         addr[va >> 20] = pa  2;
224     }
225 
226     //10-14   ====  1014
227     for(va=0x10; va<=0x14; va+=0x100){
228         pa = va;
229         addr[va >> 20] = pa  2;
230     }
231 
232     //30-40   ====  5060
233     for(va=0x30; va<0x40; va+=0x100){
234         pa = va + 0x20;
235         addr[va >> 20] = pa  2;
236     }
237 }
                                                                  

主要看主函数部分:

39 
 40       //step 2: GIC 
 41       ICCICR_CPU0 = 1;//CPU接口控制寄存器
 42       ICCPMR_CPU0 = 0xff;//中断优先标志寄存器
 43 
 44      //75
 45      ICDDCR = 1;
 46      //ICDIPR0_CPU0 = (0x00 << 0);
 47      ICDIPR18_CPU0 = (0x0 << 24);
 48      //ICDIPTR0_CPU0 = 1;
 49      ICDIPTR18_CPU0 = (0x1 << 24);
 50      //ICDISER0_CPU0 = (1 << 0);
 51      ICDISER2_CPU0 = (1 << 11);
 52 
 53      //step 3: interrupt source watchdog
 54      WTCON = 0 (1 << 2) (3 << 3) (1 << 5) (250 << 8);
 55      WTCNT = 0x8;
 56      WTDAT = 0x1;
 57 
 58     printf("welcome back! \n");
还有:

90 void do_irq()
 91     {
 92         unsigned long data = ICCIAR_CPU0;
 93         unsigned long irq_id = data & 0x3ff;
 94         unsigned long cpu_id = (data >> 10) & 0x7;
 95         ICCEOIR_CPU0 = irq_id (cpu_id << 10);
 96         printf("irq is %d, cpu is %d\n", irq_id, cpu_id);
 97 
 98          pwm_on();
 99          led_on();
100         printf("hello dog!\n");
101          delay(6);
102          pwm_off();
103          led_off();
104         WTCLRINT = 0x1;
105     }
其中,各个寄存器详见:1352芯片手册。

ARM中的看门狗程序

ARM中的看门狗程序

 

 

ARM中的看门狗程序

运行成功:

ARM中的看门狗程序

将会发现板子,各一段时间就会叫一次。LED会闪烁一次!

改变WTDAT的值就会修改叫的频率!

关键字:ARM  看门狗程序 引用地址:ARM中的看门狗程序

上一篇:ARM中链接寄存器LR和指令寄存器IR的关系
下一篇:ARM中的中断

推荐阅读最新更新时间:2024-03-16 14:58

Arm老乡UltraSoC获融资,携RISC-V等架构的分析技术来华
  与 ARM 一样发源于英国剑桥,这家做SoC嵌入式分析的IP公司尽管只有二十几人,但刚刚获得了600万美元的风投。不久前,该公司信心满满地来中国,参加了中国系列活动,例如在一年一度的ICCAD(中国集成电路设计业年会)2017上露面。下面就随嵌入式小编一起来了解一下相关内容吧。   这家公司就是 UltraSoC ,首席执行官Rupert Baines先生在ICCAD期间向电子产品世界记者介绍了RISC-V及该公司的产品。    RISC-V是CPU界的Linux    UltraSoC 的一大亮点是支持RISC-V,也是RISC-V联盟的活跃成员。据悉,现在RISC-V发展很快,已有一些客户用RISC-V做服务器、分布
[嵌入式]
浅谈μCOSII在Cortex-M3核的ARM处理器上的移植
随着科学技术的发展,嵌入式技术已被广泛应用到汽车电子、无线通信、数码产品等各个领域。嵌入式操作系统及嵌入式处理器技术发展迅猛,嵌入式操作系统典型代表有μCOS—II、μClinux、Winclow CE、VxWorks等;嵌入式处理器包括ARM、MIPS、PowerPC等。 1 软硬件开发环境及处理器介绍 1.1 软件硬开发环境 本移植过程使用的软件环境是RealView MDK开发套件,此产品是ARM公司最新推出的针对各种嵌入式处理器的软件开发工具,该开发套件功能强大,包括了μVisiON3集成开发环境和RealView编译器。使用的硬件平台是深圳英蓓特公司推出的全功能评估板STMl03V100,其上所采用的处理器是S
[工业控制]
浅谈μCOSII在Cortex-M3核的<font color='red'>ARM</font>处理器上的移植
基于ARM9和3G网络的社区温湿度远程监测系统研究
随着人们生活水平的提高,人们对居住环境的要求越来越高,家居环境中尤为受到人们关注的是有害气体的污染、温湿度控制等。研究结果表明:人体最适宜的健康温度为18~24℃,健康湿度为45%~65%RH,在这种环境下人体感觉最舒适。传统的环境监测系统大部分采用的是人工采集或是采用有线监测的方法,人工采集数据,既消耗大量的人力和物力又不能够实时的采集环境监测数据,有时还会给数据采集带来误差。有线监测虽然具有很多优点,但是由于监测点分布广而散,有些监测点既偏远又危险,给有线监测的实现带来非常巨大的困难,同时有线监测需要大量的电话线进行数据传输增加了巨大的成本。随着第三代移动通讯在我国大量普及,以3G网络和嵌入式系统为基础的远程环境监测系统取得了
[单片机]
基于<font color='red'>ARM</font>9和3G网络的社区温湿度远程监测系统研究
基于ARM与FPGA的LCD控制器设计
随着显示屏技术的不断发展,真彩液晶显示屏以其高分辨率、高对比度及高清晰度等优势逐渐在嵌入式显示系统中占据重要地位。目前,基于嵌入式平台的LCD显控技术的实现主要有两种方式:ARM内嵌LCD控制器和独立的控制器件。但是这两种实现方式都存在着不足之处,内嵌控制器的使用可能增大处理器的负担和限制显示帧率,而外部控制器件不仅成本高,而且专用性比较强,很难适应不同类型的液晶屏。 据此存在的问题,这里提出一种基于ARM与FPGA的LCD控制器设计方案,该设计方案一方面能够通过操作LINUX OS下的Framebuffer设备提高显存的写入速率及减轻处理器的负担,另一方面用FPGA来实现LCD控制器的设计,开发周期短、功耗低,同时具有灵
[单片机]
基于<font color='red'>ARM</font>与FPGA的LCD控制器设计
基于ARM—LINUX平台的物联网服务器设计
0 引言 物联网是互联网应用的扩展,是一种新兴的联网技术,其核心是物与物之间的信息通信交流,也是物与人之间的交互控制。物联网技术,主要是利用各种传感器设备,例如:无线技术、射频识别(RFID)技术,各类传感器等技术设备将物理世界中的各种信息,如温度、光强、位置等信息通过网络传输,达到物与物之间、物与人之间的信息交互目的。 要使人们能方便地访问物联网信息,监测和控制各类传感节点和电气设备,一个友好的用户界面是前提。基于B/S架构的解决方案以其客户端通用性成为构建系统的首选。本文将设计开发一个通用的基于ARM处理器平台和Linux嵌入式操作系统的物联网服务器,在硬件平台上,将使用基于XSCALEPXA270处理器的UPTECH
[单片机]
基于<font color='red'>ARM</font>—LINUX平台的物联网服务器设计
基于ARM Linux的无线音视频对讲系统设计
随着数字化和网络化时代的到来,尤其是宽带无线网络的发展,为音视频这样大数据量传输业务在无线网络上的应用提供了契机。同时由于音视频独特的感官特性,使其相关的应用需求也变得越来越迫切。无线多媒体是多媒体和移动通信这两个领域的技术相互融合的产物,成为当今通信领域的一个热点。鉴于Linux内核的开源性,采用其作为操作系统,从而使整个系统具有更好的实时性和稳定性。整个系统以ARM11为核心处理器、采用新一代视频编解码标准H.264进行编译码,并通过无线网络传输音视频。它充分利用S3C6410微处理器内部集成的多媒体编解码器(Multi-Formatvideo Codec,MFC),有效提高了系统的性价比。整个系统为无线多媒体音视频的传输提供了
[单片机]
基于<font color='red'>ARM</font> Linux的无线音视频对讲系统设计
IAR发布支持NXP Cortex-M3的开发套件
IAR Systems推出支持NXP超低功耗ARM Cortex-M3 LPC1768芯片的开发套件。这个套件包括LPC1768开发板、IAR Embedded Workbench for ARM集成开发环境评估学习版、IAR PowerPac RTOS评估版、IAR visualSTATE状态机建模工具评估版,以及一个独立的IAR J-Link仿真器。此外,这个套件所带的丰富示例代码能帮助用户加快LPC1768项目开发进度。 开发板有丰富的外设:三轴加速计、温度传感器、外部传感器输入、SD/MMC卡插槽、以太网连接器、收发器、不同的USB接口、麦克风、耳机接口、 CAN总线连接器、2个UART DB9连接器、JTA
[单片机]
Arm首次公开募股已获得10倍超额认购 或提前截止
知情人士透露,Arm Holdings Ltd.首次公开募股(IPO)已获得10倍超额认购,银行计划到周二下午就停止接受认购。因事未公开而不愿具名的知情人士称,软银集团旗下Arm将在周二提前一天结束认购,但仍计划在周三进行定价。IPO提前停止认购的情况并不罕见,这通常表明需求强劲。 上述人士补充称,到周三,此次发行可能获得高达15倍超额认购。目前一切尚未敲定,IPO订单也可能发生变化。 Arm的一位代表不予置评。 早些时候报道,Arm仍在考虑提高IPO的价格区间 。随着IPO最终定价临近,承销商通常会试图创造积极的势头。英国《金融时报》此前报道称Arm认购将提前结束。 Arm寻求以每股47-51美元的价格发行股
[半导体设计/制造]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved