本帖最后由 ddllxxrr 于 2014-8-19 13:21 编辑
在前面的mbed数字输入输出初步应用中,通过读取管脚的电平状态来判断用户的输入,但我们发现这种实现方式会浪费大量的MCU时间在检查管脚的状态上,应该说应用效果并不理想,那么有没有另外的方式无需检查就可以处理管脚状态的变化呢,答案是肯定的,那就是MCU的中断系统。MCU的中断系统不但可以处理管脚的变化,还可以处理更复杂的计时器的变化、MCU通讯状态的变化等,是微处理器中最重要的概念之一。
我们把原先通过不断查询来处理事件的方式叫做轮询,它和中断方式一起构成微处理器最常用的事件处理解决方案。
中断处理流程中的中断处理向量是从中断处理向量表中查询的,该表设定了所有中断处理流程的入口,它是在mbed的启动代码中被初始化的,一般都在.S汇编文件中。GPIO中断是微处理器中断系统中最简单也是最常用的中断类型,它可以让用户在某个管脚状态发生特定的变化时执行相应的代码。需要注意的是,并不是所有的GPIO管脚都具备中断处理能力,如xbed LPC1768的19,20管脚就不能当作中断管脚。咱这款开发板LPCXprewwo1549开发板几个按键好像都不行, 最后我用P0_8,这个引脚实现了中断功能,我的程序很简单,只要进入中断灯就灭,然后复位再做.还是一样.我用镊子轻触,它就动作,还挺灵的.
mbed的中断函数:
类名 | 方法 | 用途 |
InterruptIn | InterruptIn(PinName pin); | 构造函数,把pin管脚设成中断处理管脚 |
int read(); | 读取管脚的当前状态 |
void rise(void (*fptr)(void)); | 设置管脚上升沿触发的中断处理函数 |
void fall(void (*fptr)(void)); | 设置管脚下降沿触发的中断处理函数 |
void mode(PinMode pull); | 设置管脚的模式,一般来说,上升沿处理应设成PullDown,下降沿触发设成PullUp |
我的实验程序:- #include "mbed.h"
- DigitalOut led(LED1);
- InterruptIn btn2(P0_8);
- void flip()
- {
- led=1;
- }
- int main() {
- __enable_irq();
- while(1)
- {
-
- btn2.fall(&flip);
- }
- ;
- }
复制代码 截图: