应广单片机 PMS150G 161 171 基础例子【Interrupt】

该文介绍了一种中断测试的例子,包括T16定时器中断和外部IO中断(PA0)。通过设置T16计数器溢出和PA0状态变化触发中断,利用中断服务函数实现LED翻转,验证中断功能。实验中,可以通过关闭PA0中断,仅开启T16中断来单独测试T16中断功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

中断测试例子

//==========================================//
//					中断设置
//以下案例分别介绍了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口翻转 示波器验证

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值