微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > 单片机必须了解的外设功能——定时器/中断功能

单片机必须了解的外设功能——定时器/中断功能

时间:08-09 来源:网络 点击:

ED在一定周期内发光。虽然仅是很简单的操作,但是要想让LED在正确的周期内发光就需要使用定时器。在上述樱花程序库的"时间"选项内,有计算经过时间的数据库,所以我们就使用它。

  程序如图3所示。第14行的millis函数以从程序开始时经过的时间ms(毫秒:千分之一秒)为单位送回,没有参数。使用该函数,通过获取和最初的测定(第14行)之间的差距来取得1秒后、2秒后的结果。用while语言生成循环,从a的值等待1秒或2秒(第15行、第19行)。于是,1秒后LED0(GR-Sakura电路板的D1)亮灯,2秒后灭灯。灭灯后结束loop函数,但是该操作会再次反复继续执行。另外,millis函数没有符号,将返回long型的整数。

  图3:使用定时器功能使LED亮灯的程序。此例中,以1秒钟为周期闪烁。

  ※//~是用于进行评价,对程序的执行不产生影响

  将程序输入Web编译器,再将编译完成后的二进制文件传送给GR-SAKURA。传送结束后,4个LED灯将暂时熄灭后再开始执行,LED0(GR-Sakura电路板的D1)开始闪烁。

  接我们讲解了必要的外设功能之一"定时器"。有关时间和时刻的处理,在各种场合都需要。请大家借此机会实际操作各种数据库。

  但是,文中的"毎秒128次"和"1/1024秒"这些数字突然冒出来,是否让你吃了一惊呢?128是2的7次方,1024是2的10次方。RTC中具有每1/128秒产生一次中断的功能……这是在单片机的世界中经常看到的数字。

  接下来讲中断功能

  提高作业效率的"中断功能"指的是什么?

  我们回顾一下"定时器"中简单介绍过的"中断功能"概念。任何人都有过这样的经验,就是"将鸡蛋放进沸腾的热水中,直到鸡蛋煮熟的10分钟内要确认好几次时钟"的经历。在单片机的世界中也同样,在等待某种状态达成时,具有对对象进行定期检查的方法。例如,在等待向GPIO(通用I/O端口)的输入从0变为1时,程序可以一定的间隔来检查GPIO的状态。这种处理被称为"轮询"。

  轮询虽然是一种了解状态变化的简单方法,但是如果检查的频度低(间隔长)就会错过变化,如果频度过高(间隔短),即使查也查不到变化"空耗"。由于轮询通过简单的程序便能完成处理,所以在掌握对象的变化频度时是有效的。但是,进行多次检查也会给单片机带来负荷,对功耗不利。

  因此就要用到本期介绍的"中断功能"。产生中断时,CPU会暂时停止正在执行的任务,转而进行别的任务。也就是有别的任务"穿插"进来的意思(图1)。当中途穿插进来的任务结束后,CPU再返回处理原来的任务。

  

  设想一下你在工作的同时煮鸡蛋的情况。由于你不想停下手中的工作,所以把鸡蛋放入热水中后就设置定时器并继续工作,10分钟后定时器一响就把鸡蛋从热水中捞起。这时,定时器的鸣叫就是中断,而"把鸡蛋从热水中捞起"就是穿插进来的工作。大家可以通过这种方式来了解中断功能。

  单片机中的中断处理

  中断产生于单片机内部和外部的各种设备。于开关和感应器等单片机外部的中断称为外部引脚中断,来自这些机器的中断信号由名为"IRQ"的引脚接收,再向中断控制器(在RX63N中称被称为"ICUb")发出通知。IRQ为"Interrupt ReQuest"的略称,意思为"中断请求"。另外,来自单片机内部的定时器和GPIO、串行通信设备UART等外设机器的中断被称为外部设备中断,中断信号直接从各外部设备通知中断控制器。

  在中断控制器中,各种设备的中断信号按照先来后到的顺序,以适当的顺序被传送到CPU。而且,中断被设为无效的设备的中断信号将不会被传送到CPU,也就意味着可以忽视(屏蔽)这些信号。CPU按照从中断控制器接收到的指示来执行对应的程序(中断处理)。

  CPU一旦接收到中断控制器的中断信号,首先将终止执行中的程序。然而,会自动保存"从何处重启"的出栈(POP)信息,这被称为"进栈(PUSH)"。进栈结束后,将开始由中断执行的程序。该程序结束时,进栈信息将回送到CPU,这种现象被称为"出栈"(图2)。由于进栈和出栈都由CPU自动执行,因此程序设计者不必因顺序问题而费心。

  

  例如,通过UART执行串行通信时,经常监视字节是否被接收了而导致效率不佳。所以,多数情况下都对程序进行如下编程,即在信息送达时就会产生中断并进行适当的处理,另外,使定时器产生中断的情况也不在少数。进行"经过了一定时间后该做什么"这类处理时,应进行如下编程,即通过来自定时器的信号开始进行处理。如上所述,在有效利用单片机方面,中断功能发挥了很大的作用。

  还可使用数据库尝试编写复杂的中断程序!

为了编写与中断相关的程序,就需要了解单

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top