S5PV210的中断系统和按键控制外部中断

发布者:Yinyue1314最新更新时间:2021-10-19 来源: eefocus关键字:S5PV210  中断系统  按键控制  外部中断 手机看文章 扫描二维码
随时随地手机看文章

一、按键及轮训方式处理按键(基于S5PV210)

1.什么是按键

1、按键的物理特性

(1)、平时没人按的时候,弹簧把按键按钮弹开。此时内部断开的。

(2)、有人按下的时候,手的力量克服弹簧的弹力,将按钮按下,此时内部保持接通(闭合)状态;如果手拿开,则弹簧作用下按钮又弹开,同时内部又断开。

(3)、一般的按键都有4个引脚,这4个引脚成2对:其中一对是常开触点(像上面描述的不按则断开,按下则闭合);一对是常闭触点(平时不按时是闭合的,按下后是断开的)


2、按键的电学原理(结合原理图分析)

在这里插入图片描述

(1)硬件接法: SW5:GPH0_2、 SW6:GPH0_3、 SW7 8 9 10:GPH2_0 1 2 3

(2)**按键的电路连接分析:平时按钮没有按下时,按钮内部断开,GPIO引脚处电压为高电平;当有人按下按钮时,按钮内部导通,外部VDD经过电阻和按钮连接到地,形成回路,此时GPIO引脚处电压就变成了低电平。**此时VDD电压全部分压在了电阻上(这个电阻就叫分压电阻,这个电阻不能太小,因为电阻的功率是U*U/R)

(3)总结:按键的工作方法:其实就是按键的按下与弹开,分别对应GPIO的两种电平状态(按下则GPIO为低电平,弹开则GPIO为高电平)。此时SoC内部可以通过检测这个GPIO的电平高低来判断按键有没有被按下,这个判断结果即可作为SoC的输入信号。


3、按键属于输入类设备

(1)按键一般用来做输入设备(由人向SoC发送信息的设备,叫输入设备),由人向SoC发送按键信号(按键信号有2种:按下信号和弹开信号)。

(2)有些设备就是单纯的输入设备,譬如按键、触摸屏等;有些设备就是单纯的输出设备,譬如LCD;还有一些设备是既能输入又能输出的,叫输入输出设备(IO),譬如串口。


4、按键的2种响应方法

(1)SoC处理按键有2种思路:轮询方式和中断方式。

(2)轮询方式,就是SoC主动的每隔一段时间去读取(按键所对应的)GPIO的电平高低,以此获得按键信息;缺点在于CPU要一直注意按键事件,会影响CPU做其他事情。

(3)中断方式,就是SoC事先设定好GPIO触发的中断所对应的中断处理程序ISR,当外部按键按下或弹开时会自动触发GPIO对应的外部中断,导致ISR执行,从而自动处理按键信息。


2.轮询方式处理按键

1、X210开发板的按键接法

(1)查原理图,找到按键对应的GPIO:SW5:GPH0_2 SW6:GPH0_3 SW7 8 9 10:GPH2_0 1 2 3

(2)原理图上可以看出:按下时是低电平,弹起时是高电平(原理图如我们上面的图所示)


2、按键对应的GPIO模式设置

(1)按键接到GPIO上,按键按下还是弹起,决定外部电路的接通与否,从而决定这个GPIO引脚的电压是高还是低;这个电压可以作为这个GPIO引脚的输入信号,此时GPIO配置为输入模式,即可从SoC内部读取该引脚的电平为1还是0(1对应高电平,0对应低电平)。

在这里插入图片描述

(2)GPH0CON(0xE0200C00) GPH0DAT(0xE0200C04) GPH2CON(0xE0200C40) GPH2DAT(0xE0200C44) 这些就是按键对应的一些寄存器和寄存器的地址。

(3)应该在CON寄存器中将GPIO设置为input模式,然后去读取DAT寄存器(读取到的相应位的值为1表示外部是高电平(对应按键弹起),读取到的位的值为0表明外部是低电平(按键按下))


