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