- #include "2410lib.h"
- #include "Option.h"
- #include "2410slib.h"
- #include "def.h"
- #include "2410addr.h"
- #include "stdlib.h"
- #include "string.h"
- #include "mmu.h"
- #include "timer.h"
-
-
- #define LED_OPEN1 ~(1<<5)
- #define LED_OPEN2 ~(1<<6)
- #define LED_OPEN3 ~(1<<7)
-
-
- #define LED_CLOSE1 (1<<5)
- #define LED_CLOSE2 (1<<6)
- #define LED_CLOSE3 (1<<7)
-
- int flag = 1;
- static void __irq key_handler(void);
- //初始化led的端口
- void led_port_init(void)
- {
- rGPGCON &= 0xffff03ff;
- rGPGCON |= 0x00005400;
- }
-
-
- //初始化按键
- void key_init(void)
- {
- //init GPIO(F)
- rGPFCON &= 0xfffffffC;
- rGPFCON |= 0x00000002;
-
- //init EINT 0 register 初始化控制EINT0这个中断的外部中断控制器
- rEXTINT0 &= ~(0x7);
- //rEINTPEND 用来记录有没有发生中断,如果要清楚就置1即可
- //rEINTMASK 用来指示要不要屏蔽这个中断
-
- //设置ISR
- pISR_EINT0 = (U32)key_handler;
- EnableIrq(BIT_EINT0);//设置INTMASk 寄存器
- }
-
-
- void dely(int tt)
- {
- int i = 0;
- int j = 0;
- for(;i < tt; i++)
- {
- for(;j < 100000000; j++);
- }
- }
-
- void led_run(void)
- {
- if(flag)
- {
- rGPGDAT |= LED_CLOSE1 | LED_CLOSE2 | LED_CLOSE3;
- dely(100);
- flag = 0;
- }
- else
- {
- rGPGDAT &= LED_OPEN1 & LED_OPEN2 & LED_OPEN3;
- dely(100);
- flag = 1;
- }
-
- }
-
-
- //按键中断函数
- static void __irq key_handler(void)
- {
- if(rINTPND == BIT_EINT0)//去判断srcpnd这寄存器
- {
- ClearPending(BIT_EINT0);
- led_run();
- }
- }
-
-
- int Main()
- {
- MMU_Init();
- led_port_init();
- key_init();
- while(1);
- }
在这里讲中断主要是为了让自己能搭起一个框架,以后关于中断的程序能有一个的模板.
这个程序的主要作用很简单,就是通过按键来产生中断,从而控制led的亮与灭...
第一步:对中断引脚的初始化
我的开发板EINT0这个中断是有GPF0触发的,所以先对这个引脚进行初始化,初始化的工作就是工作GPFCON控制器让引脚为中断的引脚。通过配置不同的值可以让引脚有不同的功能,这里的功能就是产生 中断的功能。
第二步:对于该中断内部的设置
中断内部的设置包含了:按键怎么样的情况下算触发中断,内部的pnd要清除(pnd寄存器是用来记录这个中断是否发生),还有就是内部mask(不能屏蔽该中断)
当然有的中断不用全部都设置,就像EINT0~3好像就不用,因为这几位都是保留的。
第三步:就是设置中断处理函数
这一步应该是比较关键的一步,中断函数是你自己设定的,不过你要把你写的中断处理函数赋值给相对应的地方,这个讲深了就是高级编程与底层之间的联系,关于这个就是arm本身的中断处理过程了。
最好在之前能先调用一下clearpending函数,清除一下srcpnd与intpnd两个寄存器,设置完处理函数以后就用enableirq这个函数去初始化intmsk这个寄存器,让他不会被屏蔽。
这就是关于中断的一个流程,掌握这个的话以后就可以以不变应万变了。
但是关于这个程序还有一点就是关于MMU_Init这个函数是必须的,原因好像是关于中断向量表的转移,我查阅了网上的一些资料,而对于具体还不是清楚,但是宏观上是这样的。
中断向量表本身是在0地址处,但是我们在运行程序的时候是在0x30000000处,所以程序产生的中断其实是不能找到想对应的中断处理程序,而MMU_Init好像有一部分的作用就是讲中断向量表也转移到0x30000000地址处,那样就可以运行了。不过真正的原因还在想的过程中,不过这样是可以解决问题的。下次会对这个问题进行解答的....
关键字:中断 控制LED
引用地址:
用中断的方式都控制LED
推荐阅读最新更新时间:2024-03-16 15:04
智能LED控制及接口方案
随着LED在发光性能、成本等几乎各个方面的改进,LED的应用范围越来越广,但在各应用领域渗透的比例高低不一。如可寻址标志和建筑物照明这样的商业应用领域中,LED凭借在色彩、总体拥有成本、工作寿命、可靠性和便利性方面的优势,应用非常广泛。如在建筑物装饰照明应用中,使用LED可在建筑物外墙上营造出丰富的色彩,及更好地彰显建筑物的结构。在移动标志应用中,还可以实时更新交通显示屏、视频图像及广告牌上的信息。 安森美半导体身为应用于高能效电子产品的首要高性能硅方案供应商,针对各种LED应用提供宽范围的LED驱动器方案,其中就包括用于可寻址标志和建筑物装饰照明两类常见应用的系列线性驱动器(详见下表)。这些驱动器能够精确地稳定LED电流,并包
[电源管理]
MSP430单片机中断详解
中断是MSP430微处理器的一大特色,有效地利用中断可以简化程序和提高执行效率。MSP430的几乎每个外围模块都能够产生中断,为MSP430针对事件(即外围模块产生的中断)进行的编程打下基础。MSP430在没有事件发生时进入低功耗模式,事件发生时,通过中断唤醒CPU,事件处理完毕后,CPU再次进入低功耗状态。由于CPU的运算速度和退出低功耗的速度很快,所以在应用中,CPU大部分时间都处于低功耗状态。 MSP430的中断分为3种:系统复位、不可屏蔽中断、可屏蔽中断。 (1)系统复位的中断向量为0xFFFE。 (2)不可屏蔽中断的中断向量为0xFFFC。响应不可屏蔽中断时,硬件自动将OFIE、NMIE、ACCVIE复位。软
[单片机]
STM8S bootloader中断向量重定向 INTVEC exceeds maximum size 问题解决
最近重装了系统,然后重装了IAR for STM8软件(由于找不到之前的安装软件,就用了剑齿虎开发板提供的IAR安装包),发现以前正常编译的bootloader工程文件,再次编译时出现如下问题: Error : actual size (0x100) exceeds maximum size (0x80) for block “INTVEC” 在icf文件中,INTVEC块确定定义为0x80大小,这是单片机固定的,不能修改,因此应该是编译产生的中断向量代码超出了实际范围。 define block INTVEC with size = 0x80 { ro section .intvec }; 中断向量的重定向的代码如下:
[单片机]
STM32单片机的中断机制
这张图是一条外部中断线或外部事件线的示意图,图中信号线上划有一条斜线,旁边标志19字样的注释,表示这样的线路共有19套。 图中的蓝色虚线箭头,标出了外部中断信号的传输路径,首先外部信号从编号1的芯片管脚进入,经过编号2的边沿检测电路,通过编号3的或门进入中断“挂起请求寄存器”,最后经过编号4的与门输出到NVIC中断控制器;在这个通道上有4个控制选项,外部的信号首先经过边沿检测电路,这个边沿检测电路受上升沿或下降沿选择寄存器控制,用户可以使用这两个寄存器控制需要哪一个边沿产生中断,因为选择上升沿或下降沿是分别受2个平行的寄存器控制,所以用户可以同时选择上升沿或下降沿,而如果只有一个寄存器控制,那么只能选择一个边沿了。 接下来
[单片机]
51单片机定时器与中断的程序设计
P2.0~P2.2 分别接上了独立按键 K0、K1、K2。 P1 接上了 8 个 LED,输出低电平时发光。 要求: 按下 K1 键,P1.7 输出周期为 1s 的方波; 按下 K2 键,P1 输出循环流水灯,每 2 个灯亮 0.5s; 按下 K0 键,停止方波和流水灯的输出。 ;----------------------------------------- ; ORG 0000H JMP START ORG 000BH ; JMP T0_INT T0_INT: MOV TH0, #(65536 - 50000) / 256 MOV TL0, #(65536 - 50000) MOD 256 DJNZ
[单片机]
利用微型端口扩展器控制LED
Maxim推出的新型I/O端口扩展器是为那些需要额外增加I/O口的应用而设计的,这些通用器件能够为电路设计人员提供具有过压保护的逻辑输入端口或漏极开路逻辑输出端口,其过压额定值为5.5V或7V。
这些端口的输出可以用作LED驱动器,并可提供闪烁和PWM亮度控制功能。该系列产品将18个扩展端口集成在4mm2的薄型QFN封装内,而10端口扩展器则采用尺寸更小的3mm2薄型QFN封装。由于蜂窝电话、PDA、膝上型电脑需要将监视和控制功能集中在一个很小的区域内,设计人员没有足够的空间从主ASIC引出一簇I/O口线,因而只有引出两条线作为I2C总线,这就需要小尺寸、功耗极低的端口扩展芯片,而且要求这种芯片非常便宜,并具有极高的可靠性,同时还
[应用]
定时器 T3定(8 位)通过中断方式控制 LED
CC2530的T3定时器(8位)需要了解T3CTL,T3CCTL0,T3CC0,T3CCTL1,T3CC寄存器.定时器3/4是8位定时器,具有定时器/计数器/PWM功能。 定时器2又称 MAC定时器,是专门为支持IEEE 802.15.4 MAC 中的事件跟踪协议而特别设计的。该定时器具有一个可以用来记录已经发生的周期数的8位溢出计数器;有一个16位捕获寄存器,用来记录一个帧开始定界符接收/发送的精确时间或者传输完成的精确时间;还含有一个16位输出比较寄存器,用来在特定时间对无线模块产生各种命令选通信号(开始接受,开始发送等)。关于定时器2,想了解的话可以参看有关资料。 有没有发现只要寄存器配置对了剩下的就没什么问题了。 T3C
[单片机]
MSP430x149x之----------外部中断
外部中断 IO口中断 MSP430x149x的6组IO口中,只有P0、P1才具有外部中断功能。 设置IO口中断,并书写中断服务函数 设置步骤: 1. 设置相应IO口的方向为输入,即 在PXDIR 中的相应位置0。 2. 设置相应IO口为普通引脚,即PXSEL 中相应位置0。 3. 开启相应的IO口中断,即PXIE中的相应位置1。 4. 设置中断触发方式,即PxIES中, 0为上升沿,1为下降沿。 5. 开启外部总中断,即_EINT();。 6. 书写中断服务程序。 中断服务子程序的格式: #pragma vector = PORTx_VECTOR _interrupt void IRQ_PORT(void) ;
[单片机]