第三十八天:Tiny4412驱动开发之外部中断

本文介绍Tiny4412平台上的外部中断配置与实现过程,包括使用外部中断来响应按键操作,并结合看门狗中断实现LED灯的控制。
部署运行你感兴趣的模型镜像
  在三天前学习按键驱动的时候,按键通过轮循的方式,一直在等待被按下,这时候系统不能够完成其它的操作,这明显是不科学的,可以使用外部中断解决这个问题。

  在Tiny4412中中断分为三种 分别是软件通用中断(SGI),私有设备中断(PPI),共享设备中断(SPI)。

  一共有160个中断号,中断表在Tiny4412手册的745页。前篇写的看门狗中断属于PPI,今天的实验所使用的是SPI。也可以称为外部中断。

  前几天的按键驱动篇章我们已经找到按键KEY1对应的寄存器为GPX3_2。查看GPX3CON[2]的描述可知,将其置为0xf,为外部中断模式

  对应的中断描述在EXT_INT43[2]中。

     有关于EXT_INT43[2]的寄存器: EXT_INT43_CON[2] 选择中断触发方式、

  

  中断开关:EXT_INT43_MASK[2]:

   中断状态:EXT_INT43_PEND[2],特别注意的是,要清中断,将值赋值为1.

  通过下图可知中断源是26,通过表格查找到中断号为64:

具体代码如下所示:

  1 #include "regs.h"
  2 
  3 int (*printf)(char *, ...) = 0xc3e114d8;
  4 
  5 void init_ttb(unsigned long *ttb);
  6 void enable_mmu(void);
  7 void memcpy(unsigned char *dest, unsigned char *source, int len);
  8 void do_irq();
  9 
 10 int main()
 11 {
 12 
 13     enable_mmu();
 14     *(unsigned long *)0x67000000 = do_irq;
 15     unsigned long source = 0;
 16     __asm__ __volatile__(
 17         "ldr %0, =vector_start\n"
 18         : "=r" (source)
 19     );
 20     memcpy(0, source, 0x1000);
 21     
 22     //step 1: set cpsr i bit
 23     __asm__ __volatile__(
 24         "mrs r0, cpsr\n"
 25         "bic r0, r0, #0x80\n"
 26         "msr cpsr, r0\n"
 27         ::: "r0"
 28     );
 29 
 30     //step 2: enable gic 
 31     ICCICR_CPU0 = 1;//终端总开关
 32     ICCPMR_CPU0 = 0xff;//设置最低优先级
 33     ICDDCR = 1;
 34 
 35     //中断源为64
 36     ICDIPR16_CPU0 &= ~0xff ;//设置本中断优先级
 37     ICDIPTR16_CPU0 &= 0xff ;// 选择指定的cpu0进行终端处理
 38     ICDIPTR16_CPU0 |= 1; // 选择指定的cpu0进行终端处理
 39     ICDISER2_CPU0 = 1;//设置本中断开启
 40 
 41     //step 3: set gpio
 42     GPX3CON |= (0xf << 8);//使用外部中断模式
 43     //step 4: set xeint26
 44     EXT_INT43CON &= ~(0x7 << 8);
 45     EXT_INT43CON |= ( 2 << 8);//设置中断方式
 46     EXT_INT43MASK &= ~(1 << 2);//开中断
 47     //step 5 
 48     printf("welcom back\n");
 49 }
 50 
 51 void do_irq()
 52 {
 53     printf("key 1 ~~~ \n");
 54     /*清中断*/
 55     EXT_INT43PEND |= (0x1 << 2);
 56 }
 57 
 58 __asm__(
 59 "vector_start:\n"
 60     "b reset\n"
 61     "b undef\n"
 62     "b swi\n"
 63     "b pre_abt\n"
 64     "b data_abt\n"
 65     ".word 0x0\n"
 66     "b irq \n"
 67     "b fiq\n"
 68     "\n"
 69 "reset:\n"
 70 "undef:\n"
 71     "mov sp, #0x66000000\n"
 72     "stmfd sp!, {r0-r12, lr}\n"
 73     "\n"
 74     "mov r0, #0x67000000\n"
 75     "ldr r1, [r0]\n"
 76     "blx r1\n"
 77     "\n"
 78     

您可能感兴趣的与本文相关的镜像

Yolo-v8.3

Yolo-v8.3

Yolo

YOLO(You Only Look Once)是一种流行的物体检测和图像分割模型,由华盛顿大学的Joseph Redmon 和Ali Farhadi 开发。 YOLO 于2015 年推出,因其高速和高精度而广受欢迎

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值