虽然在网上找到很多STM8活跃停机的编程方法,但是STM8的型号不一样,程序也是有差异的,我找了一圈没有找到STML101的程序,本来还想着偷一下懒的,无奈之下只好自己看手册和库函数,花了一点时间终于调试成功了。好了,接下来我就给大家讲一下活跃停机模式的代码要怎么写,希望对你有帮助。
整体的流程是:
1、打开AWU的时钟
2、设定计时的时间
3、使能AWU
4、进入停机模式
5、定时唤醒后清除标志
1、打开AWU的时钟。
这个简单,直接调用下面这个函数就行。这个函数在stm8l10x_clk.c里面。
CLK_PeripheralClockConfig(CLK_Peripheral_AWU, ENABLE);//初始化AWU的时钟
2、设定计时的时间。
这个直接调用下面这个函数就行,AWU_Init()函数在stm8l10x_awu.c里面,AWU_Timebase_30s在stm8l10x_awu.h,这个定时的时间有17种选择,最大30s。如果想定时更长的时间,只能在唤醒之后马上进入睡眠,反复多次,直到达到需要定时的时间为止。
AWU_Init(AWU_Timebase_30s);//设定计时时间,最大30s
注:如果对定时的时间要求很严格的话,在调用AWU_Init()函数之前需要先调用AWU_LSICalibrationConfig()函数校准,这个就比较复杂了,网上也有相关的程序,我就不多说了。
3、使能AWU。
直接调用就行了。
AWU_Cmd(ENABLE);
4、进入停机模式。
直接调用面这个函数就行了。定时器是在进入停机模式之后才开始计时的。
halt();
5、定时唤醒后清除标志。
INTERRUPT_HANDLER()函数在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分钟唤醒
//主函数
void main(void)
{
u8 wakeuptime = 0;
CLK_MasterPrescalerConfig(CLK_MasterPrescaler_HSIDiv1); //系统时钟1分频,16MHz
//外设模块初始化,悬空的引脚输出低以降低功耗,根据你自己的需要写,不详细说了
HarDriver_Init();
//配置AWU
CLK_PeripheralClockConfig(CLK_Peripheral_AWU, ENABLE);//初始化AWU的时钟
AWU_Init(AWU_Timebase_30s);//设定计时时间,最大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();//进入休眠
}
}
//中断服务函数,在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的活跃停机是真的挺简单的,但是如果你以前没用过,可能就无从下手了,希望这篇文章能够帮到你。如果还有什么问题,可以联系我。如果文中有误,请一定要指正,谢谢!!