加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
  • 推荐器件
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

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

03/22 07:34
1050
阅读需 7 分钟
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

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

推荐器件

更多器件
器件型号 数量 器件厂商 器件描述 数据手册 ECAD模型 风险等级 参考价格 更多信息
SN74AHC1G14DCKR 1 Texas Instruments Single 2-V to 5.5-V inverter with Schmitt-Trigger inputs 5-SC70 -40 to 125

ECAD模型

下载ECAD模型
$0.28 查看
DP83848CVVX/NOPB 1 Texas Instruments Commercial temperature, 10/100-Mbps Ethernet PHY transceiver with SNI interface & JTAG support 48-LQFP 0 to 70

ECAD模型

下载ECAD模型
$4.35 查看
SN74LVC1G07DCKT 1 Rochester Electronics LLC LVC/LCX/Z SERIES, 1-INPUT NON-INVERT GATE, PDSO5, GREEN, PLASTIC, SC-70, 5 PIN
$1.39 查看

相关推荐

电子产业图谱