STM8L低功耗HALT模式一些总结进入HALT注意事项- 将未使用到的IO口设置为输出低;
- 关闭所有用到的外设时钟(如 ADC、USART等);
- 失能所使用到的外设;
实测进入HALT模式待机约为0.3uA
下面列出示例代码,如有错误,还请广大网友指出。 ^_^
- #include "stm8l15x.h"
- uint8_t sys_1ms_** = 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_**){
- sys_1ms_** = 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);
-
- }
- }
- }
- }
|