lv11 嵌入式开发 轮询与中断13

1 CPU与硬件的交互方式

轮询

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

中断

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

DMA

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

2 轮询方式实现按键实验

2.1 查看原理图

2.2 轮询方式寄存器分析 

GPX1CON控制寄存器

 

2.3 轮询代码


#include "exynos_4412.h"

int main()
{
	/*将GPX1_1设置成输入功能*/
	GPX1.CON = GPX1.CON & (~(0xF << 4)); 
	
	while(1)
	{
		/*判断GPX1_1引脚的状态,即判断按键是否按下*/
		if(!(GPX1.DAT & (1 << 1)))
		{
			printf("Key2 Pressed\n");
			/*等待松手*/
			while(!(GPX1.DAT & (1 << 1)));
		}
		else
		{
			
		}
	}
	return 0;
}

练习

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

查看原理图 

查看芯片手册 

led的略


#include "exynos_4412.h"





void Led_on(int num)

{

	switch(num)

	{

		case 2:

			GPX2.DAT = GPX2.DAT | (1 << 7);

		case 3:

			GPX1.DAT = GPX1.DAT | (1 << 0);

		case 4:

			GPF3.DAT = GPF3.DAT | (1 << 4);

		case 5:

			GPF3.DAT = GPF3.DAT | (1 << 5);

		default:

			break;

	}

}



void Led_off(int num)

{

	switch(num)

	{

		case 2:

			GPX2.DAT = GPX2.DAT & ~(1 << 7);

		case 3:

			GPX1.DAT = GPX1.DAT & ~(1 << 0);

		case 4:

			GPF3.DAT = GPF3.DAT & ~(1 << 4);

		case 5:

			GPF3.DAT = GPF3.DAT & ~(1 << 5);

		default:

			break;

	}

}

void Led_init(void)

{

	GPX2.CON = GPX2.CON & (~(0xF << 28)) | (0x1 << 28); //LED2 GPX2_7 output

	//GPX1.CON = GPX1.CON & (~0xF) | 0x1;                 //LED3 GPX1_0 output

	//GPF3.CON = GPF3.CON & (~(0xF << 16)) | (0x1 << 16); //LED4 GPF3_4 output

	//GPF3.CON = GPF3.CON & (~(0xF << 20)) | (0x1 << 20); //LED5 GPF3_5 output

	Led_off(2);

}

void Key_init(void)
{
	//GPIO X1_2 input
	GPX1.CON = GPX1.CON & (~(0xf << 8));
}


int main()

{
	int toggle = 0;
	Key_init();
	Led_init();
	printf("start\n");
	for(;;)
	{
		if(!(GPX1.DAT & ( 1 << 2)))
		{
			//等待松手
			while(!(GPX1.DAT & (1 << 2)));
			printf("key press\n");
			if(toggle == 0)

			{

				Led_on(2);

				toggle = 1;

			}

			else

			{

				Led_off(2);

				toggle = 0;

			}
		}
	}

	return 0;

}

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

4IOT

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

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

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

打赏作者

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

抵扣说明:

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

余额充值