3、轮询方式处理按键的程序流程

(1)第一步,先初始化GPIO模式为input;

(2)第二步,循环读取GPIO的电平值,然后判断有无按键按下


4、代码编写和调试

添加key.c文件


// 定义操作寄存器的宏

#define GPH0CON 0xE0200C00

#define GPH0DAT 0xE0200C04


#define GPH2CON 0xE0200C40

#define GPH2DAT 0xE0200C44


#define rGPH0CON (*(volatile unsigned int *)GPH0CON)

#define rGPH0DAT (*(volatile unsigned int *)GPH0DAT)

#define rGPH2CON (*(volatile unsigned int *)GPH2CON)

#define rGPH2DAT (*(volatile unsigned int *)GPH2DAT)


// 初始化按键

void key_init(void)

{

// 设置GPHxCON寄存器,设置为输入模式

// GPH0CON的bit8~15全部设置为0,即可

rGPH0CON &= ~(0xFF<<8);

// GPH2CON的bit0~15全部设置为0,即可

rGPH2CON &= ~(0xFFFF<<0);

}

//轮循方式处理按键函数

void key_polling(void)

{

// 依次,挨个去读出每个GPIO的值,判断其值为1还是0.如果为1则按键按下,为0则弹起

// 轮询的意思就是反复循环判断有无按键,隔很短时间

while (1)

{

// 对应开发板上标着LEFT的那个按键

if (rGPH0DAT & (1<<2))

{

// 为1,说明没有按键

led_off();

}

else

{

// 为0,说明有按键

led1(); //调用led()这个函数来调试程序

}

// 对应开发板上标着DOWN的那个按键

if (rGPH0DAT & (1<<3))

{

// 为1,说明没有按键

led_off();

}

else

{

// 为0,说明有按键

led2();

}

// 对应开发板上标着UP的那个按键

if (rGPH2DAT & (1<<0))

{

// 为1,说明没有按键

led_off();

}

else

{

// 为0,说明有按键

led3();

}

}

}


3.串口输出和按键消抖

1、基于串口标准输出的按键调试

(1)以之前的串口stdio的工程为基础来移植添加轮询方式按键处理。


2、什么是按键消抖

(1)按键这种物理器件本身会有抖动信号,抖动信号指的是在电平由高到低(也就是按键按下时)或者电平由低到高(也就是按键弹起时)过程中,电平的变化不是立刻变化,而是经过了一段时间的不稳定期才完成变化,在这个不稳定期间电平可能会时高时低反复变化,这个不稳定期就叫抖动(抖动期内获取按键信息是不可靠的,要想办法消抖)。

(2)什么叫消抖?消抖就是用硬件或者软件方法来尽量减小抖动期对按键获取的影响。

消抖常用2种思路:

第一是硬件消抖,消抖思路就是尽量减小抖动时间,方法是通过硬件添加电容等元件来减小抖动;

第二是软件消抖,消抖思路是发现一次按键按下/弹起事件后,不立即处理按键,而是延时一段时间(一般10~20ms,这就是消抖时间)后再次获取按键键值,如果此次获取和上次一样是按下/弹起,那就认为真的按下/弹起了。

(3)一般比较精密需要的时候,需要硬件消抖和软件消抖一起配合。


3、编程实践

添加标准输入输出调试按键和添加按键消抖


#include "stdio.h"


// 定义操作寄存器的宏

#define GPH0CON 0xE0200C00

#define GPH0DAT 0xE0200C04


#define GPH2CON 0xE0200C40

#define GPH2DAT 0xE0200C44


#define rGPH0CON (*(volatile unsigned int *)GPH0CON)

#define rGPH0DAT (*(volatile unsigned int *)GPH0DAT)

#define rGPH2CON (*(volatile unsigned int *)GPH2CON)

