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

ARM中外部中断

时间:11-20 来源:互联网 点击:
在整个ARM体系结构中,为了处理外部中断,依次学习了MMU,模式跳转,异常,GIC,看门狗程序,这些都是为了处理外部中断

具体如下:

处理外部中断有五个步骤:

30 //step 1: cpu cpsr
31 __asm__ __volatile__(
32 "mrs r0, cpsr\n"
33 "bic r0, r0, #0x80\n"//设置CPSR的I位,将IRQ位打开
34 "msr cpsr, r0\n"
35 ::: "r0"
36 );
37
38 //setp1:GIC
39 ICCICR_CPU0 = 1;
40 ICCPMR_CPU0 = 0xff;
41

前面的代码不解释,和以前的差不多

外部中断号为:64

42//step2:设置中断号
43 ICDDCR = 1;//总开关
44 ICDIPR16_CPU0 = (0x0 < 0);//ICD一共40个寄存器,第16个寄存器,第0位
45 ICDIPTR16_CPU0 = (0x1 < 0);//优先级,最高
46 ICDISER2_CPU0 = (1 < 0);//一共五个,第2个使能中断

47

第二步为设置中断号:

 详细看代码注释:寄存器参考手册第594页

48 //step 3: set gpio
49 GPX3CON = (0xf < 8);//是GPXCON为外部中断功能

查看到使用外部中断功能的对应外部寄存器:EXT_INT43:

51 //step 4: extern
52 EXT_INT43CON = (2 < 8);//设置上升沿触发
53 EXT_INT43MASK = 0;//使能中断

设置外部中断控制器:寄存器参考手册第366页
55 //step 5: source
56 外部中断源这里设置由外部按键K触发:

代码如下

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 int main()17 {18      *(unsigned long *)0x66 = do_irq;19 20     //发生异常时会进入异常模式跳转到0 4地址处理异常事件   21     unsigned long source_addr=data_abort_init();22     //异常事件处理函数23     printf("swi_souce addr is %x\n",source_addr);24     //将异常处理地址的值放到0x6425     memcopy(0x60,source_addr,0x1);26 27     enable_mmu();28     //内存映射将0x04映射到0x6004    29 30      //step 1: cpu cpsr31       __asm__ __volatile__(32           "mrs r0, cpsr\n"33           "bic r0, r0, #0x80\n"//设置CPSR的I位,将IRQ位打开34           "msr cpsr, r0\n"35           ::: "r0"36       );37 38     //setp1:GIC39     ICCICR_CPU0 = 1;40     ICCPMR_CPU0 = 0xff;41 42     //step1:设置中断号43     ICDDCR = 1;44     ICDIPR16_CPU0 = (0x0 < 0);//ICD第16个寄存器,第0位45     ICDIPTR16_CPU0 = (0x1 < 0);//优先级,最高46     ICDISER2_CPU0 = (1 < 0);//一共五个,第2个使能中断47 48     //step 3: set gpio49     GPX3CON = (0xf < 8);//是GPXCON为外部中断功能50 51     //step 4: extern52     EXT_INT43CON = (2 < 8);//设置上升沿触发53     EXT_INT43MASK = 0;//使能中断54 55     //step 5: source56     //57     printf("welcome back! \n");58 }59 60 void pwm_on(void)61     {62         GPD0CON &= ~0xffff;63         GPD0CON = 0x1;//配置寄存器为264         GPD0DAT = 0x1;//date=0xf65     }66 67 void pwm_off(void)68     {69         GPD0CON &= ~0xffff;70         GPD0CON = 0x0;71     //  GPD0DAT &=0x0 ;//date=0xf72 73     }74 void led_off(void)75     {76         GPM4CON &= ~0xffff;//清零77         GPM4CON = 0x0;//03位清零78         GPM4DAT = 0x0;//date=0xf关闭置一79     }80 void led_on(void)81     {82         GPM4CON &= ~0xffff;83         GPM4CON = 0x1;//配置寄存器3-0--3-3全为1,全为输出模式84         GPM4DAT &= ~0xf;//打开置0-4位为085     }86 87 void do_irq()88     {89             printf("key 1 down\n");90             static int flag=1;91             if(flag)92             {93                 printf("wtc_on\n");94                 led_on();95                 pwm_on();96                 flag=0;97             }98             else if(flag == 0)99             {100                 printf("wtc_off\n");101                 led_off();102                 pwm_off();103                 flag=1;104             }105             EXT_INT43PEND = (1 < 2);//清中断106     }107 108 void memcopy(unsigned long* dest, unsigned long* source,int len)109 {110     int i=0;;for(i=0;i> 20] = pa  2;210         //2的目的是将0-2位置为10此时将是小页模式4K211     }212 213     //00-10   ====  6070214     for(va=0x00; va<=0x10; va+=0x100){215         pa = va+0x60;216         addr[va >> 20] = pa  2;217     }218 219     //10-14   ====  1014220     for(va=0x10; va<=0x14; va+=0x100){221         pa = va;addr[va >> 20] = pa  2;223     }224 225     //30-40   ====  5060226     for(va=0x30; va<0x40; va+=0x100){227         pa = va + 0x20;228         addr[va >> 20] = pa  2;229     }230 }231 232 void enable_mmu(void)233 234 {235     unsigned long addr = 0x70;236     init_ttb(addr);237     //step:初始化页表238 239     unsigned long mmu = 1  (1 < 1)  (1 < 8);240     //将MMU的第0,1,8位置1241     __asm__ __volatile__(242         "mov r0, #3\n"243         "MCR p15, 0, r0, c3, c0, 0\n"//manager244         "MCR p15, 0, %0, c2, c0, 0\n"//addr  245         "MCR p15, 0, %1, c1, c0, 0\n"// enable mmu246         :247         : "r" (addr), "r" (mmu)248         : "r0"249     );250     printf("MMU is enable!\n");251 }252 253 254 

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

网站地图

Top