一、 STM8S 外部中斷進行喚醒
先了解一下STM8S的中斷資源
再看看STM8S的中斷管理。STM8S采用軟件優(yōu)先級和硬件優(yōu)先級來控制一個中斷的響應(yīng),先比較軟件優(yōu)先級只有當(dāng)軟件優(yōu)先級一致時才會比較硬件優(yōu)先級,由于硬件優(yōu)先級具有唯一性,這樣便保證了某一時刻定會只有一個中斷被處理。
要使用外部中斷,只需簡單的配置一下EXTI_CR1寄存器,并將主程序main的軟件優(yōu)先級置為0即可。默認情況下自復(fù)位開始,主程序的軟件優(yōu)先級被設(shè)置為3,處于最高軟件優(yōu)先級,僅有TRAP,TLI,RESET中斷能夠打斷,其余的中斷都是不會被響應(yīng)的。
為了防止中斷過程中被別的優(yōu)先級高的中斷所打斷,可以將當(dāng)前優(yōu)先級置為最高3級。
代碼如下:
main.c代碼
//EXTI_CR1|=EXTI_CR1_PBIS_R;//PB5TRINT高電平觸發(fā)
EXTI_CR1|=EXTI_CR1_PCIS_R;//PC3上升沿觸發(fā)
//#defineEXTI_CR1_PCIS_R(1<<4)
RIM;//開全局中斷,必須要有這句,否則只會響應(yīng)不可屏蔽中斷
//#defineHALT_asm("halt")
//#defineRIM_asm("rim")
//#defineSIM_asm("sim")
GPIO_Init(GPIOC,TRINT,GPIO_MODE_IN_PU_IT);//使能對應(yīng)的IO口中斷
stm8s_it.c代碼
//收發(fā)中斷(PC3)BJ8F101
@far@interruptvoidEXTI_PORTC_IRQHandler(void)
{
//作為接收中斷使用,需要注意PSB_D,TRRDY_U會產(chǎn)生一次中斷,TRINT被拉高
if(cur_mode==RX_MODE)
{
//為了排除第一次,可以檢測PSB是否為高,高表示是ActiveMode
if(PB_ODR&PSB)
{
ss=1;
}
}else
{
}
return;
}
其實rim指令,只是將主程序的軟件優(yōu)先級降低為0,這樣才能被中斷打斷。自然sim指令適用于將軟件優(yōu)先級拉升至3級別。
而且還得注意如果一個端口上存在幾個不同的中斷(PC3,PC4,PC5都有中斷發(fā)生),只能根據(jù)其他的一些標志來判斷是哪個IO口中斷,其實這個芯片是沒有中斷標志位的。
另外一個是出現(xiàn)進入中斷后跳不出來,很有可能是指令執(zhí)行順序不正確,如:先執(zhí)行了rim指令,接著使能GPIO口中斷后,將對應(yīng)的IO口設(shè)置為上升沿觸發(fā),發(fā)現(xiàn)跳進中斷后就出不來。這個原因是因為IO口可能復(fù)位后就處于不確定狀態(tài),執(zhí)行rim后立刻就被響應(yīng)。默認情況下IO口上升沿下降沿都將觸發(fā)中斷。
外部中斷是能夠喚醒系統(tǒng)的,如:
也就是說在main函數(shù)中執(zhí)行了halt指令后,進入停機模式(沒有使能AWU的情況下),外部中斷能夠?qū)CU中停機喚醒。使用仿真器可以設(shè)置斷點進行證實,或者通過LED燈亦可。
二、 AWU自動喚醒
STM8S除了等待模式,停機模式,還提供活躍停機模式?;钴S停機的使用,只需要將AWU使能即可。
#ifdefENABLE_AWU
voidInit_AWU(void)
{
CLK_PCKENR2=CLK_PCKENR2_AWU;//使能AWU時鐘
//#defineAWU_AWUTB_1S0x0C/*500ms~1s*/
//#defineAWU_AWUTB_2S0x0D/*1s~2s*/
AWU_TBR=AWU_AWUTB_1S;//AWU_AWUTB_2S;//1~2s
AWU_APR=0x3E;//分頻
AWU_CSR|=0x10;//AWU使能
#ifdefPOWER_LEVEL_1//功耗1,最省電
CLK_ICKR|=CLK_ICKR_REGAH;//活躍停機模式(AWU使能情況)下,關(guān)閉電壓調(diào)節(jié)器節(jié)省功耗
FLASH_CR1|=FLASH_CR1_AHALT;//活躍停機模式下Flash掉電,默認只有停機模式才掉電,代價是喚醒時間增加至微秒級別
#endif/*ENABLEPOWER_LEVEL_1*/
}
#endif/*ENDENABLE_AWU*/
然后在main函數(shù)內(nèi)部執(zhí)行halt指令后直到AWU進行喚醒,MCU才會接著運行。另外STM8S的AWU定時喚醒提供最大30秒左右延時。
三、窗口看門狗
STM8S提供兩種類型看門狗,個人感覺窗口看門狗能夠解決停機模式與使用看門狗的矛盾,因此獨衷于窗口看門狗。
代碼如下:
#ifdefENABLE_WWDG
voidInit_WWDG(void)//初始化窗口看門狗
{
//窗口看門狗在計數(shù)值降到0x3F時產(chǎn)生復(fù)位,而且不能在大于窗口值時喂狗,否則復(fù)位
WWDG_WR=0x60;//看門狗窗口值,窗口值必須在0x3F以上,但必須小于計數(shù)值,否則無法喂狗
WWDG_CR=0x7F;//看門狗計數(shù)值
WWDG_CR|=0x80;//使能窗口看門狗
//4Mhz主頻,計數(shù)值0x7F最大延長時間為(64*(12288/4000000))=196ms
}
voidFree_WWDG(void)
{
if((WWDG_CR&0x7F) WWDG_CR|=0x7F;//重新喂狗 } #endif/*ENDENABLE_WWDG*/ 不能使用定時器來定時喂狗,MCU掛掉后可能定時器電路仍在工作,這樣看門狗就失去了意義。 獨立看門狗不受MCU停機模式或其他模式影響,它的時鐘是獨立的,所以進入停機模式會導(dǎo)致系統(tǒng)復(fù)位。 總結(jié): 1、中斷的使用需要注意優(yōu)先級的設(shè)置,以及對應(yīng)的IO口使能觸發(fā)條件。 2、AWU的使用相對簡單,只需要注意將時鐘打開。 3、窗口看門狗要注意喂狗,以及延時設(shè)置,具體延時時間可以使用 step = 12288 / fclk_wwdg_ck計算出來。