一、简介
本文介绍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
香瓜单片机之STM8/STM32群:164311667
甜甜的大香瓜的小店(淘宝店):https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i
四、基础知识
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
3、《STM8L之timer2产生PWM》:http://blog.csdn.net/feilusia/article/details/53403015
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分频,2MHz
CLK_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();
//初始化中断口的IO
GUA_LowPowerConsumption_Halt_GPIO_Interrupt();
//时钟配置为2M
GUA_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”。
比文档上的略高些,但已实现基本的低功耗。
因此,实验成功。
上一篇:STM8L101+si4463低功耗和自动唤醒配置
下一篇:STM8L低功耗设置
推荐阅读
史海拾趣
在电子产品市场竞争激烈的背景下,Alpha (Taiwan)公司始终坚持品质至上的原则。公司建立了严格的质量管理体系,从原材料采购到生产流程,再到产品出厂,每一个环节都进行严格把控。同时,公司还定期对员工进行品质意识培训,确保每一位员工都能充分认识到品质对于公司发展的重要性。正是凭借这种对品质的执着追求,Alpha (Taiwan)公司的电子产品在市场上赢得了良好的口碑,赢得了众多客户的信赖。
在电子产品市场竞争激烈的背景下,Alpha (Taiwan)公司始终坚持品质至上的原则。公司建立了严格的质量管理体系,从原材料采购到生产流程,再到产品出厂,每一个环节都进行严格把控。同时,公司还定期对员工进行品质意识培训,确保每一位员工都能充分认识到品质对于公司发展的重要性。正是凭借这种对品质的执着追求,Alpha (Taiwan)公司的电子产品在市场上赢得了良好的口碑,赢得了众多客户的信赖。
进入XXXX年代,随着电子技术的飞速发展,Elytone公司意识到技术创新是企业持续发展的关键。公司投入大量资金引进先进设备和研发人才,成功开发出一系列具有竞争力的电子产品。这些产品在市场上获得了良好的口碑,为公司的快速发展奠定了坚实基础。
高通(Qualcomm)在移动通信领域的迅猛发展也离不开CMOS技术的支持。高通在CMOS技术研发方面投入了大量资源,成功地将CMOS技术应用于其移动通信芯片产品中。这些芯片产品以其卓越的性能和出色的功耗控制而广受手机制造商的青睐。随着移动通信技术的不断进步,高通在CMOS技术方面的创新也不断推动着移动通信产业的发展。
英特尔(Intel)作为半导体行业的领军企业,早在上世纪70年代就开始了对CMOS技术的研究。随着技术的不断成熟,英特尔成功地将CMOS技术应用于其处理器产品中,极大地提高了产品的性能和可靠性。英特尔的CMOS处理器因其卓越的性能和出色的功耗控制而广受好评,为公司赢得了大量市场份额。此后,英特尔不断投入巨资进行CMOS技术的研发和创新,使其在全球半导体市场上保持领先地位。
英特尔(Intel)作为半导体行业的领军企业,早在上世纪70年代就开始了对CMOS技术的研究。随着技术的不断成熟,英特尔成功地将CMOS技术应用于其处理器产品中,极大地提高了产品的性能和可靠性。英特尔的CMOS处理器因其卓越的性能和出色的功耗控制而广受好评,为公司赢得了大量市场份额。此后,英特尔不断投入巨资进行CMOS技术的研发和创新,使其在全球半导体市场上保持领先地位。
前面用STM32的GPIO模拟液晶驱动时序时遇到一个问题,就是怎样产生一段较为精确的延时。通常产生一小段延时的方法就是利用一个递增或者递减循环进行软件延时。 例: 我在使用MPLAB IDE进行PIC单片机的开发时,MPLAB提供了一个Watch(跑表) ...… 查看全部问答∨ |
|
南京泰龙特种陶瓷有限公司成立于1992年,是生产特种精密陶瓷的高新技术企业。公司技术力量雄厚、生产工艺完善、 测试手段齐全。2000年引进了国外先进的生产技术,采用等静压干法成型工艺。有φ700mm×2000mm的大型等静压机、3座1750℃的高温窑炉、 ...… 查看全部问答∨ |
|
这个活动中版主已有主要部分:nand驱动、jpeg解码、usb-storage调试,目前需要完成的工作有 1、将以上部分整合 有了vga显示器,各种好玩的东西都可以编程~~~~~版主写了画点,设置光标功能,还可以加入扩展: 2、键盘接口 3、快速画线 4 ...… 查看全部问答∨ |
最近想在270上移植6.0,发现原来5.0的eboot不好用,重新改吧。改串口,改网络,下载打印信息如下: EBoot Loader Configuration: 0) IP address: 172.16.96.28 1) Subnet mask: 255.255.255.0 2) Boot delay: 5 seconds 3) DHCP: (Disabled) ...… 查看全部问答∨ |