D16. 轮询与中断-ARM体系结构与接口技术-嵌入式学习LV9

DAY16. 轮询与中断


如果出现图片无法查看可能是网络问题,我用的GitHub+图床保存的图片,可以参考我另外一篇文章GitHub的使用方法含网络问题解决
GitHub使用教程含网络问题_github加速器_肉丸子QAQ的博客-CSDN博客


相关作业和资料已上传,请在主页自行查看

1. CPU与硬件的交互方式

1. 轮询

CPU执行程序时不断地询问硬件是否需要其服务,若需要则给予其服务,若不需要一段时间后再次询问,周而复始

image-20230808155848140

2. 中断

CPU执行程序时若硬件需要其服务,对应的硬件给CPU发送中断信号,CPU接收到中断信号后将当前的程序暂停下来,转而去执行中断服务程序,执行完成后再返回到被打断的点继续执行

3. DMA

硬件产生数据后,硬件控制器可将产生的数据直接写入到存储器中,整个过程无需CPU的参与

2. 轮询方式实现按键实验

  • 查看原理图寻找按键(本次使用K2)
image-20230808160528603

正常状态按键不按下时,有上拉电阻的存在所以是高电平,按下是低电平

  • 查看芯片引脚GPX1_1

image-20230808161652307

  • 查看相关寄存器

image-20230808162114763

image-20230808162753496

读取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))) //除了自己要读的位保持不变,其他位全部清零,读取到低电平表示按下所以要取非才能做出判断
		{
			printf("key2 pressed\n");
		}
		else
		{
		
		}
	}

	return 0;
}

C语言中代表的是非,~代表的是取反,是逻辑运算符, ~一般是用于设置标志位

image-20230808164349298

按键按下一次会打印很多个,因为我们按下一次的时间已经能运行很多次循环了,所以需要一个等待按键松开的程序

#include "exynos_4412.h"
int main()
{
	GPX1.CON = GPX1.CON & (~(0xF << 4));// [7:4]清零
	while(1)
	{
		/*判断GPX1_1引脚的状态,即判断按键是否按下*/
		if(!(GPX1.DAT & (1 << 1))) //除了自己要读的位保持不变,其他位全部清零,读取到低电平表示按下所以要取非才能做出判断
		{
			printf("key2 pressed\n");
			/*等待松手*/
			while(!(GPX1.DAT & (1 << 1)));
		}
		else
		{
		c
		}
	}

	return 0;
}

image-20230808164810166

按下一次只打印一次内容

3. GPIO中断相关寄存器

1. GPIO中断

image-20230808173429850

当按键按下的时候会给CPU发送信号,执行中断程序,就不需要一遍又一遍的去问了

2. 设置中断流程及相关寄存器

  1. 通过查看芯片手册可以知道GPX1_1拥有中断的功能

image-20230808174617522

  1. 单纯将IO设置成中断模式还无法达到要求,需要其他的一些寄存器进行更加细节的设置

image-20230808175644065

根据芯片手册GPX0的引脚对应EXT_INT40_FLTCON1中的40,以此类推GPX1对应41

EXT_INT41CON寄存器
image-20230808180705447
EXT_INT41_FLTCON1寄存器

滤波寄存器,本次实验不用

设置滤波电路,可以防止按键抖动

也可以设置滤波类型

(实际测试这个寄存器没什么用,效果没太大区别)

EXT_INT41_MASK寄存器

设置中断开关

image-20230808181359748
EXT_INT41_PEND寄存器

挂起寄存器:当cpu在处理其他的中断请求的时候,没办法及时的处理当前的中断,可以等待其他中断处理后再来执行当前中断

image-20230808182124377

这个寄存器一般来说不用自己写,前期初始化不用管 , 但是在中断处理结束后需要手动清零

4. GPIO中断编程

5. 作业

1.简述轮询和中断两种方式的本质区别是什么

轮询是cpu每隔一段时间就要查看一次是否有信号,中断是当有信号产生的时候发送给CPU,一个CPU主动接收信号,一个CPU被动接收信号

2.使用轮询的方式检测Key3按键的状态,实现按一次按键,LED2点亮,再次按下,LED2熄灭

第一种思路:

#include "exynos_4412.h"



void LED_INIT(void)
{
	GPX2.CON = GPX2.CON & (~(0XF << 28)) | (0x1 << 28);
}

void LED_ON(void)
{
	GPX2.DAT = GPX2.DAT | (0x1 << 7);
	
}

void LED_OFF(void)
{
	GPX2.DAT = GPX2.DAT & (~(0x1 << 7));
	
}


int main()
{
	LED_INIT();
	LED_OFF();
	int a = 0;
	GPX1.CON = GPX1.CON & (~(0xF << 8));// [11:0]清零,0表示输入模式
	while(1)
	{
		/*判断GPX1_2引脚的状态,即判断按键是否按下*/
		if((!(GPX1.DAT & (1 << 2))) && (a == 0)) //除了自己要读的位保持不变,其他位全部清零,读取到低电平表示按下所以要取非才能做出判断
		{
			LED_ON();
			printf("ON\n");
			/*等待松手*/
			while((!(GPX1.DAT & (1 << 2))) && (a == 0))
			{
				;	
			}
			a = 1;

		}
		 if((!(GPX1.DAT & (1 << 2))) && (a == 1)) //除了自己要读的位保持不变,其他位全部清零,读取到低电平表示按下所以要取非才能做出判断
		{
			LED_OFF();
			printf("OFF\n");
			while((!(GPX1.DAT & (1 << 2))) && (a == 1))
			{
				;
			}
			a = 0;
		
		}
	}

	return 0;
}

第二种思路:

#include "exynos_4412.h"



void LED_INIT(void)
{
	GPX2.CON = GPX2.CON & (~(0XF << 28)) | (0x1 << 28);
}

void LED_ON(void)
{
	GPX2.DAT = GPX2.DAT | (0x1 << 7);

}

void LED_OFF(void)
{
	GPX2.DAT = GPX2.DAT & (~(0x1 << 7));

}


int main()
{
	LED_INIT();
	LED_OFF();
	int a = 0;
	GPX1.CON = GPX1.CON & (~(0xF << 8));// [11:0]清零,0表示输入模式
	while(1)
	{
		/*判断GPX1_2引脚的状态,即判断按键是否按下*/
		if(!(GPX1.DAT & (1 << 2))) //除了自己要读的位保持不变,其他位全部清零,读取到低电平表示按下所以要取非才能做出判断
		{
			printf("Key2 Pressed\n");
			/*等待松手*/
			while(!(GPX1.DAT & (1 << 2)))
			{
				;
			}
			a++;
		}

		if(a%2)
		{
			/*点亮LED2*/
			printf("NO\n");
			LED_ON();
		}
		else
		{
			/*熄灭LED2*/
			printf("OFF\n");
			LED_OFF();
		}

	}

	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肉丸子QAQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值