?? main.c
字號:
//=========================================================================//
//工程:TimerA的IRQ中斷喚醒CPU例程
//現(xiàn)象:如果單片機(jī)是好使的話,Sleep燈會(huì)一閃一閃地,當(dāng)然不會(huì)閃得太快了
//作者:小丑 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; //設(shè)置TimerA的Data初值為0xfffd,即重載值也為0xfffd
*P_TimerA_Ctrl = 0x002d; //TimerA選用時(shí)鐘源B,計(jì)數(shù)頻率信號為2Hz信號,即TimerA溢出周期為1.5s
*P_INT_Ctrl = 0x1000; //打開TimerA的IRQ1中斷,讓TimerA的溢出中斷可以喚醒單片機(jī)
*P_INT_Clear = 0xffff; //先清一下中斷標(biāo)志,以防萬一
__asm("IRQ ON"); //打開IRQ總中斷使能
__asm("IRQ OFF");
*P_SystemClock = 0x0017; //設(shè)置CPU進(jìn)入睡眠
while(1)
{
*P_Watchdog_Clear = 0x0001;
Delay(); //CPU喚醒后會(huì)先到中斷里跑一下,Sleep燈滅了吧!
//出來后會(huì)從讓CPU進(jìn)入中斷的那條指令的下一條指令開始跑;
//也就是說,喚醒后程序會(huì)到這來調(diào)用Delay函數(shù)
*P_SystemClock = 0x0017; //從Delay出來后,再次讓CPU睡眠,這時(shí)Sleep燈是不是又亮了?
}
}
void Delay(void)
{ //我也懶得算到底會(huì)Delay多長時(shí)間
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的溢出中斷會(huì)喚醒正在睡眠的CPU,
{ //喚醒后,CPU會(huì)跑到對應(yīng)喚醒其的中斷里來。
if(*P_INT_Ctrl&0x1000)
{
*P_INT_Clear = 0x1000; //不要忘了清中斷標(biāo)志
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -