一、CPU与硬件的交互方式
1.轮询
CPU执行程序时不断地询问硬件是否需要其服务,若需要则给予其服务,若不需要一段时间后再次询问,周而复始(询问串口)
2.中断
CPU执行程序时若硬件需要其服务,对应的硬件给CPU发送中断信号,CPU接收到中断信号后将当前的程序暂停下来,转而去执行中断服务程序,执行完成后再返回到被打断的点继续执行
3.DMA
硬件产生数据后,硬件控制器可将产生的数据直接写入到存储器中,整个过程无需CPU的参与
二、轮询方式实现按键实验
查看芯片原理图(按键K2)
正常状态下,按键不按下时,UART_RING与1.8V电源相接,呈高电平;按下K2,接地,呈低电平
查看芯片手册。UART_RING 与芯片引脚GPX1_1相接
查看GPX1_1相关寄存器
读取GPXDAT寄存器对应位的数值,0表示读取的低电平,1表示高电平
#include "exynos_4412.h"
int main()
{
GPX1.CON = GPX1.CON & (~(0xF << 4));// [7:4]清零
while(1)
{
/*判断GPX1_1引脚的状态,即判断按键是否按下*/
if(!(GPX1.DAT & (1 << 1))) //按键按下去if成立,按键不按,高电平1,if为0
{
printf("key2 pressed\n");
/*等待松手*/
while(!(GPX1.DAT & (1 << 1)));//循环直到松手
}
else
{
c
}
}
return 0;
}
三、 GPIO中断相关寄存器详解
1.GPIO中断
当按键按下的时候会给CPU发送信号,执行中断程序,就不需要一遍一遍检测按键是否按下
IRQ常用于外围硬件的中断
2. 设置中断流程及相关寄存器
设置外部硬件产生中断信号
根据芯片手册GPX1
,引脚对应EXT_INT41_FLTCON1
中
EXT_INT41_FLTCON1寄存器
设置滤波电路,可以防止按键抖动
也可以设置滤波类型(实际测试这个寄存器没什么用,效果没太大区别)
EXT_INT41_MASK寄存器
设置中断开关(8个引脚的中断控制开关)
EXT_INT41_PEND寄存器
挂起寄存器:当cpu在处理其他的中断请求的时候,没办法及时的处理当前的中断,把当前中断挂起在GPIO的寄存器,可以等待其他中断处理后再来执行当前中断
这个寄存器一般来说不用自己写,前期初始化不用管 , 但是在中断处理结束后需要手动清零
产生中断自动置1,0表示没有中断挂起
四、 GPIO中断编程
#include "exynos_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 & (~(1 << 1));
return 0;
}