打印
[STM8]

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

[复制链接]
4232|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhangyong1818|  楼主 | 2010-8-14 17:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
想请教关于低功耗  halt mode 问题。第一个是:halt();只用这一句能真正的进入停机模式吗,如果能得话,我做的板子在这种模式下功耗怎么还那么高呢,首先声明外围电路没接东西,就一个开关按键,复位键?
第二问题是:我在执行halt();这句之前我把总中断关掉,相关的i/o设为悬浮输入,实时时钟也关掉,在这种情况下,外部中断开关键不能唤醒机器,只能用复位键才能唤醒。
第三个问题:希望有高人能给一个进入halt模式的例子,比如说在进入halt();需要关掉什么,不能关掉什么.谢谢!
沙发
IJK| | 2010-8-16 09:38 | 只看该作者
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()),外围电路没接东西就需要让其上拉或者输出固定高、低电平,即可。

使用特权

评论回复
板凳
zhangyong1818|  楼主 | 2010-8-16 10:56 | 只看该作者
非常感谢,我试试看

使用特权

评论回复
地板
zhangyong1818|  楼主 | 2010-8-16 17:00 | 只看该作者
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;

使用特权

评论回复
5
香水城| | 2010-8-16 17:31 | 只看该作者
使能了对应的外部中断吗?

使用特权

评论回复
6
zhangyong1818|  楼主 | 2010-8-16 18:00 | 只看该作者
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();

使用特权

评论回复
7
zhangyong1818|  楼主 | 2010-8-16 18:01 | 只看该作者
香主:
我觉得自己使能了,只是不知道正确与否,请指教!

使用特权

评论回复
8
IJK| | 2010-8-17 09:28 | 只看该作者
halt();  停机模式,功耗现在最低能降到1uA,但是外部中断不起作用了?请指教!
void GPIO_Configuration(void)   
{               
                /* I/O口初始化;*/
                GPIO_DeInit(GPIOB);
                GPIO_DeInit(GPIOD);
                GPIO_DeInit(GPIOE);
         ...
zhangyong1818 发表于 2010-8-16 17:00


HALT模式下,STM8L的功耗应该在1uA以下,跟datasheet标明的0.4uA接近。

使用特权

评论回复
9
IJK| | 2010-8-17 09:31 | 只看该作者
“外部中断不起作用了”,你怎么知道的?

使用特权

评论回复
10
zhangyong1818|  楼主 | 2010-8-17 11:35 | 只看该作者
是我搞错了,我在进入停机模式之前把好多东西都关掉了,以为是中断不起作用,今天发现不是这样。不过要留一个i/o口做外部中断用,功耗就降不了?请指教
把你的程序发过来让学习一下。谢谢

使用特权

评论回复
11
zhangyong1818|  楼主 | 2010-8-17 11:38 | 只看该作者
PWR_FastWakeUpCmd(DISABLE);
    PWR_UltraLowPowerCmd(ENABLE);
加上这两句 功耗可以更低 我测出来的是0.43uA

使用特权

评论回复
12
zhangyong1818|  楼主 | 2010-8-17 14:08 | 只看该作者
GPIO_Init(GPIOC, GPIO_Pin_All,GPIO_Mode_In_PU_No_IT );


这种方法配置管脚是 管脚的输出电平为高?
其他方式配置是  测量功耗比较大。
想问一下,在halt();模式下,怎样配置GPIO比较好请高手举个例子

使用特权

评论回复
13
IJK| | 2010-8-17 14:15 | 只看该作者
PWR_FastWakeUpCmd(DISABLE);
    PWR_UltraLowPowerCmd(ENABLE);
加上这两句 功耗可以更低 我测出来的是0.43uA
zhangyong1818 发表于 2010-8-17 11:38


呵呵,做到了预想的情况。

使用特权

评论回复
14
IJK| | 2010-8-17 14:16 | 只看该作者
GPIO_Init(GPIOC, GPIO_Pin_All,GPIO_Mode_In_PU_No_IT );


这种方法配置管脚是 管脚的输出电平为高?
其他方式配置是  测量功耗比较大。
想问一下,在halt();模式下,怎样配置GPIO比较好请高手举个例子 ...
zhangyong1818 发表于 2010-8-17 14:08


对于悬空的引脚,使用GPIO_Mode_In_PU_No_IT 比较好,也可以让悬空的引脚都输出低电平,功耗同样可以做到最低。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

157

帖子

2

粉丝