#define rGPH2DAT (*(volatile unsigned int *)GPH2DAT)


// 初始化按键

void key_init(void)

{

// 设置GPHxCON寄存器,设置为输入模式

// GPH0CON的bit8~15全部设置为0,即可

rGPH0CON &= ~(0xFF<<8);

// GPH2CON的bit0~15全部设置为0,即可

rGPH2CON &= ~(0xFFFF<<0);

}


void delay20ms(void)

{

// 这个函数作用是延时20ms

// 因为我们这里是裸机程序,且重点不是真的要消抖,而是教学

// 所以我这里这个程序只是象征性的,并没有实体

// 如果是研发,那就要花时间真的调试出延时20ms的程序

int i, j;

for (i=0; i<100; i++)

{

for (j=0; j<1000; j++)

{

i * j;

}

}

}


void key_polling(void)

{

// 依次,挨个去读出每个GPIO的值,判断其值为1还是0.如果为1则按键按下,为0则弹起

// 轮询的意思就是反复循环判断有无按键,隔很短时间

while (1)

{

// 对应开发板上标着LEFT的那个按键

if (rGPH0DAT & (1<<2))

{

// 为1,说明没有按键

led_off();

}

else

{

// 添加消抖

// 第一步,延时

delay20ms();

// 第二步,再次检验按键状态

//再检查按键状态之间先进行延时消抖,消抖之后再去判断按键状态,在判断弹起与按下之前都需要进行延时消抖,我们这里只是举了一个例子

if (!(rGPH0DAT & (1<<2)))

{

// 为0,说明有按键

led1();

printf("key left.n"); //将前面一直的标准输入输出添加过来我们在这里就可以用printf来调试程序

}

}

// 对应开发板上标着DOWN的那个按键

if (rGPH0DAT & (1<<3))

{

// 为1,说明没有按键

led_off();

}

else

{

// 为0,说明有按键

led2();

printf("key down.n");

}

// 对应开发板上标着UP的那个按键

if (rGPH2DAT & (1<<0))

{

// 为1,说明没有按键

led_off();

}

else

{

// 为0,说明有按键

led3();

}

}

}


二、中断的引入及一些中断有关的概念和过程(基于S5PV210)

1、S5PV210的中断体系介绍

1、什么是中断

(1)中断的发明是用来解决宏观上的并行需要的。宏观就是从整体上来看,并行就是多件事情都完成了。

(2)微观上的并行,就是指的真正的并行,就是精确到每一秒甚至每一刻,多个事情都是在同时进行的。宏观上面的并行并不等于微观的并行,有时候宏观上是并行的,微观上是串行的。

(3)例子中一个人在看电影,快递来了暂停电影跑去收快递,收完快递继续回来看电影,这个例子就是宏观上的并行和微观上的串行。例子中一个人等同于SoC中1个CPU(也就是单核CPU),这个CPU看电影就不能收快递,收快递就不能看电影(也就是说不能真正的并行)。单核心CPU在微观角度是串行的,但是因为CPU很快,所以在宏观看来可以并行。

(4)上例中大部分时间在看电影,中间少量时间去收快递,那么类比于CPU来说,看电影就应该是CPU的常规任务,而收快递则应该是中断例程。也就是说CPU平时一直在进行看电影任务,等快递来了(中断发生了)快递员(类似于中断源)会打电话叫人去收快递(中断源会触发中断通知CPU去处理中断),人收到电话(CPU收到中断信号)后会暂定电影(CPU保存常规任务的现场)跑去收快递(CPU去执行中断处理程序ISR处理中断),收完快递(执行完ISR)回来继续看电影(CPU恢复常规任务的现场,继续执行常规任务)

(5)为什么需要中断?

因为单核CPU实际无法并行的,但是通过中断机制,可以实现假并行(宏观上的并行,微观上实际还是串行的)。


2、SoC对中断的实现机制:异常向量表

