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的命令如下:
在其它的开发环境环境可能存在差异,那么可以使用下面的定义:
将HALT命令添加到主函数中:
AWU唤醒
根据上面的操作,可以让STM8S进入停机模式,接下来我们考虑如何将它从停机模式唤醒。我们有两种方法:一种是采用外部中断和外设中断,另一种是将停机模式过渡到活跃停机模式,然后采用AWU唤醒机制。AWU的代码如下:
**********************************************************************************************************************************
* 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唤醒
- STM8S_006_AWU自动唤醒
- STM8S---电源功耗管理之停机模式(halt)实现
- STM8S使用AWU无法唤醒的问题的解决过程
- stm8l051 halt之后外部中断唤醒问题
- android 设备在设置节能模式的情况下 调用 Toast 会 唤醒屏幕 突然变亮
- STM32F030使用RTC周期性唤醒STOP模式
- STM32学习笔记(九) 外部中断,待机模式和事件唤醒
- 使用stm32L151C8T6芯片,用rtc唤醒低功耗,三种模式详细介绍,并付代码。
- 【程序】STM32L476RG实现在STOP2模式下使用LPTIM,5秒钟从STOP2唤醒
- 怎样才能从外部将AT90S1200从掉电模式下唤醒?
- 多线程等待唤醒机制之生产消费者模式
- 64位Ubuntu kylin 16.04 安装laptop mode解决关闭盖子无法唤醒,并解决安装此模式后鼠标间歇断电
- f4的待机模式和唤醒代码
- stm32从停止模式唤醒到系统稳定需要多少时间
- STM32学习笔记(九) 外部中断,待机模式和事件唤醒
- Win10手机阿尔卡特Idol 4S“双击屏幕唤醒”“手套模式”曝光
- STM32使用标准库,有时候在SLEEP模式下无法唤醒问题
- 三种方法教你开启/关闭win10系统唤醒睡眠模式时需要登录的教程
- stm32各种低功耗模式以及唤醒方式