⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 SleepTimerWakeup 定时中断唤醒CPU的范例
💻 C
字号:
//=========================================================================//
//工程:TimerA的IRQ中断唤醒CPU例程
//现象:如果单片机是好使的话,Sleep灯会一闪一闪地,当然不会闪得太快了
//作者:小丑		2005,05,25   
//=========================================================================//
#define P_TimerA_Data			(volatile unsigned int *)0x700A   
#define P_TimerA_Ctrl			(volatile unsigned int *)0x700B   
#define P_INT_Ctrl				(volatile unsigned int *)0x7010   
#define P_INT_Clear				(volatile unsigned int *)0x7011 
#define P_Watchdog_Clear		(volatile unsigned int *)0x7012   
#define P_SystemClock			(volatile unsigned int *)0x7013  

void Delay(void);

int main(void)
{
	*P_TimerA_Data = 0xfffd;		//设置TimerA的Data初值为0xfffd,即重载值也为0xfffd
	*P_TimerA_Ctrl = 0x002d;		//TimerA选用时钟源B,计数频率信号为2Hz信号,即TimerA溢出周期为1.5s
	*P_INT_Ctrl = 0x1000;			//打开TimerA的IRQ1中断,让TimerA的溢出中断可以唤醒单片机
	*P_INT_Clear = 0xffff;			//先清一下中断标志,以防万一
	__asm("IRQ ON");				//打开IRQ总中断使能
	__asm("IRQ OFF");
	*P_SystemClock = 0x0017;		//设置CPU进入睡眠
	while(1)	
	{
		*P_Watchdog_Clear = 0x0001;
		Delay();					//CPU唤醒后会先到中断里跑一下,Sleep灯灭了吧!
									//出来后会从让CPU进入中断的那条指令的下一条指令开始跑;
									//也就是说,唤醒后程序会到这来调用Delay函数
		*P_SystemClock = 0x0017;	//从Delay出来后,再次让CPU睡眠,这时Sleep灯是不是又亮了?
	}
}

void Delay(void)
{									//我也懒得算到底会Delay多长时间
	unsigned int i,j;
	for(j=0;j<10;j++)
	{
		for(i=0;i<10000;i++)
		{
			*P_Watchdog_Clear = 0x0001;
		}
	}
}

void IRQ1(void)__attribute__((ISR));
void IRQ1(void)						//TimerA的IRQ中断入口,TimerA的溢出中断会唤醒正在睡眠的CPU,
{									//唤醒后,CPU会跑到对应唤醒其的中断里来。
	if(*P_INT_Ctrl&0x1000)
	{
		*P_INT_Clear = 0x1000;		//不要忘了清中断标志
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -