STM8L101活跃停机(AWU)编程教学

STM8L101活跃停机(AWU)编程教学

虽然在网上找到很多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的活跃停机是真的挺简单的,但是如果你以前没用过,可能就无从下手了,希望这篇文章能够帮到你。如果还有什么问题,可以联系我。如果文中有误,请一定要指正,谢谢!!

发布了16 篇原创文章 · 获赞 44 · 访问量 6933

猜你喜欢

转载自blog.csdn.net/ShenZhen_zixian/article/details/103470579