雖然在網(wǎng)上找到很多STM8活躍停機的編程方法,但是STM8的型號不一樣,程序也是有差異的,我找了一圈沒有找到STML101的程序,本來還想著偷一下懶的,無奈之下只好自己看手冊和庫函數(shù),花了一點時間終于調(diào)試成功了。好了,接下來我就給大家講一下活躍停機模式的代碼要怎么寫,希望對你有幫助。
整體的流程是:
1、打開AWU的時鐘
2、設(shè)定計時的時間
3、使能AWU
4、進入停機模式
5、定時喚醒后清除標志
1、打開AWU的時鐘。
這個簡單,直接調(diào)用下面這個函數(shù)就行。這個函數(shù)在stm8l10x_clk.c里面。
CLK_PeripheralClockConfig(CLK_Peripheral_AWU, ENABLE);//初始化AWU的時鐘
2、設(shè)定計時的時間。
這個直接調(diào)用下面這個函數(shù)就行,AWU_Init()函數(shù)在stm8l10x_awu.c里面,AWU_Timebase_30s在stm8l10x_awu.h,這個定時的時間有17種選擇,最大30s。如果想定時更長的時間,只能在喚醒之后馬上進入睡眠,反復(fù)多次,直到達到需要定時的時間為止。
AWU_Init(AWU_Timebase_30s);//設(shè)定計時時間,最大30s
注:如果對定時的時間要求很嚴格的話,在調(diào)用AWU_Init()函數(shù)之前需要先調(diào)用AWU_LSICalibrationConfig()函數(shù)校準,這個就比較復(fù)雜了,網(wǎng)上也有相關(guān)的程序,我就不多說了。
3、使能AWU。
直接調(diào)用就行了。
AWU_Cmd(ENABLE);
4、進入停機模式。
直接調(diào)用面這個函數(shù)就行了。定時器是在進入停機模式之后才開始計時的。
halt();
5、定時喚醒后清除標志。
INTERRUPT_HANDLER()函數(shù)在stm8l10x_it.c里面。
INTERRUPT_HANDLER(AWU_IRQHandler,4)
{
/* In order to detect unexpected events during development,
it is recommended to set a breakpoint on the following instruction.
*/
AWU_GetFlagStatus();//清除標志
}
完整的代碼段:
//我這里是定時5分鐘喚醒
//主函數(shù)
void main(void)
{
u8 wakeuptime = 0;
CLK_MasterPrescalerConfig(CLK_MasterPrescaler_HSIDiv1); //系統(tǒng)時鐘1分頻,16MHz
//外設(shè)模塊初始化,懸空的引腳輸出低以降低功耗,根據(jù)你自己的需要寫,不詳細說了
HarDriver_Init();
//配置AWU
CLK_PeripheralClockConfig(CLK_Peripheral_AWU, ENABLE);//初始化AWU的時鐘
AWU_Init(AWU_Timebase_30s);//設(shè)定計時時間,最大30s
AWU_Cmd(ENABLE);
while(1)
{
if(AWU_Status_Flag == 1)
{
AWU_Status_Flag = 0;
wakeuptime ++;
if(wakeuptime >= 10) //實際測試10次只能定時4分40秒
{//計時時間到
wakeuptime = 0;
LED_ON;
Delay_ms(500);
LED_OFF;
//取消定時喚醒,我這里不需要一直用活躍停機。如果是每間隔一段時間就喚醒,不需要加下面的代碼
//AWU_DeInit();//反初始化
//CLK_PeripheralClockConfig(CLK_Peripheral_AWU, DISABLE);
//AWU_Cmd(DISABLE);
}
}
halt();//進入休眠
}
}
//中斷服務(wù)函數(shù),在stm8l10x_it.c里面。
INTERRUPT_HANDLER(AWU_IRQHandler,4)
{
/* In order to detect unexpected events during development,
it is recommended to set a breakpoint on the following instruction.
*/
AWU_GetFlagStatus();
AWU_Status_Flag = 1;
}
好了,到這里就配置完成了,其實stm8的活躍停機是真的挺簡單的,但是如果你以前沒用過,可能就無從下手了,希望這篇文章能夠幫到你。如果還有什么問題,可以聯(lián)系我。如果文中有誤,請一定要指正,謝謝?。?/p>