ARM中的看门狗程序
在主要的文件中:
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芯片手册。
ARM看门狗程 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)