(1)异常向量表是CPU中某些特定地址的特定定义。

当中断发生的时候,中断要想办法通知CPU去处理中断,怎么做到?这就要靠异常向量表。

(2)在CPU设计时,就事先定义了CPU中一些特定地址作为特定异常的入口地址(譬如定义0x00000000地址为复位异常向量地址,则发生复位异常时CPU会自动跳转到0x00000000地址去执行指令。又譬如外部中断对应的异常向量地址为0x30000008,则发生外部中断后,CPU会硬件自动跳转到0x30000008地址去执行指令。)如

(3)以上讲的是CPU硬件设计时对异常向量表的支持,下来就需要软件支持了。硬件已经决定了发生什么异常CPU自动跳转PC到哪个地址去执行,软件需要做的就是把处理这个异常的代码的首地址填入这个异常向量地址。


3、S5PV210的异常向量表

在这里插入图片描述

(1)异常向量表中各个向量的相对位置是固定的,但是他们的起始地址是不固定的,各种SoC可以不一样,而且复杂ARM中还可以让用户来软件设置这个异常向量表的基地址。

(2)扩展到所有架构的CPU中:所有架构(譬如51单片机、PIC单片机)的CPU实现中断都是通过异常向量表实现的,这个机制是不变的;但是不同CPU异常向量表的构造和位置是不同的。


4、异常和中断的区别和联系

(1)针对SoC来说,发生复位、软中断、中断、快速中断、取指令异常、数据异常等,我们都统一叫异常。所以说:中断其实是异常的一种。

(2)异常的定义就是突发事件,打断了CPU的正常常规业务,CPU不得不跳转到异常向量表中去执行异常处理程序;中断是异常的一种,一般特指SoC内的内部外设产生的打断SoC常规业务,或者外部中断(SoC的GPIO引脚传回来的中断)。


2、异常向量表的编程处理

1、像内存一样去访问异常向量表(异常向量表的访问)

(1)S5PV210的异常向量表可以改变(在CP15协处理器中),以适应操作系统的需求。但是目前系统刚启动时,此时DRAM尚未初始化,程序都在SRAM中运行。210在iRAM中设置了异常向量表,供暂时性使用。

(2)查210的iROM application note文档中iRAM的地址分配,可知,iRAM中的异常向量表起始地址为0xD0037400。知道了异常向量表的起始地址后,各个异常对应的入口就很好知道了。

在这里插入图片描述

2、函数名的实质就是函数的首地址

(1)函数名在C语言中的理解方法和变量名其实没区别。编译器会把这个函数的函数体对应的代码段和这个函数的函数名(实质是符号)对应起来,等我们在使用这个函数名符号时,编译器会将函数的函数体实际上做替换。因为函数体都不止4字节,而函数名这个符号只能对应1个地址,所以实际对应的是函数体那一个代码段的首地址。

(2)拿C语言中的语法来讲,函数名就是这个函数的函数指针。


创建int.c和int.h文件进行异常向量表的绑定的代码演示:


初级阶段的int.h:定义异常向量的入口地址


#ifndef __INT_H__

#define __INT_H__


#define exception_vector_table_base 0xD0037400        //cpu异常向量表的基地址

#define exception_reset (exception_vector_table_base + 0x00)

#define exception_undef (exception_vector_table_base + 0x04)

#define exception_sotf_int (exception_vector_table_base + 0x08)

#define exception_prefetch (exception_vector_table_base + 0x0C)

#define exception_data (exception_vector_table_base + 0x10)

#define exception_irq (exception_vector_table_base + 0x18)

#define exception_fiq (exception_vector_table_base + 0x1C)


#define r_exception_reset (*(volatile unsigned int *)exception_reset)

#define r_exception_undef (*(volatile unsigned int *)exception_undef)

#define r_exception_sotf_int (*(volatile unsigned int *)exception_sotf_int)

#define r_exception_prefetch (*(volatile unsigned int *)exception_prefetch)

