微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM中的看门狗程序

ARM中的看门狗程序

时间:11-09 来源:互联网 点击:

在主要的文件中:

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     //将异常处理地址的值放到0x6427     memcopy(0x60,source_addr,0x1);28 29     enable_mmu();30     //内存映射将0x04映射到0x6004    31 32      //step 1: cpu cpsr33       __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      //7545      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 watchdog54      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;//配置寄存器为267         GPD0DAT = 0x1;//date=0xf68     }69 70 void pwm_off(void)71     {72         GPD0CON &= ~0xffff;73         GPD0CON = 0x0;74     //  GPD0DAT &=0x0 ;//date=0xf75 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位为088     }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此时将是小页模式4K218     }219 220     //00-10   ====  6070221     for(va=0x00; va<=0x10; va+=0x100){pa = va+0x60;223         addr[va >> 20] = pa  2;224     }225 226     //10-14   ====  1014227     for(va=0x10; va<=0x14; va+=0x100){228         pa = va;229         addr[va >> 20] = pa  2;230     }231 232     //30-40   ====  5060233     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芯片手册。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top