历史上的今天
今天是:2024年11月13日(星期三)
2019年11月13日 | STM8S的HALT模式与AWU唤醒
2019-11-13 来源:eefocus
/*
**********************************************************************************************************************************
* 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;
}
史海拾趣
|
显示故障: VISTA下图片自动播放时偏向右侧,不知什么原因? 请教一显示故障: 在VISTA平台下,使用windows自带的图片播放器,自动播放时图像偏向右侧,此现象只有在最大分辨率的情况下会出现,在此特请教一下高手们,指点指点,谢谢!… 查看全部问答> |
|
程序员在深圳群已经超过1500人,里面有很多在大公司上班的成员(包括国家级的研究院),有很多经验丰富的成员(包括参加过上亿元的项目的架构师),有很热爱技术的成员(包括自己写过嵌入式操作系统),希望大家踊跃发言,找到志同道合的朋友,找到对你有帮助的 ...… 查看全部问答> |
|
MMRESULT mres; if (mres = waveOutOpen(&hWaveOut, WAVE_MAPPER, &lpFormat, (DWORD_PTR)sb_callback, (DWORD_PTR)pDeviceMemory, CALLBACK_FUNCTION) !=0) ...… 查看全部问答> |
|
AM29LV160DB的接法有些问题 BYTE已经被我接地了,那么就是8为数据宽度,只需要引出D0-D7就可以了 而EE_FPGA V1.0中是把D0-D15全部引出的 这点将在下一版中改进,设置为8bit和16bit模式可选 … 查看全部问答> |
|
偶是个430新手,这两天看了些资料,但是一直没有看到关于外扩ram得应用,想弱弱得问一下,430用哪个口扩展外部ram,扩展后,软件是怎么操作得(比如c51使用XBYTE访问得)? 请大虾不要置疑为何扩展ram,只因为系统确实需要这么做才能正常工作,这 ...… 查看全部问答> |
|
假设一个任务在执行过程中,被中断,然后保存现场进入中断后,发现更高优先级任务,这时候,执行更高优先级任务,在执行更高优先级任务时候,被中断的任务处在什么状态?在被中断的代码中,没有看到被挂起的代码。还有更高优先 ...… 查看全部问答> |
|
C28x Based DeviceQ: What is the difference between the TMS320F28xx and the TMS320C28xx MCUs? A: The \"F\" represents flash, while the \"C\" represents ROM. The Flash devices are reprogrammable and are available through normal dist ...… 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 09:08 编辑 我看看了看03年的元件清单有个高频变容二极管,然后那年题目就有电压控制LC振荡器。是不是今年有可能会有呢? … 查看全部问答> |
|
这么晚发,实在是抱歉。。。。。 我总结的比较晚,各路大侠都已经说得差不多了,总结的也比我这业余人士强多了。时间也不早了,哈哈,我就只是简单说一下自己的想法吧,说多无益免得贻笑大方。其实在测试之前我还是不太明白这电源模块的优点,边测 ...… 查看全部问答> |




