halt();只用这一句话能真正进入最低功耗吗

zhou.63624   2010-8-14 17:17 楼主
想请教关于低功耗  halt mode 问题。第一个是:halt();只用这一句能真正的进入停机模式吗,如果能得话,我做的板子在这种模式下功耗怎么还那么高呢,首先声明外围电路没接东西,就一个开关按键,复位键?
第二问题是:我在执行halt();这句之前我把总中断关掉,相关的i/o设为悬浮输入,实时时钟也关掉,在这种情况下,外部中断开关键不能唤醒机器,只能用复位键才能唤醒。
第三个问题:希望有高人能给一个进入halt模式的例子,比如说在进入halt();需要关掉什么,不能关掉什么.谢谢!

回复评论 (13)

1. halt();只用这一句能真正的进入停机模式,但不代表功耗最低。必须管脚处于固定状态,才能功耗最低。
2. halt状态的中断唤醒。可以参考如下代码,代码中PC.1接按键,用于唤醒:
  // Set PC1 as Input floating with INT
  GPIO_Init(GPIOC, GPIO_Pin_1, GPIO_Mode_In_FL_IT);
  // Init the pin Interrupt sensitivity - Pin1(PC1)
  EXTI_SetPinSensitivity(EXTI_PinNum_1, EXTI_Sensitivity_Fall_Only);
3.为了功耗最低,在进入halt前,如果之前用过AD就需要复位AD(调用ADC_DeInit()),外围电路没接东西就需要让其上拉或者输出固定高、低电平,即可。
点赞  2010-8-16 09:38
                                 非常感谢,我试试看
点赞  2010-8-16 10:56
halt();  停机模式,功耗现在最低能降到1uA,但是外部中断不起作用了?请指教!
void GPIO_Configuration(void)   
{               
                /* I/O口初始化;*/
                GPIO_DeInit(GPIOB);
                GPIO_DeInit(GPIOD);
                GPIO_DeInit(GPIOE);
                /*控制 LED的信号管脚*/
                GPIO_Init(GPIOB,GPIO_Pin_4,GPIO_Mode_Out_PP_Low_Fast);
                /*time2的触发入口*/
                GPIO_Init(GPIOB,GPIO_Pin_3,GPIO_Mode_In_FL_IT );
                /*GPIOD configuration: CONTROL ALARM (PD3)*/
                GPIO_Init(GPIOD,GPIO_Pin_2 | GPIO_Pin_3,GPIO_Mode_Out_PP_Low_Fast);
                /*两个外部中断入口*/
                GPIO_Init(GPIOE, GPIO_Pin_0 | GPIO_Pin_3, GPIO_Mode_In_FL_IT);
                GPIO_Init(GPIOA,GPIO_Pin_1, GPIO_Mode_In_FL_IT);
                EXTI_DeInit();
                /*模式选择中断入口*/
                EXTI_SetPinSensitivity(EXTI_Pin_0,EXTI_Sensitivity_Falling );
                /*开关键中断入口*/
                EXTI_SetPinSensitivity(EXTI_Pin_3,EXTI_Sensitivity_Falling );
               
}


                TIM1_Cmd(DISABLE);
                TIM1_CtrlPWMOutputs(DISABLE);
                TIM2_Cmd(DISABLE);
                TIM3_Cmd(DISABLE);
                ADC_DeInit(ADC1);
                ADC_ChannelCmd(ADC1,ADC_Channel_9, DISABLE);
                ADC_Cmd(ADC1 ,DISABLE);
                ADC_TempSensorCmd(DISABLE);
    ADC_VrefintCmd(DISABLE);
                                /*关闭总中断*/
                //disableInterrupts();
                PWR_FastWakeUpCmd(DISABLE);
    PWR_UltraLowPowerCmd(ENABLE);
               
                GPIO_DeInit(GPIOA);
                GPIO_DeInit(GPIOB);
                GPIO_DeInit(GPIOC);
                GPIO_DeInit(GPIOD);
                GPIO_DeInit(GPIOE);
                //GPIO_ResetBits(GPIOD, GPIO_Pin_2 | GPIO_Pin_3);
                //GPIO_ResetBits(GPIOE, GPIO_Pin_0 | GPIO_Pin_3);
                GPIO_Init(GPIOA, GPIO_Pin_All,GPIO_Mode_In_PU_No_IT );
                GPIO_Init(GPIOB, GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|
                          GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7,GPIO_Mode_In_PU_No_IT );
                GPIO_Init(GPIOC, GPIO_Pin_All,GPIO_Mode_In_PU_No_IT );
                GPIO_Init(GPIOD, GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_4|
                          GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7,GPIO_Mode_In_PU_No_IT );
                GPIO_Init(GPIOE, GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_4|
                          GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7,GPIO_Mode_In_PU_No_IT );
                GPIO_Init(GPIOE, GPIO_Pin_3, GPIO_Mode_In_FL_IT);
                EXTI_DeInit();
                EXTI_SetPinSensitivity(EXTI_Pin_3,EXTI_Sensitivity_Falling );
                enableInterrupts();
          GPIO_ResetBits(GPIOB, GPIO_Pin_4);
                GPIO_ResetBits(GPIOD, GPIO_Pin_3);
               
                //GPIO_Init(GPIOE, GPIO_Pin_3, GPIO_Mode_In_FL_IT);
                //GPIO_Init(GPIOE, GPIO_Pin_3, GPIO_Mode_In_FL_IT);
                GPIO_Init(GPIOF, GPIO_Pin_0,GPIO_Mode_In_PU_No_IT );
                CLK_PeripheralClockConfig(CLK_Peripheral_ADC1, DISABLE);
                CLK_PeripheralClockConfig(CLK_Peripheral_RTC,  DISABLE);
                CLK_PeripheralClockConfig(CLK_Peripheral_LCD,  DISABLE);
                CLK_PeripheralClockConfig(CLK_Peripheral_TIM1, DISABLE);
                CLK_PeripheralClockConfig(CLK_Peripheral_TIM2, DISABLE);
                CLK_PeripheralClockConfig(CLK_Peripheral_TIM3, DISABLE);
                halt();            //system go to halt mode;
