中断测试例子
//==========================================//
// 中断设置
//以下案例分别介绍了T16中断、外部IO中断
//T16中断:计数器溢出触发中断
// 例中reload_T16计数超过中断源时溢出
//外部IO中断:上升缘和下降缘触发中断
// 例中PA.0的状态从0到1或者从1到0都会触发中断
//==========================================//
#include "extern.h"
//注:只需要开启需要的中断,不需要的中断可以删除。
//========T16中断设置========
word reload_T16;
BIT LED1 : PA.3;
BIT LED2 : PA.4;
void T16_init(void)
{
$ T16M SYSCLK,/1,bit8; //T16的时钟源选择,内部的时钟分频器,中断源选择(当选择位由低到高或者由高到低时,发生中断事件);
//时钟源选择可以选择STOP, SYSCLK, PA4_F, IHRC, ILRC, PA0_F;分频器可选择/1, /4, /16, /64
//中断源可选择BIT8, BIT9, BIT10, BIT11, BIT12, BIT13, BIT14, BIT15
// $ T16M stop; //关闭T16时钟,即关闭T16中断
reload_T16 = 0;
stt16 reload_T16; //设定计数器初始值reload_T16,当计数器累加超过设定中断源时产生中断;
$ INTRQ T16; //中断请求寄存器,此位是由硬件置位并由软件清零;1:请求,0:不请求。
//注:INTEN,INTRQ没有初始值,所以要使用中断前,一定要根据需要设定数据。即使INTEN为0,INTRQ还是会被中断发生源触发。
$ INTEGS BIT_R; //T16中断边缘选择,上升缘请求中断为BIT_R,下降缘请求中断为BIT_F;默认为上升缘请求。
// 设定INTEN、INTRQ的初始值
INTEN.T16 = 1; //中断允许寄存器,启用从T16的溢出中断;1:启用,0:停用。
// INTEN.T16 = 0; //关T16中断
INTRQ.T16 = 0; //清零INTRQ寄存器。
}
//========PA0中断设置========
void PA0_init(void)
{
$ INTEGS PA0_B; //PA0中断边缘选择,上升缘和下降缘上升缘都请求中断PA0_B,上升缘请求中断为PA0_R,下降缘请求中断为PA0_F。
$ INTRQ PA0; //中断请求寄存器,此位是由硬件置位并由软件清零;1:请求,0:不请求。
//注:INTEN,INTRQ没有初始值,所以要使用中断前,一定要根据需要设定数据。即使INTEN为0,INTRQ还是会被中断发生源触发。
// 设定INTEN、INTRQ的初始值
INTEN.PA0 = 1; //中断允许寄存器,启用从PA0的溢出中断;1:启用,0:停用。
// INTEN.PA0 = 0; //关PA0中断
INTRQ.PA0 = 0; //清零INTRQ寄存器。
}
void FPPA0 (void)
{
.ADJUST_IC SYSCLK=IHRC/16, IHRC=16MHz, VDD=3.3V;
$ LED1 out ,low;
$ LED2 out ,low;
//T16_init();
PA0_init();
//========中断设置========
ENGINT; //开启全局中断
// DISGINT; //关闭全局中断
while (1)
{
nop;
}
}
void Interrupt (void)
{
pushaf;
//==========T16==========
if (Intrq.T16)
{
stt16 reload_T16; //设定计数器初始值reload_T16
Intrq.T16 = 0;
$ LED1 toggle; //翻转LED信号
}
//=========PA0===========
if (Intrq.PA0)
{
Intrq.PA0 = 0;
$ LED2 toggle; //翻转LED信号
}
popaf;
}
实验效果
同时上面代码还可以测试T16定时中断,
关闭io中断初始化,打开T16中断设置,可以测试T16中断,在中断中使用led io口翻转 示波器验证