一、CPU与硬件的狡猾方式
(一)异常处理
1、中断是异常服务程序的一种,异常不是一种错误,而是一种功能。
2、中断常用于驱动中,CPU与外界硬件比如串口、看门狗交互数据。中断是CPU和外界硬件数据交互的一种。
(二)CPU与硬件交互的方式
二、轮询方式实现按键实验
(一)按键的工作原理
当K2按下后,UART_RING从高电平1.8V到0,松开后,又变成1.8V。
轮询方式寄存器的功能:
按键产生的信号时高低电平,GPX1DAT的哪一位为1表示产生高电平,为0表示产生低电平,在本次实验中,GPX1_1要检测GPX1DAT的第1位。
#include "exynos_4412.h"
int main()
{
/*将GPX1_1设置成输入功能*/
GPX1.CON = GPX1.CON & (~(0xF << 4));
/*判断GPX1_1引脚状态,即判断按键是否按下*/
while(1){
if(!(GPX1.DAT & (1 << 1)))
{
printf("Key2 Pressed\n");
while(!(GPX1.DAT & (1 << 1)));
}else{
}
}
return 0;
}
三、GPIO中断相关寄存器详解
(一)设置中断功能
(二)中断处理细节寄存器
1、设置中断触发方式
如果设置成低电平,虽然只按一次,CPU可能会处理很多次中断。在这里使用下降沿比较合适。
2、滤波寄存器
在实际过程中,有可能因手抖等原因,在短时间内按了多次按键,滤波寄存器会帮我们滤过杂波,形成一个比较完美的信号。
3、设置中断的开关
4、挂起寄存器
自动更改
当CPU正在处理IRQ请求时,将挂起当前的请求。等待CPU处理。不需要认为
四、GPIO中断编程
#include "nxynos_4412.h"
int main()
{
/*将GPX1_1设置成中断功能*/
GPX1.CON = GPX1.CON |(0xF << 4);
/*设置GPX1_1中断触发方式下降沿触发*/
EXT_INT41_CON = EXT_INT41_CON & (~(0x7 << 4)) | (0x2 << 4)
/*使能GPX1_1的中断功能*/
EXT_INT41_MASK = EXT_INT41_MASK & (~(0x1 << 1))
return 0;
}
五、作业
1.简述轮询和中断两种方式的本质区别是什么
2.使用轮询的方式检测Key3按键的状态,实现按一次按键,LED2点亮,再次按下,LED2熄灭
1、轮询是CPU定时向硬件询问是否需要提供服务,如果需要则给予,若不需要过一段时间,再次询问,周而复始。
中断是硬件需要服务时,像CPU发送中断信号,CPU接到中断信号后,将程序暂停下来,执行中断处理程序,然后返回断点继续执行,不会主动向硬件检测。
#include "exynos_4412.h"
void delay(unsigned int Time){
while(Time --);
}
int main()
{
int flag = 1;
/*将GPX1_2设置成输入功能*/
GPX1.CON = GPX1.CON & (~(0xF << 8));
/*判断GPX1_2引脚状态,即判断按键是否按下*/
while(1){
if(!(GPX1.DAT & (1 << 2)))
{
printf("Key3 Pressed\n");
if(flag){
/*LED2*/
GPX2.CON = GPX2.CON &(~(0xF << 28)) | (0x1 << 28);
/*点亮LED2*/
GPX2.DAT = GPX2.DAT | (1 << 7);
flag = 0;
}else{
/*延时点亮*/
delay(1000000);
/*熄灭LED2*/
GPX2.DAT = GPX2.DAT & (~(1 << 7));
/*延时*/
delay(1000000);
flag = 1;
}
while(!(GPX1.DAT & (1 << 2)));
}else{
}
}
return 0;
}