点赞  2010-8-16 17:00
                                 使能了对应的外部中断吗?
点赞  2010-8-16 17:31
GPIO_Init(GPIOE, GPIO_Pin_0 | GPIO_Pin_3, GPIO_Mode_In_FL_IT);
   EXTI_DeInit();
  /*开关键中断入口*/
  EXTI_SetPinSensitivity(EXTI_Pin_3,EXTI_Sensitivity_Falling );
这是在初始化时使能的,
我在进入halt();之前
又使能了一次
/*开关键中断入口*/
GPIO_Init(GPIOE, GPIO_Pin_3, GPIO_Mode_In_FL_IT);
  EXTI_DeInit();
EXTI_SetPinSensitivity(EXTI_Pin_3,EXTI_Sensitivity_Falling );
                enableInterrupts();
点赞  2010-8-16 18:00
版主:
我觉得自己使能了,只是不知道正确与否,请指教!
点赞  2010-8-16 18:01
halt();  停机模式,功耗现在最低能降到1uA,但是外部中断不起作用了?请指教!
void GPIO_Configuration(void)   
{               
                /* I/O口初始化;*/
                GPIO_DeInit(GPIOB);
                GPIO_DeInit(GPIOD);
                GPIO_DeInit(GPIOE);
         ...
HALT模式下,STM8L的功耗应该在1uA以下,跟datasheet标明的0.4uA接近。
点赞  2010-8-17 09:28
                                 “外部中断不起作用了”,你怎么知道的?
点赞  2010-8-17 09:31
是我搞错了,我在进入停机模式之前把好多东西都关掉了,以为是中断不起作用,今天发现不是这样。不过要留一个i/o口做外部中断用,功耗就降不了?请指教
把你的程序发过来让学习一下。谢谢
点赞  2010-8-17 11:35
PWR_FastWakeUpCmd(DISABLE);
    PWR_UltraLowPowerCmd(ENABLE);
加上这两句 功耗可以更低 我测出来的是0.43uA
点赞  2010-8-17 11:38
GPIO_Init(GPIOC, GPIO_Pin_All,GPIO_Mode_In_PU_No_IT );


这种方法配置管脚是 管脚的输出电平为高?
其他方式配置是  测量功耗比较大。
想问一下,在halt();模式下,怎样配置GPIO比较好请高手举个例子
点赞  2010-8-17 14:08
PWR_FastWakeUpCmd(DISABLE);
    PWR_UltraLowPowerCmd(ENABLE);
加上这两句 功耗可以更低 我测出来的是0.43uA
呵呵,做到了预想的情况。
点赞  2010-8-17 14:15
GPIO_Init(GPIOC, GPIO_Pin_All,GPIO_Mode_In_PU_No_IT );


这种方法配置管脚是 管脚的输出电平为高?
其他方式配置是  测量功耗比较大。
想问一下,在halt();模式下,怎样配置GPIO比较好请高手举个例子 ...
对于悬空的引脚,使用GPIO_Mode_In_PU_No_IT 比较好,也可以让悬空的引脚都输出低电平,功耗同样可以做到最低。
点赞  2010-8-17 14:16
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复