#define r_exception_data (*(volatile unsigned int *)exception_data)

#define r_exception_irq (*(volatile unsigned int *)exception_irq)

#define r_exception_fiq (*(volatile unsigned int *)exception_fiq)


初级阶段的int.c:绑定异常向量的执行函数


#include "int.h"

#include "stdio.h"


void system_init_exception(void)

{

r_exception_reset = (unsigned int)reset_exception; //这里就是将我们的异常处理程序跟我们的异常向量表绑定

r_exception_undef = (unsigned int)undef_exception;

r_exception_sotf_int = (unsigned int)sotf_int_exception;

r_exception_prefetch = (unsigned int)prefetch_exception;

r_exception_data = (unsigned int)data_exception;

r_exception_irq = (unsigned int)IRQ_handle;

r_exception_fiq = (unsigned int)IRQ_handle;

}


void reset_exception(void)          //复位异常,到此处执行复位的操作,下面的各个函数的功能都类似

{

printf("reset_exception.n");

}


void undef_exception(void)

{

printf("undef_exception.n");

}


void sotf_int_exception(void)

{

printf("sotf_int_exception.n");

}


void prefetch_exception(void)

{

printf("prefetch_exception.n");

}


void data_exception(void)

{

printf("data_exception.n");

}


// 真正的中断处理程序。意思就是说这里只考虑中断处理,不考虑保护/恢复现场

void irq_handler(void)

{

//printf("irq_handler.n");

// SoC支持很多个(在低端CPU例如2440中有30多个,在210中有100多个)中断

// 这么多中断irq在第一个阶段走的是一条路,都会进入到irq_handler来

// 我们在irq_handler中要去区分究竟是哪个中断发生了,然后再去调用该中断

// 对应的isr。


}


总结:

当我们将异常处理程序的首地址和异常向量表绑定起来后,异常处理初步阶段就完成了。到目前可以保证相应异常发生后,硬件自动跳转到对应异常向量表入口去执行时,可以执行到我们事先绑定的函数。


3、为什么中断处理要先在汇编中进行

(1)中断处理要注意保护现场(中断从SVC模式来,则保存SVC模式下的必要寄存器的值)和恢复现场(中断处理完成后,准备返回SVC模式前,要将保存的SVC模式下的必要寄存器的值恢复回去,不然到了SVC模式后寄存器的值乱了,SVC模式下原来正在进行的常规任务就被你搞坏了)

(2)保存现场包括:第一:设置IRQ栈; 第二,保存LR; 第三,保存R0~R12

(3)为什么要保存LR寄存器? 要考虑中断返回的问题。中断ISR执行完后如何返回SVC模式下去接着执行原来的代码。中断返回其实取决于我们进入中断时如何保存现场。中断返回时关键的2个寄存器就是PC和CPSR。 所以我们在进入IRQ模式时,应该将SVC模式下的下一句指令的地址(中断返回地址)和CPSR保存起来,将来恢复时才可以将中断返回地址给PC,将保存的CPSR给CPSR。

(4)中断返回地址就保存在LR中,而CPSR(自动)保存在(IRQ模式下的)SPSR中。


4、汇编保存现场和恢复现场

(1)保护现场关键是保存:中断处理程序的返回地址,r0-r12(cpsr是自动保存的)

(2)恢复现场主要是恢复:r0-r12,pc,cpsr寄存器


start.s中的中断处理:


/*

 * 文件名: start.S

 * 描述: 添加中断处理汇编函数

 */


#define WTCON 0xE2700000


#define SVC_STACK 0xd0037d80

#define IRQ_STACK 0xd0037f80 //IRQ模式下栈的地址(这里使用的是满减栈)


.global _start

.global IRQ_handle


// 把_start链接属性改为外部,这样其他文件就可以看见_start了

_start:

// 第1步:关看门狗(向WTCON的bit5写入0即可)

