STM8S---电源功耗管理之停机模式(halt)实现

发布者:数据舞者最新更新时间:2018-04-13 来源: eefocus关键字:STM8S  电源功耗管理  停机模式 手机看文章 扫描二维码
随时随地手机看文章

主要内容简介

  • 影响功耗的主要因素

  • 电源系统

  • 时钟管理

  • 运行模式和低功耗模式 

    • 运行模式

    • 等待模式

    • 活跃停机模式

    • 停机模式

  • 功耗与唤醒事件的测量与结果

  • 功耗管理要点

要点摘要

四种模式

  停机模式(Halt):此模式下单片机的功耗最低,振荡器,CPU和外设的时钟都被关闭,主电压调压器断电。可用复位或外部中断唤醒,唤醒后之前运行的寄存器数据等都保持不变,且从HALT处继续执行程序。

停机模式下的功耗测量结果(MVR关LPVR开):12

停机模式下的功耗测量结果

运行模式下的功耗测量结果(从RAM运行,不是从Flash开始):12

运行模式下的功耗测量结果

停机模式下的唤醒时间测量结果:12

停机模式下的唤醒时间测量结果

测试程序

/*

Function:   电源管理:停机(Halt)模式测试,没有进入停机模式前,四个LED

                    灯是每隔1秒钟亮灭一次的,超过10秒后,自动进入停机mode,

                    然后可以通过外部中断来唤醒停机,此时程序从停机位置

                    处继续往下运行。

Date        :   2015年7月21日

Note        :   STVD + COSMIC

Author  :   yicm

Version :   0.0.9

*/

#include



/*Output Pin*/

_Bool PA3 @PA_ODR:3;

_Bool PC4 @PC_ODR:4;

_Bool PC5 @PC_ODR:5;

_Bool PC6 @PC_ODR:6;

_Bool PC7 @PC_ODR:7;

/*Input Pin*/

_Bool PC3   @PC_IDR:3;


/*电量指示灯*/

#define LED1    PA3

#define LED2    PC5

#define LED3    PC6

#define LED4    PC7

/*按键指示灯*/

#define LED5    PC4

#define KEY     PC3


/*主时钟频率为8Mhz*/

void Init_CLK(void)

{

    CLK_ICKR |= 0X01;

    CLK_CKDIVR = 0x08;

    while(!(CLK_ICKR&0x02));

    CLK_SWR=0xE1;

}


void Init_GPIO(void)

{

    /*LED 配置为推挽输出*/

    PA_DDR |= 0X08;     //PA3

    PA_CR1 |= 0X08;

    PA_CR2 &= 0XF7;

    /*PC4 -KEY LED*/

    PC_DDR |= 0X10;

    PC_CR1 |= 0X10;

    PC_CR2 &= 0XEF;


    PC_DDR |= 0XE0;     //PC5/6/7

    PC_CR1 |= 0XE0;

    PC_CR2 &= 0X1F;


    LED1 = 1;LED2 = 1;LED3 = 1;LED4 = 1;LED5 = 1;

}


void Init_TIM1(void)

{

    TIM1_IER = 0x00;

    TIM1_CR1 = 0x00;


    TIM1_EGR |= 0x01;

    TIM1_PSCRH = 199/256; // 8M系统时钟经预分频f=fck/(PSCR+1) TIM1 为16位分频器 

    TIM1_PSCRL = 199%256; // PSCR=0x1F3F,f=8M/(0x1F3F+1)=1000Hz,每个计数周期1ms


    TIM1_CNTRH = 0x00;

    TIM1_CNTRL = 0x00;      


    TIM1_ARRH = 400/256;  // 自动重载寄存器ARR=0x01F4=500

    TIM1_ARRL = 400%256;  // 每记数500次产生一次中断,即500ms


    TIM1_CR1 |= 0x81;

    TIM1_IER |= 0x01;

}


/*PC3设置为上拉输入*/

void Init_EXTI2_GPIO(void)

{

    PC_DDR &= 0XF7; 

    PC_CR1 &= 0XF7;

    PC_CR2 |= 0X08;

}


/*上升沿和下降沿促发*/

void Init_EXTI2(void)

{

    EXTI_CR1 |= 0x30;

}


main()

{

    _asm("sim");

    Init_CLK();

    Init_GPIO();

    Init_EXTI2_GPIO();

    Init_EXTI2();

    Init_TIM1();

    _asm("rim");

    while (1);

}


/*外部中断唤醒*/

@far @interrupt void EXTI2_Hand_Fun(void)

{


}


/*定时器中断函数*/

@far @interrupt void TIM1_UPD_OVF_TRG_BRK_IRQHandler(void)

{

    static unsigned int i = 0;

    TIM1_SR1 &=~(0x01);


    ++i;

    if(0 == (i%50))

    {

        LED1 = ~LED1;

        LED2 = ~LED2;

        LED3 = ~LED3;

        LED4 = ~LED4;

    }

    if(i > 1000)

    {

        _asm("halt");

        i = 0;

        LED5 = ~LED5;

    }

}


stm8_interrupt_vector.c

1

2

/*  BASIC INTERRUPT VECTOR TABLE FOR STM8 devices

 *  Copyright (c) 2007 STMicroelectronics

 */


typedef void @far (*interrupt_handler_t)(void);


struct interrupt_vector {

    unsigned char interrupt_instruction;

    interrupt_handler_t interrupt_handler;

};


@far @interrupt void NonHandledInterrupt (void)

{

    /* in order to detect unexpected events during development, 

       it is recommended to set a breakpoint on the following instruction

    */

    return;

}


extern void _stext();     /* startup routine */

extern @far @interrupt void EXTI2_Hand_Fun(void);

extern @far @interrupt void TIM1_UPD_OVF_TRG_BRK_IRQHandler(void);


struct interrupt_vector const _vectab[] = {

    {0x82, (interrupt_handler_t)_stext}, /* reset */

    {0x82, NonHandledInterrupt}, /* trap  */

    {0x82, NonHandledInterrupt}, /* irq0  */

    {0x82, NonHandledInterrupt}, /* irq1  */

    {0x82, NonHandledInterrupt}, /* irq2  */

    {0x82, NonHandledInterrupt}, /* irq3  */

    {0x82, NonHandledInterrupt}, /* irq4  */

    {0x82, EXTI2_Hand_Fun}, /* irq5  */

    {0x82, NonHandledInterrupt}, /* irq6  */

    {0x82, NonHandledInterrupt}, /* irq7  */

    {0x82, NonHandledInterrupt}, /* irq8  */

    {0x82, NonHandledInterrupt}, /* irq9  */

    {0x82, NonHandledInterrupt}, /* irq10 */

    {0x82, TIM1_UPD_OVF_TRG_BRK_IRQHandler}, /* irq11 */

    {0x82, NonHandledInterrupt}, /* irq12 */

    {0x82, NonHandledInterrupt}, /* irq13 */

    {0x82, NonHandledInterrupt}, /* irq14 */

    {0x82, NonHandledInterrupt}, /* irq15 */

    {0x82, NonHandledInterrupt}, /* irq16 */

    {0x82, NonHandledInterrupt}, /* irq17 */

    {0x82, NonHandledInterrupt}, /* irq18 */

    {0x82, NonHandledInterrupt}, /* irq19 */

    {0x82, NonHandledInterrupt}, /* irq20 */

    {0x82, NonHandledInterrupt}, /* irq21 */

    {0x82, NonHandledInterrupt}, /* irq22 */

    {0x82, NonHandledInterrupt}, /* irq23 */

    {0x82, NonHandledInterrupt}, /* irq24 */

    {0x82, NonHandledInterrupt}, /* irq25 */

    {0x82, NonHandledInterrupt}, /* irq26 */

    {0x82, NonHandledInterrupt}, /* irq27 */

    {0x82, NonHandledInterrupt}, /* irq28 */

    {0x82, NonHandledInterrupt}, /* irq29 */

};


关键字:STM8S  电源功耗管理  停机模式 引用地址:STM8S---电源功耗管理之停机模式(halt)实现

上一篇:STM8S---选项字节(Option Byte)写操作之IO复用
下一篇:STM8S---外部中断应用之长按键识别

推荐阅读最新更新时间:2024-03-16 15:59

基于IAR开发环境的STM8S模拟IIC代码
基于IAR STM8 2.10开发环境,STM8S005K6单片机,模拟IIC方式读写AT24C16或AT24C32,已验证可以正常对AT24C32进行读写数据,只是有个疑问,对于单片机接SDA脚的IO口进行方向控制反而引起时序不正常而读写不了数据,例程中是将此IO口始终设置为输出,不知道会不会有隐患,有待测试... 以下是代码,完整代码请下载附件,包含完整工程! #include 24Cxx.h #include stm8s.h #include stm8s_gpio.h #define AT24C32_SETSDAIN GPIO_Init(AT24C32_SDA_PORT, GPIO_PIN_6,
[单片机]
STM8S 长按键识别
最近学习开发STM8S003 MCU,,刚入手这颗MCU,对很多功能不太了解,只能一边开发学习,记录一下学习过程。 目前,需要实现KEY1按键长按3s进行关机,Linux下直接获取按键的开始时间戳和结束时间戳,可以直接确定按键的触发时间,目前MCU采用的是按键中断的方式,在中断触发后直接进入进入中断函数进行处理,根据定时器的特性,现在是采用方法如下: 将Tim1进行16分频,即频率为1Mhz,然后设置ARR(预装载计数器)为60000,即每次产生溢出时间为60ms, RCR(重复计数寄存器)为50,即 50 * 60 = 3000ms = 3s 后产生一个更新事件,而在按键中断函数中,在按键释放后,判断是否由此更新事件表示,
[单片机]
STM8S 独立看门狗配置及使用
//独立看门口的时钟来源 内部低速时钟 128khz 除以2 即64khz //选择 IWDG_Prescaler_128 //64/128 =0.5 khz 2ms周期 #define IWDG_500MS_REST (uint8)250 #define IWDG_400MS_REST (uint8)200 #define IWDG_300MS_REST (uint8)150 #define IWDG_250MS_REST (uint8)125 #define IWDG_200MS_REST (uint8)100 #define IWDG_100MS_REST (uint8)50 #define IWDG_50MS_REST
[单片机]
stm8s 定时器2测量脉冲宽度(单位 us)
void Init_Timer2(void) { GPIO_Init(GPIOA, GPIO_PIN_3, GPIO_MODE_IN_PU_NO_IT);//输入 无中断 TIM2_TimeBaseInit(TIM2_PRESCALER_16,65536-1); //16分频, 65ms 溢出 TIM2_Cmd(ENABLE); } uint16_t TIM2_GetCapture(void) { /* Get the Capture Register value */ uint16_t tmpccr = 0; uint8_t tmpccrl=0, tmpccrh=0; tmpccrh = TIM2- C
[单片机]
stvd+stm8s单片机程序编译报错
编译stm8s程序过程报如下错误: Compiling stm8s_stdperiph_driversrcstm8s_adc2.c... cxstm8 +mods0 +debug -pxp -no -pp -l -istm8s_stdperiph_driverinc -i C:Program Files (x86)COSMICCXSTM8Hstm8 -i C:Program Files (x86)STMicroelectronicsst_toolsetinclude -clDebug -coDebug stm8s_stdperiph_driversrcstm8s_adc2.c #error cpstm8 stm8s_stdp
[单片机]
stm8s: GPIO配置,点亮LED!PB4,PB5引脚LED点不亮
最近两天在做STM8S103的开发,调完硬件后,就开始编写软件了,第一步当然又是点亮LED灯了,结果很尴尬的死活点不亮!后来各种百度,认真查看数据手册,才发现一个很大的坑,由于粗心大意,没有看到,做个笔记,以为备忘。 1、流程 点亮LED,流程跟STM32基本一样: (1)配置GPIO(STM8S不需要专门配置每个引脚的时钟,最开始的时候配置系统时钟即可) (2)GPIO输出高低电平 废话不说,直接上代码: 2、上代码 //FUNCKTION: LED灯GPIO口初始化 //PARA : 无 //RETURN : 无 void LED_Config() { GPIO_Init(GPIOB, GPIO_PIN
[单片机]
<font color='red'>stm8s</font>: GPIO配置,点亮LED!PB4,PB5引脚LED点不亮
STM8S复位总结
STM8S共有9个复位源: NRST引脚产生的外部复位 上电复位(POR) 掉电复位(BOR) 独立看门狗复位 窗口看门狗复位 软件复位 SWIM复位 非法操作码复位 EMS复位:当一些关键的寄存器被破坏或错误加载时产生的复位 所有的复位源最终都作用于NRST管脚,并在复位过程中保持低电平。复位入口向量在内存映射中位于固定的地址6000h。 (图11:STM8 复位电路) 复位电路 复位引脚NRST内部集成了弱上拉电阻RPU,即可作为输入,也可作为开漏输出。一个在复位引脚上宽度最小为500ns的低电平脉冲即可产生一个外部复位。对于复位的检测是异步进行的,因此即使MCU处于停机(H
[单片机]
<font color='red'>STM8S</font>复位总结
基于Intersil的电源管理产品及低功耗设计介绍
  在现在化的便携式产品设计中,一方面我们需要更强的电源来应对产品更新带来的大电流需求,另一方面,工程师们还得注意满足其较高的便携性要求。这要求设计师们既要注意产品电源通路上的转换效率,设计出非常合理的电源管理系统和负载管理系统,同时又要注意到长久的电池运行时间、与多种电源的兼容性、高功率密度、小外形尺寸和有效的热管理等。   Intersil作为业界的低功耗的领军厂家,尤其是在电源管理的低功耗处理上,推出了一系列性能优越的产品,从产品功耗,封装大小,转换效率,芯片热阻,保护电路,EMI/EMC性能,输出电压电流噪声,外部补偿等各方面为用户的便携产品设计提供新思路。   DC/DC   Intersil推出的DC/
[电源管理]
基于Intersil的<font color='red'>电源</font><font color='red'>管理</font>产品及低<font color='red'>功耗</font>设计介绍
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved