stm8 halt


原文链接: stm8 halt

如果你象其它单片机一样,开启了AWU,然后来一句halt();

那么此时的电流为200uA左右,到此差不多心灰意冷,STM8S这么差劲儿!

仔细阅读《STM8S系列MCU功耗管理》,它的电源分为MVR和LPVR,也搞不懂ST的科学家们为什么单片机在halt()时直接变为LPVR供电算了,非要手动设一下,通过设置内部时钟寄存器CLK_ICKR 的REGAH位可实现此功能

CLK_SlowActiveHaltWakeUpCmd(ENABLE);

经过这么一整,电流有改进,在69uA,和官方的PDF的68uA很接近,但仍不能满足电池供电需求,官方PDF活跃停机电流为11uA@5V 9uA@3.3V,再仔细读,原来必须要关闭FLASH,只是关闭了FLASH启动要慢几个us,这个无所谓了,只要不是秒级的,对我的应用无所谓,所以这儿还必须在halt()前先启用活跃停机时关闭flash选项,FLASH_CR1 的AHALT位置1

这里要特别注意,在《STM8S参考手册》中文参考手册中,描述如下

AHALT:活跃停机(Active halt)模式下掉电
0:当MCU在活跃停机模式时FLASH处于掉电模式
1:当MCU在活跃停机模式时FLASH处于运行模式

所以这儿要是信了中文PDF,可能你将会和我一样,要多折腾30分钟,如果你执行 电流就变成了11uA

void Flash_OFF_act_halt(void){
FLASH->CR1 |= 0x04;
}

###
进入HALT注意事项
将未使用到的IO口设置为输出低;
关闭所有用到的外设时钟(如 ADC、USART等);
失能所使用到的外设;
实测进入HALT模式待机约为0.3uA
下面列出示例代码,如有错误,还请广大网友指出。 ^_^

#include "stm8l15x.h"

uint8_t sys_1ms_flg = 0;
uint16_t SleepTime = 0;

/*LED工作2S灭 进入HALT模式 外部唤醒 /
void main(void){
CLK_PeripheralClockConfig (CLK_Peripheral_TIM4,ENABLE); /
使能外设时钟 /
TIM4_DeInit();
TIM4_TimeBaseInit(TIM4_Prescaler_8, 0xfa); /
16M/8/8=250K,0xfa=250,250*(1/250)=1mS /
TIM4_ITConfig(TIM4_IT_Update, ENABLE); /
向上溢出中断使能,中断向量号25 /
TIM4_Cmd(ENABLE); /
TIM4使能 */

GPIO_Init(GPIOD,GPIO_Pin_0,GPIO_Mode_Out_PP_High_Slow); /* 初始化LED端口 */

GPIO_Init(GPIOB, GPIO_Pin_1, GPIO_Mode_In_PU_IT); /* 配置GPIB PIN1脚为外部中断脚 /
EXTI_DeInit (); /
恢复中断的所有设置 /
EXTI_SetPinSensitivity(EXTI_Pin_1, EXTI_Trigger_Falling);/
配置外部中断 唤醒Halt模式 */

PWR_FastWakeUpCmd(ENABLE); /* 快速唤醒使能 /
PWR_UltraLowPowerCmd(ENABLE); /
/
enableInterrupts(); /
开启中断总开关 */
while (1){
if(sys_1ms_flg){

 sys_1ms_flg = 0;
 GPIO_ResetBits(GPIOD, GPIO_Pin_0);
 SleepTime++;
 if(SleepTime==2000){
   SleepTime = 0;
   /* 进入HALT前 需把所有为用到的端口设置为低*/
   GPIO_Init(GPIOA, GPIO_Pin_All, GPIO_Mode_Out_PP_Low_Slow);
   GPIO_Init(GPIOB, GPIO_Pin_All, GPIO_Mode_Out_PP_Low_Slow);
   GPIO_Init(GPIOC, GPIO_Pin_All, GPIO_Mode_Out_PP_Low_Slow);
   GPIO_Init(GPIOD, GPIO_Pin_All, GPIO_Mode_Out_PP_Low_Slow);

   /* 我的板子LED是低点亮 所以置高 */
   GPIO_SetBits(GPIOD, GPIO_Pin_0);

    /* 上面把端口配置为输出低 但是不是我们想要的 所配置回来GPIB PIN1脚为外部中断脚  */
   GPIO_Init(GPIOB, GPIO_Pin_1, GPIO_Mode_In_PU_IT); 

   /* 先失能Tim4 在禁用tim4时钟 */
   /* 个人理解 先把外设时钟禁止了 那它怎么配置其他寄存器呢 不知道理解的正不正确 */
   TIM4_Cmd(DISABLE); 
   CLK_PeripheralClockConfig (CLK_Peripheral_TIM4,DISABLE);

   halt();        /* 进入停机模式 实测0.3uA */
   nop();

   CLK_PeripheralClockConfig (CLK_Peripheral_TIM4,ENABLE);
   TIM4_Cmd(ENABLE);

 }

}
}
}

————————————————
版权声明:本文为CSDN博主「从丶简」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/WangJiZhiQian/article/details/86561506

`