ldr r0, =WTCON

ldr r1, =0x0

str r1, [r0]

// 第2步:初始化时钟

bl clock_init

// 第3步:设置SVC栈

ldr sp, =SVC_STACK

// 第4步:开/关icache

mrc p15,0,r0,c1,c0,0; // 读出cp15的c1到r0中

//bic r0, r0, #(1<<12) // bit12 置0  关icache

orr r0, r0, #(1<<12) // bit12 置1  开icache

mcr p15,0,r0,c1,c0,0;


bl main

// 从这里之后就可以开始调用C程序了

//bl led_blink // led_blink是C语言实现的一个函数

// 汇编最后的这个死循环不能丢

b .

// 在这个汇编函数中,用来做中断模式下的现场保护和恢复,并且调用真正的中断处理程序

IRQ_handle:

// 设置IRQ模式下的栈

ldr sp, =IRQ_STACK //进入到IRQ模式下设置IRQ模式下的栈

// 保存LR

// 因为ARM有流水线,所以PC的值会比真正执行的代码+8,

[1] [2] [3] [4]
关键字:S5PV210  中断系统  按键控制  外部中断 引用地址:S5PV210的中断系统和按键控制外部中断

上一篇:S3C2440的裸机点亮led(直接修改机器代码)
下一篇:S3C2440 (4.3寸)LCD驱动程序之层次分析(十六)

推荐阅读最新更新时间:2024-11-17 15:05

