CPU与硬件的交互方式
轮询方式:CPU不断的访问硬件有没有进行操作,如果接收到了信息,CPU就处理。如果没有过一会在访问一遍 直到有信息为止
中断方式:硬件操作的时候会写一个中断,向CPU发送这个中断,CPU正常执行程序,如果收到该中断,就处理 中断
DMA方式:硬件产生数据时,直接放到存储器当中,不需要CPU的参与了
1.简述轮询和中断两种方式的本质区别是什么
轮询:需要CPU主动访问有没有数据
中断:是寄存器向CPU发送中断信号,来处理数据
轮询方式
轮询方式:实现KEY按键来控制LED2灯的点亮和熄灭
第一步:查看KEY按键的通电方式
得出结论K2按下连接地,弹起是通过VDD1V8_EXT来通电也就是1.8V高电平,通过UART_RING网络标号查看连接到那个引脚上
通过FS4412_CoreBoard_V2电路图查看连接在K2按键的引脚是GPX1_1引脚上面
第二步:
将GPX1_1寄存器设置成输入功能 因为是要接收KEY2按键的信号
判断GPX1_DAT寄存器接收到的是低电平还是高电平
第三步:
查看LED2灯引脚控制情况
通过CHG_COK网络标号查看那个引脚控制
将GPX2_7寄存器设置成输出功能
将GPX2_DAT寄存器第七位设置成高电平点亮,低电平熄灭
代码实现:
#include "exynos_4412.h"
void GPX_LED (char flag) {
if(flag) {
/* 点亮LED2 */
GPX2.DAT = GPX2.DAT | (0x1 << 7);
} else {
/* 熄灭LED2 */
GPX2.DAT = GPX2.DAT & (~(0x1 << 7));
}
}
int main()
{
char flag = 0x1;
/* 将GPX1_1设置成输入功能 */
GPX1.CON = GPX1.CON & (~(0xF << 4));
/* 讲GPX2_7设置成输出功能 LED2 */
GPX2.CON = GPX2.CON & (~(0xF << 28)) | (0x1 << 28);
while (1) {
/* 判断GPX_1引脚状态,即判断按键是否按下 Key2 */
if (!(GPX1.DAT & (1 << 1))) {
printf("Key2 Pressed\n");
/* 点亮和熄灭LED2 */
flag = !flag;
GPX_LED(flag);
/* 判断按键是否松开 */
while (!(GPX1.DAT & (1 << 1)));
}
else {
}
}
return 0;
}
中断方式
中断方式:GPIO寄存器检测KEY按键引脚是否产生中断
CPU检测到K2为下降沿信号会向CPU发送一个中断信号
如果将GPX1_1寄存器这一组设置成中断功能,那么中断一些详细的设置就在EXT_INT ‘41’ CON数字是41的寄存器中设置
EXT_INT41_CON[1]:产生中断的方式,什么情况下向CPU发送中断信号
0x0 = Low level高电平方式
0x1 = High level 低电平方式
0x2 = Triggers Falling edge 上升沿方式
0x3 = Triggers Rising edge 下降沿方式
0x4 = Triggers Both edge 上升、下降其中一种
0x5 to 0x7 = Reserved
上升沿:就是有一个信号由高电平变成低电平时触发
EXT_INT41_MASK寄存器:是关闭和打开引脚中断功能的
代码实现:
void GPX_LED (char flag) {
if(flag) {
/* 点亮LED2 */
GPX2.DAT = GPX2.DAT | (0x1 << 7);
} else {
/* 熄灭LED2 */
GPX2.DAT = GPX2.DAT & (~(0x1 << 7));
}
/* 讲GPX2_7设置成输出功能 LED2 */
GPX2.CON = GPX2.CON & (~(0xF << 28)) | (0x1 << 28);
}
int main()
{
char flag = 0x1;
/* 将GPX1_1设置成中断功能 */
GPX1.CON = GPX1.CON | (0xF << 4);
/* 设置GPX1_1中断触发方式 下降沿触发方式*/
EXT_INT41_CON = EXT_INT41_CON & (~(0x7 << 4)) | (0x2 << 4);
/* 使用GPX1_1中断功能开关 0-开 1-关 */
EXT_INT41_MASK = EXT_INT41_MASK & (~(1 << 1));
/*
设置了这些中断功能,GPIO寄存器检测到KEY按键的中断信号,
是不能直接往CPU中发送这个中断信号的,需要通过中断控制器发往CPU
*/
return 0;
}