📄 main.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 + -