(笔记总结)80C51的中断系统
80C51的中断系统的结构 80C51的中断系统有5个中断源,2个中断优先级,可实现二级中断嵌套。 1.(P3.2)可由IT0(TCON.0)选择其为低电平有效还是下降沿有效。当CPU检测到P3.2引脚上有有效的中断信号时,中断标志IE0(TCON.1)置1,向CPU申请中断。 2.(P3.3)可由IT1(TCON.2)选择其为低电平有效还是下降沿有效。当CPU检测到P3.3引脚上有有效的中断信号时,中断标志IE1(TCON.3)置1,向CPU申请中断。 3.TF0(TCON.5),片内定时/计数器T0溢出中断请求标志。当定时/计数器T0发生溢出时,置位TF0,并向CPU申请中断。 4.TF1(TCON.7),
[单片机]
(笔记总结)80C51的<font color='red'>中断系统</font>
51单片机学习:外部中断1实验
实验名称:外部中断1实验 接线说明: 实验现象:下载程序后,当按下K4键可控制D1指示灯亮灭 注意事项: ***************************************************************************************/ #include reg52.h typedef unsigned int u16; //对系统默认数据类型进行重定义 typedef unsigned char u8; //定义LED1管脚 sbit LED1=P2^0; //定义独立按键K4控制脚 sbit KEY4=P3^3; /*******************************
[单片机]
初学stm32-外部中断EXTI按键中断)
外部中断概述 STM32F4的每个IO都可以作为外部中断输入。 STM32F4的中断控制器支持23个外部中断/事件请求: EXTI线0~15:对应外部IO口的输入中断。 EXTI线16:连接到PVD输出。 EXTI线17:连接到RTC闹钟事件。 EXTI线18:连接到USB OTG FS唤醒事件。 EXTI线19:连接到以太网唤醒事件。 EXTI线20:连接到USB OTG HS(在FS中配置)唤醒事件。 EXTI线21:连接到RTC入侵和时间戳事件。 EXTI线22:连接到RTC唤醒事件。 对于每个外部中断线可以独立的配置触发方式(上升沿,下降沿或者双边沿触发),触发/屏蔽,专用的状态位。 STM32F4供IO使用的
[单片机]
初学stm32-<font color='red'>外部中断</font>(<font color='red'>EXTI</font><font color='red'>按键</font>中断)
51单片机实现4个按键控制8个LED灯四种状态
电路图 元件清单 程序(C语言) #include reg51.h sbit p3_0=P3^0; sbit p3_1=P3^1; sbit p3_2=P3^2; sbit p3_3=P3^3; void delay(unsigned char i); void main() { unsigned char ledctr; P3=0xff; while(1) { ledctr=P3; switch(ledctr) { case 0xff:P1=0x00;break; case 0xfe:P1=0xff;break; case 0xfd:P1=0x55;delay(
[单片机]
51单片机实现4个<font color='red'>按键</font><font color='red'>控制</font>8个LED灯四种状态
STM32学习笔记(2)外部中断
一、中断 1.什么是中断 操作系统需要管理外设,但是外设的速度远远低于CPU的速度,所以我们需要一种机制来弥补这种速度鸿沟,提高CPU的效率。 为此我们引入了中断机制,让外设在需要操作系统处理外设相关事件的时候,能够主动通知操作系统,即当CPU收到中断或者异常的事件时,打断操作系统和应用的正常执行,暂停执行当前的程序或任务,让操作系统完成外设的相关处理,在完成对这个事件的处理后,再恢复操作系统和应用的正常执行。 举个栗子,当你在读文章时忽然来了一个电话,你会先去接电话,等电话挂断后你又接着回来读文章,接电话这一过程就是执行中断。 正是由于中断机制,计算机系统才能有条不紊地“同时”完成多个任务,中断机制实质上帮助提高了并
[单片机]
STM32学习笔记(2)<font color='red'>外部中断</font>
51单片机系列——外部中断怎么写(讲解+实例:改变流水方
在学习51单片机中断的时候常常被外部中断、定时/计数器和串行口弄的稀里糊涂的,本来就是个小小学渣,怎么能经得起折磨!!! 闲来无事,今天写一遍这个来介绍说明一下外部中断INT0、INT1。其他的小编以后再整理给大家。 先上一个实例: 题目: 实例仿真图: 程序 #include reg52.h #include intrins.h #define uint unsigned int void delay1s(void) //延时1s { unsigned char a,b,c; for(c=167;c 0;c--) for(b=171;b 0;b--) for(a=16;
[单片机]
51单片机系列——<font color='red'>外部中断</font>怎么写(讲解+实例:改变流水方
[单片机框架][bsp层][AT32F415][bsp_exti] EXTI配置和使用
7.2.1 主要特性 EXTI 控制器的主要特性如下: ● 每个中断/事件都有独立的触发和屏蔽 ● 每个中断线都有专用的状态位 ● 支持多达 23 个软件的中断/事件请求 ● 检测脉冲宽度低于 APB2 时钟宽度的外部信号。参见数据手册中电气特性部分的相关参数。 7.2.4 功能说明 要产生中断,必须先配置好并使能中断线。根据需要的边沿检测设置 2 个触发寄存器,同时在中断屏蔽寄存器的相应位写’1’允许中断请求。当外部中断线上发生了期待的边沿时,将产生一个中断请求,对应的挂起位也随之被置’1’。在挂起寄存器的对应位写’1’,将清除该中断请求。 如果需要产生事件,必须先配置好并使能事件线。根据需要的边沿检测设置 2 个触发寄存器
[单片机]
[单片机框架][bsp层][AT32F415][bsp_<font color='red'>exti</font>] <font color='red'>EXTI</font>配置和使用
STC89C52单片机外部中断0和外部中断1的应用
/////////////////////////////////////////////////////////////////////// 实现功能: 测试外部中断0和外部中断1下降沿触发,因为实验板上的K3键与外部 中断0的引脚相连,K4与单片机的外部中断1相连,本实验要完成的测 试结果是,按下K3键时,即外部中断0触发,实验板上所以数码管上的 数加1,而按K4按下时,即外部中断1触发,数码管上的数值减1 实验板型号:BS-XYD-C52 实验名称: 外部中断0和外部中断1的应用 编写人: 谢应东 编写日期: 2012-4-27 ///////////
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved