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

官方资料

??可以去网络搜索中文版,或者到官方网站上去下载英文版。

??英文:

??译文:

主要内容简介

  • 影响功耗的主要因素
  • 电源系统
  • 时钟管理
  • 运行模式和低功耗模式
    • 运行模式
    • 等待模式
    • 活跃停机模式
    • 停机模式
  • 功耗与唤醒事件的测量与结果
  • 功耗管理要点

要点摘要

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

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

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

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

测试程序

main.c
/*
Function:   电源管理:停机(Halt)模式测试,没有进入停机模式前,四个LED
                    灯是每隔1秒钟亮灭一次的,超过10秒后,自动进入停机mode,
                    然后可以通过外部中断来唤醒停机,此时程序从停机位置
                    处继续往下运行。
Date        :   2015年7月21日
Note        :   STVD + COSMIC
Author  :   yicm
Version :   0.0.9
*/
#include<stm8s003f3p.h>

/*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
/*  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 */
};

版权声明:本文为博主[原创]文章,未经博主允许可以转载,注明博客出处:[http://blog.csdn.net/FreeApe]

时间: 2024-10-16 23:53:30

STM8S---电源功耗管理之停机模式(halt)实现的相关文章

SylixOS电源管理之外设功耗管理

1.前言 在这个世界中,任何系统的运转都需要能量.如树木依靠光能生长,如马儿依靠食物奔跑,如计算机系统依靠电能运行.而能量的获取是有成本的,因此如果能在保证系统运转的基础上,尽量节省对能量的消耗,就会大大提升该系统的生存竞争力.这方面,大自然已经做的很好了,如植物的落叶,如动物的冬眠,等等.而在计算机的世界里称作电源管理(Power Management). 本篇以运行SylixOS的mini2440嵌入式平台为例,分析SylixOS电源管理的外设功耗管理部分. 2.电源管理系统框架 Sylix

第22章 RTX 低功耗之停机模式

STM32F103 停机模式介绍 本章节我们主要讲解停机模式,停机模式是在 Cortex?-M3 的深睡眠模式基础上结合了外设的时钟控制机制,在停止模式下电压调节器可运行在正常或低功耗模式.此时在 1.8V 供电区域的的所有时钟都被停止, PLL. HSI 和 HSE RC 振荡器的功能被禁止, SRAM 和寄存器内容被保留下来.在停止模式下,所有的 I/O 引脚都保持它们在运行模式时的状态. STM32F103 如何进入停机模式在 RTX 系统中,让 STM32 进入停机模式比较容易,调用固件

PHPWAMP站点管理的“域名模式”和“端口模式”详解、均支持自定义

友情提示:在服务器使用PHPWAMP,环境设置完毕后请关闭phpwamp软件,PHPWAMP分为软件界面运行和服务运行,需要操作环境时才打开PHPWAMP软件界面,平时可以全程关闭软件,phpwamp网站环境一旦正常运行,就没有必要打开phpwamp了,建议关掉phpwamp节省内存(其他一切不需要的程序也全部关掉节省内存),剩下的就交由phpwamp服务去维持环境的运行,重启服务器也会自动运行网站,无需其他设置. 如果你想使用Apache服务器,建议优先使用Apache2.4站点管理,不推荐A

Linux 7个运行级别(0:关机,停机模式、1:单用户模式、2:多用户模式、3:完整的多用户文本模式、4:系统未使用,保留一般不用、5:图形化模式、6:重启模式)、重置root密码方法

init是Linux系统操作中不可缺少的程序之一.init进程,它是一个由内核启动的用户级进程.内核会在过去曾使用过init的几个地方查找它,它的正确位置(对Linux系统来说)是/sbin/init.如果内核找不到init,它就会试着运行/bin/sh,如果运行失败,系统的启动也会失败. Linux 7个运行级别(0:关机,停机模式.1:单用户模式.2:多用户模式.3:完整的多用户文本模式.4:系统未使用,保留一般不用.5:图形化模式.6:重启模式),运行级就是操作系统当前正在运行的功能级别.

STM32的停机模式与唤醒

HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_DMA_Init(); MX_ADC_Init(); MX_LPUART1_UART_Init(); MX_USART1_UART_Init(); MX_RTC_Init(); WorkFinished=0;//工作没有完成 while(1) { LED1_ON; LED2_ON; LED3_ON;HAL_Delay (500); printf ("Before Stop \r\n"

027-应用管理之MVC模式-iOS笔记

学习目标 1.[理解]九宫格坐标计算 2.[理解]应用添加子控件 3.[理解]应用子控件添加数据 4.[理解]字典转模型 5.[掌握]xib初体验 6.[理解]初识MVC设计模式 7.[理解]根据MVC模式封装我们的应用 一.九宫格坐标计算 实现以九宫格的形式展示应用信息,点击按钮后能监听按钮单击事件.类似这种类型app往往都是动态加载应用数据,所以我们不可能将数据写死,因为我们不确定应用数量,所以就无法确认控件的数量.最终效果图如下: 界面分析: 一个控件需要显示在界面上,必须为其设置fram

weblogic管理3 - 生产模式下免密码管理配置

admin server免密码配置 >1.  生产模式中admin root目录下是否存在security/boot.properties文件 [[email protected] AdminServer]$ pwd/home/weblogic/Oracle/Middleware/user_projects/domains/base_domain/servers/AdminServer[[email protected] AdminServer]$ lltotal 16drwxr-----. 3

【Spark01】SparkSubmit兼谈Spark集群管理和部署模式

关于Cluster Manager和Deploy Mode的组合在SparkSubmit.scala的createLaunchEnv中有比较详细的逻辑. Cluster Manager基本上有Standalone,YARN和Mesos三种情况,说明Cluster Manager用来指明集群的资源管理器.这就是说不管是Client还是Cluster部署方式(deployMode的两种可能),都会使用它们做集 群管理器,也就是说Client也是一种集群部署方式??? /** * @return a

防火墙(ASA)高级配置之URL过滤、日志管理、透明模式

对于防火墙产品来说,最重要的一个功能就是对事件进行日志记录.本篇博客将介绍如何对ASA进行日志管理与分析.ASA透明模式的原理与配置.利用ASA防火墙的IOS特性实施URL过滤. 一.URL过滤 利用ASA防火墙IOS的特性URL过滤可以对访问的网站域名进行控制,从而达到某种管理目的. 实施URL过滤一般分为以下三个步骤: (1)创建class-map(类映射),识别传输流量. (2)创建policy-map(策略映射),关联class-map. (3)应用policy-map到接口上. 案例: