【STM8L】STM8L之低功耗模式
本篇博文最后修改时间:2016年12月14日,14:48。
一、简介
本文介绍STM8L系列如何实现:默认低功耗模式,用按键实现唤醒并发射红外信号,随即又进入低功耗模式 。
二、实验平台
编译软件:IAR for STM8 1.42.2
硬件平台:stm8l101f3p6开发板
仿真器:ST-LINK
库函数版本:STM8L_STMTouch_Lib_V1.1.0
三、版权声明
博主:甜甜的大香瓜
声明:喝水不忘挖井人,转载请注明出处。
原文地址:http://blog.csdn.NET/feilusia
联系方式:897503845@qq.com
香瓜BLE之CC2541群:127442605
香瓜BLE之CC2640群:557278427
香瓜BLE之Android群:541462902
四、基础知识
1、STM8L有几个模式?
答:
1)非低功耗模式(1个)
Run mode(运行模式)
2)低功耗模式(3个)
Wait(等待模式)、Active-halt(活跃停机模式)、Halt(停机模式)。
2、STM8L低功耗的3个模式有什么区别?
答:
简单地来说,就是:
1)wait(等待模式):时钟关闭、外设可用。通过中断、外部中断、复位,能退出本模式。
2)Active-halt(活跃停机模式):时钟关闭、外设关闭、RTC开启。通过RTC中断、外部中断、复位,能退出本模式。
3)Halt(停机模式)(功耗最低):时钟关闭、外设关闭。通过外部中断、复位,能退出本模式。
另外,上图同时说明了默认上电时是运行模式,在运行模式时可通过如下方法降低功耗:
1)降低时钟频率。
2)关闭没用的外设时钟。
3)(香瓜补充)无用的IO口配置为输出低。
3、进入低功耗模式与低功耗唤醒的流程是如何的?
答:
1)进入低功耗模式的流程
①关闭外设时钟。
②所有IO设置为输出低(注意低电平使能的得设置为输出高)。
③初始化中断口的IO。
④时钟频率降至最低(2M)。
⑤打开中断总开关。
⑥调用停机模式的函数。
2)低功耗唤醒的流程
①初始化系统时钟。
②初始化用到的外设。
五、实验前提
在进行本文步骤前,请先阅读并实现以下博文:
1、《STM8L之红外发射(PWM产生38K信号)》:http://blog.csdn.net/feilusia/article/details/53417291
2、《STM8L之定时器3的精确延时》:http://blog.csdn.net/feilusia/article/details/53407818
4、《STM8L之按键中断》:http://blog.csdn.net/feilusia/article/details/53372929
六、实验步骤
1、工程中添加自己写的低功耗的驱动
1)写一个驱动GUA_LowPowerConsumption.c(存放在工程的USER文件夹中)
//******************************************************************************
//name: GUA_LowPowerConsumption.c
//introduce: 低功耗驱动
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜单片机之STM8/STM32(164311667)
//changetime: 2016.12.06
//******************************************************************************
#include "stm8l10x.h"
#include "GUA_LowPowerConsumption.h"#include "GUA_Key.h"
#include "GUA_Key_2.h"
#include "GUA_Timer2_PWM.h"
#include "GUA_Timer3.h"
#include "GUA_Clk.h"
/*********************宏定义************************/
#ifndef U8
typedef unsigned char U8;
#endif #ifndef U16
typedef unsigned short U16;
#endif #ifndef U32
typedef unsigned long U32;
#endif /*********************内部变量************************/
static u8 sGUA_LowPowerConsumption_State = GUA_LOW_POWER_CONSUMPTION_STATE_HALT; /*********************内部函数声明************************/
static void GUA_LowPowerConsumption_Halt_Peripheral(void);
static void GUA_LowPowerConsumption_Halt_GPIO_Default(void);
static void GUA_LowPowerConsumption_Halt_GPIO_Interrupt(void);
static void GUA_LowPowerConsumption_Halt_InterruptSwitchOn(void);
static void GUA_LowPowerConsumption_Halt_Enable(void);static void GUA_LowPowerConsumption_Active_Clk(void);
static void GUA_LowPowerConsumption_Active_Peripheral(void);//******************************************************************************
//name: GUA_LowPowerConsumption_Halt_PeripheralCLK
//introduce: 关闭外设时钟
//parameter: none
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜单片机之STM8/STM32(164311667)
//changetime: 2016.12.06
//******************************************************************************
static void GUA_LowPowerConsumption_Halt_Peripheral(void)
{//时钟失能CLK_PeripheralClockConfig(CLK_Peripheral_TIM2, DISABLE);CLK_PeripheralClockConfig(CLK_Peripheral_TIM3, DISABLE);CLK_PeripheralClockConfig(CLK_Peripheral_TIM4, DISABLE);CLK_PeripheralClockConfig(CLK_Peripheral_I2C, DISABLE);CLK_PeripheralClockConfig(CLK_Peripheral_SPI, DISABLE);CLK_PeripheralClockConfig(CLK_Peripheral_USART, DISABLE);CLK_PeripheralClockConfig(CLK_Peripheral_AWU, DISABLE);
}//******************************************************************************
//name: GUA_LowPowerConsumption_Halt_GPIO_Default
//introduce: 所有IO口设置为输出低(注意低电平使能的得设置为输出高)
//parameter: none
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜单片机之STM8/STM32(164311667)
//changetime: 2016.12.06
//******************************************************************************
static void GUA_LowPowerConsumption_Halt_GPIO_Default(void)
{//IO配置为输出GPIO_Init(GPIOA, GPIO_Pin_2 | GPIO_Pin_3, GPIO_Mode_Out_PP_High_Fast); GPIO_Init(GPIOB, GPIO_Pin_0 | GPIO_Pin_1 |GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 |GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7, GPIO_Mode_Out_PP_High_Fast); GPIO_Init(GPIOC, GPIO_Pin_0 | GPIO_Pin_1 |GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4, GPIO_Mode_Out_PP_High_Fast); //IO配置为输出低(注意低电平使能的得设置为输出高)GPIO_WriteBit(GPIOA, GPIO_Pin_2 | GPIO_Pin_3, RESET);GPIO_WriteBit(GPIOB, GPIO_Pin_0 | GPIO_Pin_1 |GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 |GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7, RESET); GPIO_WriteBit(GPIOC, GPIO_Pin_0 | GPIO_Pin_1 |GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4, RESET);
}//******************************************************************************
//name: GUA_LowPowerConsumption_Halt_GPIO_Interrupt
//introduce: 初始化中断口的IO
//parameter: none
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜单片机之STM8/STM32(164311667)
//changetime: 2016.12.06
//******************************************************************************
static void GUA_LowPowerConsumption_Halt_GPIO_Interrupt(void)
{//按键初始化GUA_Key_Init();//按键2初始化GUA_Key_2_Init();
}//******************************************************************************
//name: GUA_LowPowerConsumption_Halt_Clk
//introduce: 时钟配置为2M
//parameter: none
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜单片机之STM8/STM32(164311667)
//changetime: 2016.12.06
//******************************************************************************
static void GUA_LowPowerConsumption_Halt_Clk(void)
{//寄存器重置 CLK_DeInit(); //时钟8分频,2MHzCLK_MasterPrescalerConfig(CLK_MasterPrescaler_HSIDiv8);
}//******************************************************************************
//name: GUA_LowPowerConsumption_Halt_InterruptSwitchOn
//introduce: 打开中断总开关
//parameter: none
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜单片机之STM8/STM32(164311667)
//changetime: 2016.12.06
//******************************************************************************
static void GUA_LowPowerConsumption_Halt_InterruptSwitchOn(void)
{//开全局中断 asm("rim");
}//******************************************************************************
//name: GUA_LowPowerConsumption_Halt_Enable
//introduce: 进入停机模式
//parameter: none
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜单片机之STM8/STM32(164311667)
//changetime: 2016.12.06
//******************************************************************************
static void GUA_LowPowerConsumption_Halt_Enable(void)
{//进入停机模式halt();
}//******************************************************************************
//name: GUA_LowPowerConsumption_Active_Clk
//introduce: 初始化时钟
//parameter: none
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜单片机之STM8/STM32(164311667)
//changetime: 2016.12.06
//******************************************************************************
static void GUA_LowPowerConsumption_Active_Clk(void)
{//晶振初始化GUA_CLK_Init();
}//******************************************************************************
//name: GUA_LowPowerConsumption_Active_Peripheral
//introduce: 初始化外设
//parameter: none
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜单片机之STM8/STM32(164311667)
//changetime: 2016.12.06
//******************************************************************************
static void GUA_LowPowerConsumption_Active_Peripheral(void)
{//定时器2的PWM初始化GUA_Timer2_PWM_Init(); //定时器3的初始化GUA_Timer3_Init();
}//******************************************************************************
//name: GUA_LowPowerConsumption_Get
//introduce: 低功耗读取状态函数
//parameter: none
//return: GUA_LOW_POWER_CONSUMPTION_STATE_ENABLE or GUA_LOW_POWER_CONSUMPTION_STATE_DISABLE
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜单片机之STM8/STM32(164311667)
//changetime: 2016.12.06
//******************************************************************************
U8 GUA_LowPowerConsumption_Get(void)
{return sGUA_LowPowerConsumption_State;
}//******************************************************************************
//name: GUA_LowPowerConsumption_Set
//introduce: 低功耗设置状态函数
//parameter: nGUA_LowPowerConsumption_State: GUA_LOW_POWER_CONSUMPTION_STATE_ENABLE or GUA_LOW_POWER_CONSUMPTION_STATE_DISABLE
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜单片机之STM8/STM32(164311667)
//changetime: 2016.12.06
//******************************************************************************
void GUA_LowPowerConsumption_Set(U8 nGUA_LowPowerConsumption_State)
{sGUA_LowPowerConsumption_State = nGUA_LowPowerConsumption_State;
}//******************************************************************************
//name: GUA_LowPowerConsumption_Cmd
//introduce: 低功耗控制函数
//parameter: nGUA_LowPowerConsumption_State: GUA_LOW_POWER_CONSUMPTION_STATE_ENABLE or GUA_LOW_POWER_CONSUMPTION_STATE_DISABLE
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜单片机之STM8/STM32(164311667)
//changetime: 2016.12.06
//******************************************************************************
void GUA_LowPowerConsumption_Cmd(U8 nGUA_LowPowerConsumption_State)
{//开启低功耗if(nGUA_LowPowerConsumption_State == GUA_LOW_POWER_CONSUMPTION_STATE_HALT){//关闭外设时钟GUA_LowPowerConsumption_Halt_Peripheral();//所有IO口设置为输出低(注意低电平使能的得设置为输出高)GUA_LowPowerConsumption_Halt_GPIO_Default();//初始化中断口的IOGUA_LowPowerConsumption_Halt_GPIO_Interrupt();//时钟配置为2MGUA_LowPowerConsumption_Halt_Clk();//打开中断总开关GUA_LowPowerConsumption_Halt_InterruptSwitchOn(); //置位标志位GUA_LowPowerConsumption_Set(GUA_LOW_POWER_CONSUMPTION_STATE_HALT); //进入停机模式GUA_LowPowerConsumption_Halt_Enable(); /*******************************************************************///初始化时钟GUA_LowPowerConsumption_Active_Clk();//初始化外设GUA_LowPowerConsumption_Active_Peripheral();//置位标志位GUA_LowPowerConsumption_Set(GUA_LOW_POWER_CONSUMPTION_STATE_ACTIVE); }//关闭低功耗else{}
}
2)写一个驱动头文件GUA_LowPowerConsumption.h(存放在工程的USER文件夹中)
//******************************************************************************
//name: GUA_LowPowerConsumption.h
//introduce: 低功耗驱动的头文件
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜单片机之STM8/STM32(164311667)
//changetime: 2016.12.06
//******************************************************************************
#ifndef _GUA_LOW_POWER_CONSUMPTION_H_
#define _GUA_LOW_POWER_CONSUMPTION_H_/*********************宏定义************************/
//低功耗控制宏
#define GUA_LOW_POWER_CONSUMPTION_STATE_HALT 0
#define GUA_LOW_POWER_CONSUMPTION_STATE_ACTIVE 1/*********************外部函数声明************************/
unsigned char GUA_LowPowerConsumption_Get(void);
void GUA_LowPowerConsumption_Set(unsigned char nGUA_LowPowerConsumption_State);
void GUA_LowPowerConsumption_Cmd(unsigned char nGUA_LowPowerConsumption_State);#endif
3)工程中添加 GUA_LowPowerConsumption .c
4)添加驱动的路径
$PROJ_DIR$\..\USER
注意USER文件夹是与“Project”等文件夹同级的自定义文件,用于存放香瓜写的代码。
2、应用层中调用
1)main.c
//******************************************************************************
//name: main.c
//introduce: 主函数
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜单片机之STM8/STM32(164311667)
//changetime: 2016.12.06
//******************************************************************************
#include "stm8l10x.h"
#include "main.h"
#include "GUA_Key.h"
#include "GUA_Key_2.h"
#include "GUA_Timer2_PWM.h"
#include "GUA_Infrared_Send.h"
#include "GUA_Timer3.h"
#include "GUA_Clk.h"
#include "GUA_LowPowerConsumption.h"/*********************宏定义************************/
#ifndef U8
typedef unsigned char U8;
#endif #ifndef U16
typedef unsigned short U16;
#endif #ifndef U32
typedef unsigned long U32;
#endif #ifndef int32
typedef signed long int32;
#endif
/*********************外部变量************************/
U8 gGUA_Function = 0; //功能码/*********************内部函数声明************************/
static void GUA_Init(void);
//******************************************************************************
//name: GUA_TEST
//introduce: 测试
//parameter: none
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜单片机之STM8/STM32(164311667)
//changetime: 2016.12.06
//******************************************************************************
static void GUA_TEST(void)
{ }//******************************************************************************
//name: GUA_Init
//introduce: 初始化
//parameter: none
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜单片机之STM8/STM32(164311667)
//changetime: 2016.12.06
//******************************************************************************
static void GUA_Init(void)
{//关全局中断 asm("sim"); //晶振初始化GUA_CLK_Init();//按键初始化GUA_Key_Init();//按键2初始化GUA_Key_2_Init();//定时器2的PWM初始化GUA_Timer2_PWM_Init(); //定时器3的初始化GUA_Timer3_Init(); //开全局中断 asm("rim");
}//******************************************************************************
//name: main
//introduce: 主函数
//parameter: none
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜单片机之STM8/STM32(164311667)
//changetime: 2016.12.06
//******************************************************************************
void main(void)
{//初始化//GUA_Init(); //测试//GUA_TEST();while(1){switch(gGUA_Function){//空闲case FUNC_IDLE_EVENT: { //低功耗模式if(GUA_LowPowerConsumption_Get() == GUA_LOW_POWER_CONSUMPTION_STATE_HALT){GUA_LowPowerConsumption_Cmd(GUA_LOW_POWER_CONSUMPTION_STATE_HALT);}//正常模式else{GUA_LowPowerConsumption_Cmd(GUA_LOW_POWER_CONSUMPTION_STATE_ACTIVE); }break; }//短按键处理case FUNC_GUA_KEY_SHORT_EVENT: {//发送红外键值GUA_Infrared_Send(0x00FF00FF); //置位低功耗标志位GUA_LowPowerConsumption_Set(GUA_LOW_POWER_CONSUMPTION_STATE_HALT); //返回空闲状态gGUA_Function = FUNC_IDLE_EVENT; break; } //短按键2处理case FUNC_GUA_KEY2_SHORT_EVENT: {//发送红外键值GUA_Infrared_Send(0x00FF02FD); //置位低功耗标志位GUA_LowPowerConsumption_Set(GUA_LOW_POWER_CONSUMPTION_STATE_HALT); //返回空闲状态gGUA_Function = FUNC_IDLE_EVENT; break; } //其他default: {//返回空闲状态gGUA_Function = FUNC_IDLE_EVENT; break; } } }
}
2)main.h
//******************************************************************************
//name: main.h
//introduce: 主函数的头文件
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//QQ group 香瓜单片机之STM8/STM32(164311667)
//changetime: 2016.12.06
//******************************************************************************
#ifndef _MAIN_H_
#define _MAIN_H_/*********************宏定义************************/
//主轮询的宏
#define FUNC_IDLE_EVENT 0x00 //空闲
#define FUNC_GUA_KEY_SHORT_EVENT 0x10 //短按键处理事件
#define FUNC_GUA_KEY_LONG_EVENT 0x11 //长按键处理事件
#define FUNC_GUA_KEY2_SHORT_EVENT 0x12 //短按键2处理事件
#define FUNC_GUA_KEY2_LONG_EVENT 0x13 //长按键2处理事件
/*********************外部变量************************/
extern u8 gGUA_Function; //功能码#endif
七、实验结果
将万用表的电流档串入VCC的跳线中,待机时为1uA~2uA之间跳变。
当按下按键发射红外时,电流值瞬间为1mA~2mA,随后又降低至待机状态。
对比datasheet的数据:“Halt: 0.3 µA、Active-halt: 0.8 µA、Dynamic Run:150 µA/MHz”。
比文档上的略高些,但已实现基本的低功耗。
因此,实验成功。
后续:有群友反馈增加“PWR_UltraLowPowerCmd(ENABLE);”可进一步降低功耗至0.3uA,待香瓜实测,先mark。
【STM8L】STM8L之低功耗模式相关推荐
- STM8L的低功耗模式的配置
低功耗可以说是stm8l系列单片机的核心特色了.假设假设我们有一个温度传感器设备,他处于某种很特殊的地方,只能使用电池,而且我们很难去更换,那么低功耗就显得尤为重要.那么继续假设我们这个温度传感器不需 ...
- STM32低功耗模式下GPIO如何配置最节能?
目录 1.将未使用的GPIO 配置为模拟输入模式 2.调节GPIO 速度 3.GPIO不使用时禁用寄存器时钟 4.避免悬空未使用的引脚 STM32低功耗模式下GPIO如何配置最节能,这里总结了一下四点 ...
- MSP430低功耗模式-while循环失效
如下代码实现MSP430G2553单片机两个led交替闪烁 #include <msp430.h> /*** main.c*/ int main(void) {WDTCTL = WDTPW ...
- STM32开发 -- 低功耗模式详解(2)
如需转载请注明出处:https://juyou.blog.csdn.net/article/details/98631012 上一篇文章 STM32开发 – 低功耗模式详解(1) 简单的总结了一下低功 ...
- STM32开发 -- 低功耗模式详解(1)
如需转载请注明出处:https://juyou.blog.csdn.net/article/details/95364296 很多单片机都有低功耗模式,STM32 也不例外.当 CPU 不需继续运行时 ...
- MSP430F5529 DriverLib 库函数学习笔记(十三)认识低功耗模式
目录 硬知识 低功耗模式 MSP430单片机各工作模式下的电流消耗 API 进入低功耗模式 退出低功耗模式 平台:Code Composer Studio 10.3.1 MSP430F5529 Lau ...
- 【STM32】【STM32CubeMX】STM32CubeMX的使用之八:低功耗模式及MCU唤醒
文章目录 0.前言 1.低功耗模式简介 2.CubeMX设置 3.软件设计 下载工程文件: https://gitee.com/Joseph_Cooper/stm32-cube-mx-stm3 ...
- STM32低功耗模式测试
stm32单片机低功耗模式共有3种,下来对3种低功耗进行分析测试. 先看手册上相关低功耗资料介绍: 先来分析睡眠模式: 进入睡眠模式比较简单,只需一条指令即可.唤醒睡眠模式,我们使用串口中断来唤醒,通 ...
- 32怎么通过一个按键实现不同工作模式_stm32几种低功耗模式的实现和差别
点击上方蓝字关注我哦- 01 前言 按功耗由高到低排列,STM32具有运行.睡眠.停止和待机四种工作模式.上电复位后 STM32 处于运行状态,当内核不需要继续运行,就可以选择进入后面的三种低功耗模式 ...
最新文章
- 【MASHIII调制器】MASHIII调制器的Simulink建模与仿真
- java 最大线程数 设定_Java8 parallelStream 修改默认的线程数量
- http 二进制_百度云加速科普小课堂-HTTP/2解析
- [Unity] Unity3D研究院编辑器之自定义默认资源的Inspector面板
- python 基础 集合
- zuul网关_Spring Cloud第五章:服务网关Zuul
- 【R语言实验】基于R语言的时间序列平稳性检验
- 蓝桥杯练习 分解质因数
- uniapp 页面滚动获取元素高度
- 推荐一个开源的 .NET 二维码生成库
- 即将2023年了,我好想念那些2022年离职的兄弟
- 【硬件运维●倚天剑】IPMITOOL解决服务器底层维护难题
- java中输入字符串并输入每个汉字的ASC码
- 暴笑口误2007贺岁版出炉喽!!(转载)
- 县级层面深入“最多跑一次”改革的成功实践
- 企业隐患排查文本挖掘比赛(二):算法篇(从词向量到BERT)
- Python性能优化指南--让你的Python代码快x3倍的秘诀
- python对视频中美女下半身大长腿进行识别,小心脏受不了的千万别看!
- 解决俄罗斯Lopatkin精简版Win10无法远程的问题及同类精简版系统无法远程问题
- 论文梳理:3D ultrasound computer tomography: Hardware setup, reconstruction
热门文章
- 【MySQL】Innodb存储引擎逻辑存储结构与底层实现解析(MySQL专栏启动)
- 如何简单轻松的把360度VR全景图做成视频?
- php小程序开发实例,微信小程序全局配置开发实例
- c51语言的printf,KeilC51中的库函数printf
- SD155非接触五维位移监测仪应用建筑物监测 大坝监测 滑坡监测 桥梁监测 地表监测 墙裂监测
- html期末设计——电影我不是药神响应式页播(4页) HTML+CSS+JavaScript 大学生电影网页作品 影视网页设计作业模板 =
- php 转化为英文月份,php怎么实现月份数字转英文
- 服务器没有plugin文件,服务器上安装插件
- 3配置的笔记本能不能运行博图v15_给大学生的笔记本电脑推荐
- 北理工计算机流程图,北京理工大学:用“286”电脑,为北京亚运会上做出世界先进“信息系统”...