历史上的今天
返回首页

历史上的今天

今天是:2025年04月13日(星期日)

正在发生

2018年04月13日 | STM8S---电源功耗管理之停机模式(halt)实现

2018-04-13 来源:eefocus

主要内容简介

  • 影响功耗的主要因素

  • 电源系统

  • 时钟管理

  • 运行模式和低功耗模式 

    • 运行模式

    • 等待模式

    • 活跃停机模式

    • 停机模式

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

  • 功耗管理要点

要点摘要

四种模式

  停机模式(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 */

};


推荐阅读

史海拾趣

H&D Wireless公司的发展小趣事

高创科技起源于1987年的以色列,最初是一家专注于直驱运动控制驱动器开发的厂商。在以色列的三十多年里,高创积累了丰富的软件算法技术,特别是在运动控制领域形成了独特优势。这种积累不仅体现在其产品的稳定性和高性能上,更为后续的技术创新和市场拓展奠定了坚实基础。

天二科技(EVER OHMS)公司的发展小趣事

2004年,天二科技迈出了全球化布局的重要一步,在全球范围内建立了销售和技术支持网络。同年,公司在中国大陆成立了分公司,进一步加深了与中国市场的联系。通过全球化布局,天二科技不仅成功拓展了海外市场,还积累了丰富的国际经验,为公司未来的发展提供了有力支持。

Anaren Ceramics公司的发展小趣事

为了确保产品质量的稳定性和可靠性,Anaren Ceramics公司建立了一套完善的质量管理体系。公司严格按照国际标准进行生产和管理,从原材料的采购到产品的出厂,每一个环节都经过严格的检测和把控。这种对质量的严格把控不仅赢得了客户的信任,也为公司在电子行业中树立了良好的口碑。

EDO Corp公司的发展小趣事

进入1950年代,Eclipse Magnetics迎来了一次重要的创新。公司决定将磁铁涂上红色,这一独特的红色磁铁迅速在市场上获得了认可。同时,公司还设计了与红色磁铁相配的马蹄形标志,这一标志后来成为Eclipse Magnetics的国际通用标记。随着品牌的国际化,Eclipse Magnetics的产品开始进入全球市场。

FINECHIPS公司的发展小趣事

FINECHIPS公司始终坚持客户导向的经营理念,深入了解客户需求,提供定制化的产品和服务。在一次与某知名电子产品制造商的合作中,FINECHIPS根据客户的特殊需求,迅速调整产品设计和生产流程,成功开发出了一款符合客户要求的定制化芯片。这次合作不仅加深了双方的合作关系,还为FINECHIPS赢得了更多潜在客户的信任和青睐。

American Technical Ceramics (ATC)公司的发展小趣事

FINECHIPS公司深知人才是企业发展的根本。公司注重人才培养和团队建设,建立了完善的人才培养和激励机制。公司定期举办技术培训和交流活动,提升员工的专业技能和综合素质。同时,FINECHIPS还积极引进国内外优秀人才,为公司的发展注入新的活力和动力。这些努力不仅提升了公司的技术实力和市场竞争力,还为公司的长期发展奠定了坚实的基础。

请注意,以上故事是基于假设和一般行业情况构建的,并非FINECHIPS公司的实际历史。如需了解FINECHIPS公司的真实发展历程和故事,建议直接访问公司官网或查阅相关新闻报道和资料。

问答坊 | AI 解惑

医疗电子设备的接地系统

接地对任何设备都至关重要,咱们一起来看看医疗设备的接地系统。 …

查看全部问答>

本科毕业设计要求论文翻译,求一篇适合翻译的英文论文

导师说要我自己去找。 要求是关于FPGA的,或者DS18b20的文章也可以! 然而我以前收藏的资料中,都觉得不太适合。 因为这论文篇幅不能太长,最好能控制在5页上下。 具有一定可读性,不要全是公式什么的,呵呵! 所以我来求助了!!! 望有 ...…

查看全部问答>

【求助】怎么将AMR2410自带的TFT液晶屏换成单片机上的圆形点阵液晶屏?

  因为开发板上的液晶屏长宽比列不合用,因此想把液晶屏换成单片机上用的那种圆形点阵液晶屏。我的目的是想让液晶屏显示我在开发板上移植的QT程序,开发板上是有操作系统的,哪位高手能指点下呢?…

查看全部问答>

关于天津索思的WT-900型表

以前公司进了几块天津索思的WT-900型表。现在表有点不准,听别人说900型有工厂模式,可以通过工厂模式来调。 请问各位,有谁知道怎么进入工厂模式?谢谢 …

查看全部问答>

求助!信号问题

怎么样用单片机采集正弦信号的幅值和频率!小弟做一个多参数测试仪,要求给一个正弦信号,采集它的幅值和频率。…

查看全部问答>

图象处理算法

用摄相头拍出一件物品的照片,如何用计算机程序计算出它是否为一个标准的矩形…

查看全部问答>

FPGA 与DSP,ARM总线数据交换需要注意的关键点!

 FPGA 中文意思现场可编程门阵列,以逻辑资源多,D触发器多,可以完成各种同步与异步时序电路设计.DSP,ARM 数据总线与FPGA进行数据交换,涉及到两个不同时钟的逻辑时序电路.对于两个异步时钟时序电路设计,常用的设计方法就是RAM 或FIFO 进行数据存 ...…

查看全部问答>

UARTDMA的疑惑

                                 STM32的DMA是个好东西,AD和Uart发送用起来很爽,但是我在想,如果用DMA做UART的接收,情况就有点麻烦,如果全双工 ...…

查看全部问答>

LM3S811学习进行中问题不断

各位朋友我看了几天的资料,我终于下定决心弄一弄我的小lm3s811开发板了,但是遇到了一些问题, 1.我的keil建立工程为什么不显示工程名字呢,我起的工程名为lm3s811可是显示的是这样的 2.即使我不自己建立工程,我把从网上网友分享的文件打开, ...…

查看全部问答>

台湾高级版DDR3内存测试软件

DDR3 内存条、IC颗粒 台湾工厂级内存测试维修系统     DDR3 内存测试维修系统 一、价格:18000元。 二、包装附件:两个测试系统硬盘,一个服务器启动卡,一个终端测试卡,两个网卡,两颗终端网卡启动芯片。 三、客户自备服务器 ...…

查看全部问答>