您的位置:首页 > 其它

STM8S的HALT模式与AWU唤醒

2014-01-02 09:13 267 查看
/*

**********************************************************************************************************************************

* Name    : STM8S的HALT模式与AWU唤醒

* Author  : MingMing

* Release : 2014/1/2

* Update  : 2014/1/2

* E-mail  : clint.wang@foxmail.com

**********************************************************************************************************************************

*/
HALT模式

    为了降低功耗,STM8ST提供了三种低功耗模式:分别是等待模式(执行WFI指令)、停机模式(执行HALT命令)和活跃停机模式(先使能AWU再执行HALT命令)。处于等待模式时外设和中断管理器还在运行,并不是最低功耗,只要有中断的产生,芯片就会被唤醒。处于停机模式下时,外设等都被关闭,芯片处于最低的功耗,只有外部中断和外中断才能将其唤醒。处于活跃停机模式时,相比停机模式而言,AWU和IWDG处于激活状态,芯片也可以由AWU唤醒。

    在IAR的intrinsics.h文件中定义STM8S的命令如下:

__intrinsic void__enable_interrupt(void);     /* RIM */
__intrinsic void __disable_interrupt(void);   /* SIM */
__intrinsic void __no_operation(void);        /* NOP */
__intrinsic void __halt(void);                /* HALT */
__intrinsic void__wait_for_interrupt(void);   /* WFI */


    在其它的开发环境环境可能存在差异,那么可以使用下面的定义:

#define   __halt()    asm("halt")
#define   __nop()     asm("nop")
#define   __rim()     asm("rim)
#define   __sim()     asm("sim")
#define   __sim()     asm("wfi")

    将HALT命令添加到主函数中:

int main(void)
{
INT8U  mainLoop = 1;                        /* 主循环执行调节 */
LED_Init();                                 /* 初始化LED的管脚 */
__enable_interrupt();                       /* 开总中断 */
__halt();                                   /* 停机命令*/
while(mainLoop)
{
LED_TurnOn();                             /* 如果芯片已进入停机模式,LED不亮 */
}
return 0;
}

AWU唤醒

    根据上面的操作,可以让STM8S进入停机模式,接下来我们考虑如何将它从停机模式唤醒。我们有两种方法:一种是采用外部中断和外设中断,另一种是将停机模式过渡到活跃停机模式,然后采用AWU唤醒机制。AWU的代码如下:

/**************************************** stm8s_awu.c ******************************************/
void AWU_Init(void)
{
AWU_CSR1 |= MASK_AWU_CSR1_AWUF;             /* AWU自动唤醒中断标志位被使能 */
AWU_CSR1 &=~MASK_AWU_CSR1_AWUEN;            /* 自动唤醒功能被禁止 */
AWU_CSR1 &=~MASK_AWU_CSR1_MSR;              /* 测量被禁止 */
AWU_APR = 0x3E;                             /* 时钟为LSI的64分频 */
AWU_TBR = 0x0B;                             /* 时基选择,512ms唤醒一次 */
CLK_PCKENR2 |= (0x04);                      /* AWU与主时钟连接 */
CLK_ICKR |= MASK_CLK_ICKR_LSIEN;            /* 打开内部低速时钟源 */
while(CLK_ICKR_LSIRDY == 0);                /* 等待时钟源信号稳定 */
}
void AWU_Enable(void)
{
AWU_CSR1 |= MASK_AWU_CSR1_AWUEN;            /* 自动唤醒功能被使能 */
}
void AWU_Disenable(void)
{
AWU_CSR1 &=~MASK_AWU_CSR1_AWUEN;            /* 自动唤醒功能被禁止 */
}
#pragma vector = AWU_vector
__interrupt void AWU_ISR(void)
{
AWU_CSR1 = AWU_CSR1;                        /* 清除更新中断标志位 */
}
/*******************************************  end **********************************************/
    写好AWU的代码后,在主函数中加入调用如下:
int main(void)
{
INT8U  mainLoop = 1;                        /* 主循环执行调节 */
LED_Init();                                 /* 初始化LED的管脚 */
AWU_Init();                                 /* AWU初始化 */
__enable_interrupt();                       /* 开总中断 */
AWU_Enable();                               /* AWU使能 */
__halt();                                   /* 进入活跃停机模式,LED不亮*/
while(mainLoop)
{
LED_TurnOn();                             /* 被唤醒后,LED亮 */
Delay(50000);
LED_TurnOff();                            /* LED亮一段时间后关闭 */
__halt();                                 /* 再次进入活跃停机模式,等待唤醒 */
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  STM8S HALT模式 AWU唤醒