混合信号嵌入式设计实验指南-数字实验之:实验2—中断
1.2.1 实验2A—发布中断
使用INT_CLRx 寄存器访问发布的中断。通过INT_CLR0 寄存器的第6 比特位来控制休眠定时器发布中断。当该位的值为“1”时,将发布一个定时器的中断。将该位设置为“0”时,将清除所发布的中断。
步骤1:创建新的工程。
工程名字为Lab2A
—选择C 选项;
—用于器件类型及其设置的标准实验设置;
—转到互联界面,将全局参数Sleep_Timer 设置为1Hz (这将使得休眠定时器每一秒钟产生一个等待处理的中断);
—按表1.3 设置四个端口引脚。
表1.3 端口驱动设置
名字(Name) | 端口(Port) | 选择(Select) | 驱动(Drive) |
LedOut1 | P1[0] | StdCPU | Strong |
LedOut2 | P1[1] | StdCPU | Strong |
LedOut3 | P1[2] | StdCPU | Strong |
LedOut4 | P1[3] | StdCPU | Strong |
步骤2:在Eval1 板子上添加跳线。
使用跳线进行下面的连接—P10 到LED1 —P11 到LED2 —P12 到LED3
P13 到LED4 。生成应用。步骤3:写软件。转到应用程序编辑器,打开如图1.14 所示的main.c 文件。如图1.15 所示,添加代码。该程序应注意:bShadow 定义成一个全局单字节变量。INT_CLR0 寄存器用来监视和清除休眠定时器已经发布的中断。
图1.14 main.c 原型
图1.15 Lab2A 控制软件
练习2A-2 :这段代码的作用是什么?
步骤4:下载并运行。建立工程,并验证工程没有错误;下载程序到Eval1,并且运行;用LED 的输出来验证操作。练习2A-3:LED 的操作和练习2 中预测的一样吗? 返回互联视图,将休眠定时器参数改为8Hz 。练习2A-4 :当休眠定时器的参数为8Hz 时,对LED 的输出有什么影响? 重新生成应用,重新建立工程,下载到Eval1 板子,并且运行。
练习2A-5 :观察结果是否确认了练习2A-4 的预测?
1.2.2 实验2B—待处理的中断
步骤1:复制Lab2A。打开Lab2A。将工程保存为Lab2B。打开这个新的工程,并转到布局视图。保持当前Eval1 板上的跳线状态。重新生成应用。CPU_SCR0 是一个寄存器,当第3 位设置为高时,系统处于低功耗休眠模式。在这个模式下,禁止系统时钟。为了唤醒时钟,必须清除该位的设置。因为CPU 没有操作,因此通过定义CPU 不能清除该位。只有出现任何待处理的中断时,才能清除该位。在其中的一个INT_MSKx 寄存器中,对合适的位进行设置,将使能一个待处理的中断。当INT_MSK0 寄存器的第6 位设置为高时,使能休眠定时器中断。
对于更多可读的代码,系统定义了M8C_Sleep 为(CPU_SCR0|=0x08)。这将引起系统进入休眠模式。步骤2:修改代码。转到应用程序编辑器,打开main.c 。进行下面的修改。
—使用INT_MSK0 ,使能休眠定时器中断。
—使用休眠命令代替代码中用于等待一个已发布中断的部分。重新建立工程,下载到Eval1 板子,并且运行。验证程序正确的工作。
练习2B-1:为什么你想使用休眠模式来代替轮询已发布的休眠定时器中断?练习2B-2:为什么你想轮询,而不是将系统进入到休眠模式?
1.2.3 实验2C—全局中断
步骤1:创建新的工程。
复制Lab2B,将其命名为Lab2C。
所有参数和跳线连接保持一样。
重新生成应用。
可以使用两种不同的方法清除已经发布的中断。正如以前给出的那样,通过清除INT_CLR0 的第6 比特位来强迫清除。另一个方法是服务中断。最小的中断服务例程被放置在中断向量地址的“reti” 。所有这个例程将CPU 的操作返回到原来的程序。用于这个中断服务程序的术语称为“stub” (存根)。
打开boot.asm ,并且验证在休眠定时器向量位置存在一个存根。
练习2C-1:在这个向量位置有多少代码空间可以使用?
练习2C-2:假设需要更多的空间,你将如何做?
设置标志“F”寄存器的第0 比特位,使能全局中断。相反清除该位将禁止全局中断。对于更多的可读代码,系统定义了M8C_EnableGInt 为asm“or F,01h”。它使能全局中断。“asm() ”是一个函数,其允许在C 程序中嵌入汇编命令。
步骤2:修改代码。
转到应用程序编辑器中,打开main.c 。
进行下面的修改。
—添加代码使能全局中断。
—删除用于清除休眠定时器中断的代码。
重新建立工程,下载到Eval1,并运行。
像前面一样验证程序。
评论