/*
**********************************************************************************************************************************
* 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;
}
上一篇:STM8L低功耗HALT模式一些总结
下一篇:STM8L051F3_01_GPIO应用
推荐阅读
史海拾趣
应美女版主邀请,重出江湖,呈上拙作一篇。继续上次的话题微波单片集成电路简介,这次谈一谈MMIC PA 的设计。 PA作为通信系统中关键的的元器件,向来都是模拟工程师必争之地。MMIC PA之所以被如此重视一方面是因为它是T ...… 查看全部问答∨ |
|
我现在的项目是单片机的,而我以前都没学过任何有关单片机的知识,现在边学边做,我想请教下大家,我想把单片机学好,我该学习些什么,我觉得硬件方面暂时不想学,我想深入点学习,有哪些方面的书是必看的呢?有什么好书推荐没?… 查看全部问答∨ |
当依赖关系中没有指明依赖文件时,make工具如何决定是否执行依赖关系中的命令? 比如: all:makedir makedir: mkdir out 当make工具检查目标文件makedir的依赖关系时,发现此依赖关系中没有指时依赖文件.那么make工具到底是继续,还是报错? … 查看全部问答∨ |
Createfile,readfile,writefile,还有deviceiocontrol中的缓冲区到底是什么意思啊? 驱动开发时,我看了很多遍,还是不明白。其实以前文件操作时也用过,就是写文件,读文件。但是用于驱动时我就搞不明白了,这些缓冲和驱动缓冲有什么关系?如:USB驱动中,这些缓冲和端点缓冲是什么关系,这些缓冲起什么作用? 谢谢高人们啊!!!… 查看全部问答∨ |
|
几天前,当SOSO告诉我有童鞋想继续我们的示波器DIY,并已捐款时,我真的很感动,这是真正的热爱者。其实在第一次DIY示波器时,当时有技术问题大家解决不了,我曾请某厂商的相关人员帮忙回答,他的确回答了,但事后在某场合表示了对活动的轻视。这事 ...… 查看全部问答∨ |
关于CMD 的求助 interrupt void ILLEGAL_ISR(void) 这个中断... 朋友们,诚恳求助: 程序本来 一开始就跑 interrupt void ILLEGAL_ISR(void) 这个中断...但我把一个360个点的数组删了 不用了,它就不跑了... 但我需要那个数组...我应该怎么解决 & ...… 查看全部问答∨ |
新唐w78E516D 写入程序后,需要P4.3接地或电源后,程序才能正常启动 两片新唐W78E516D芯片,开始都能通过ISP方式正常写入和执行程序, 后来在某次通过ISP写入程序后,不关机或复位(复位按钮),程序能正常运行, 冷启动或复位后,程序无法启动运行,一块需要P4.3接地一下才能正常运行,一块需要P4.3接VDD一下程序 ...… 查看全部问答∨ |