打印

请教版主!(stm8l)

[复制链接]
9037|21
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
现在需要用stm8l开发产品,想测试下其性能,特别是功耗。手头有stm8l152k6,和stm8l101k3,想问一下进入低功耗模式已达到产品宣传所说的微安级别的电流,直接用指令进就可以还是需要初始化相关设置。
哪位高手调试低功耗成功的可以介绍下经验。先谢了!(用152k6时遇到n多问题经过确认是芯片版本太低。)
沙发
nightsky211|  楼主 | 2010-6-1 15:44 | 只看该作者
现在,101k3已经可以进入低功耗(halt),测得电流约为0.4ua,和手册上说的0.3差不多。
实现方法:把i/o设为上拉输入,直接进halt,然后把swim等线拔掉,然后给板子重启,就可以测到电流了。。

可是现在又有新问题了,不进低功耗,怎么配置才可以达到最低功耗?让程序一直空跑。

使用特权

评论回复
板凳
IJK| | 2010-6-1 15:57 | 只看该作者
“不进低功耗,怎么配置才可以达到最低功耗?”
这话说得...

使用特权

评论回复
地板
IJK| | 2010-6-1 15:59 | 只看该作者
STM8L最低的功耗是在HALT模式,为约0.35uA。
其次是在Active-HALT模式,为约1uA。

使用特权

评论回复
5
IJK| | 2010-6-1 16:01 | 只看该作者
STM8L101xx有3种低功耗模式:Wait, Active-halt,Halt
STM8L15xx有5种低功耗模式:Wait , Low power run (5.1 μA), Low power wait (3 μA),
Active-halt with full RTC (1.3 μA), Halt (350 nA)

使用特权

评论回复
6
nightsky211|  楼主 | 2010-6-1 16:17 | 只看该作者
5# IJK
我的意思是需要初始化什么。。。例如要把i/o管脚置为输入才可以实现功耗低,
不进低功耗,把i/o设置了,其它外设也关了,还有什么要注意的,
最终目的是想看看在其低频下运转时功耗为多少。。。。

使用特权

评论回复
7
香水城| | 2010-6-1 20:44 | 只看该作者
5# IJK  
我的意思是需要初始化什么。。。例如要把i/o管脚置为输入才可以实现功耗低,
不进低功耗,把i/o设置了,其它外设也关了,还有什么要注意的,
最终目的是想看看在其低频下运转时功耗为多少。。。。 ...
nightsky211 发表于 2010-6-1 16:17


你使用低功耗运行模式即可。 I/O管脚置为模拟输入较好。

使用特权

评论回复
8
nightsky211|  楼主 | 2010-6-2 09:18 | 只看该作者
7# 香水城
进低功耗时,这样设置i/o可以实现手册上说的功耗,但是仅这样设置不禁低功耗让其在默认时钟(2M)或者在LSI(152k6)时钟下运行,还不能实现很小的功耗。。(现在stm8l152k6,LSI,38k时钟功耗只调到了97ua左右)外设什么的上电复位后应该是关闭的吧,

使用特权

评论回复
9
IJK| | 2010-6-2 09:30 | 只看该作者
“38k时钟功耗只调到了97ua左右”
如果打开了一些外设,那么这个数值跟理想值相差不大。

data sheet上面的Low power run (5.1 μA), 应该是使用LSI且关闭HSI,同时所有外设都关闭得到的。

使用特权

评论回复
10
nightsky211|  楼主 | 2010-6-2 10:14 | 只看该作者
9# IJK

IJK你好,low power run,应该是进ram运行程序吧,
This mode is entered by executing the following software sequence:
1. Jump to RAM
2.  Switch system clock to LSI or LSE clock sources
3.  Switch off the high speed oscillators, the ADC and all unused peripherals
4.  Mask all interrupts
5.  Switch off the Flash/Data EEPROM by setting EEPM bit in FLASH_CR1 register
6.  Add a software delay loop to ensure Flash/Data EEPROM off status
7.  Configure the ultralow power mode for the regulator by setting the REGOFF bit in the CLK_REGCSR register
我刚才试了下没进ram,但执行了第7步,功耗降至7.5ua,这样的话就理想了,但不知switch-off of the main regulator 会对芯片有什么影响啊。

使用特权

评论回复
11
grant_jx| | 2010-6-2 10:21 | 只看该作者
Main voltage regulator mode (MVR) 算是给内核供电的LDO。 在Halt and Active-halt模式下运行的是Ultralow power regulator mode (ULP)

使用特权

评论回复
12
nightsky211|  楼主 | 2010-6-2 10:55 | 只看该作者
本帖最后由 nightsky211 于 2010-6-2 12:47 编辑

刚才又试了下,执行第七步仿真有问题。不能这样执行。。还试了下把时钟调到1M并不能实现所说的192ua/MHz,有谁调试过啊。功耗将不下来。。。

使用特权

评论回复
13
zhangyong1818| | 2010-8-12 17:38 | 只看该作者
请问如何进入HALT MODE

使用特权

评论回复
14
流行音乐| | 2010-8-13 09:45 | 只看该作者
如果真要CPU维持运行,又要想尽可能的低功耗,则必须尽可能的降低运行频率,也要尽可能的关闭没用到的外设,IO尽可能的设置为浮空输入。
如果能让CPU暂时停止运行,则尽可能的让其暂时停止运行,即进入 Wait、Active Halt 或 Halt 模式。

使用特权

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

使用特权

评论回复
16
zhangyong1818| | 2010-8-14 17:12 | 只看该作者
首先声明外围电路没接多少东西,就一个开关按键,复位键?
自相矛盾了  呵呵

使用特权

评论回复
17
h_12345| | 2011-4-23 17:11 | 只看该作者
我用的是stm8L151k4 ,
程序如下
void main(void)
{
      __halt();
while(1){};
}
电压3.3V ,测得是电流是680ua;
请问有什么原因,板上就只有一个电源,没有外设元件

使用特权

评论回复
18
h_12345| | 2011-4-23 17:21 | 只看该作者
在进入halt模式下有什么方法可以换醒吗

使用特权

评论回复
19
ljl885712| | 2013-4-10 22:47 | 只看该作者
h_12345 发表于 2011-4-23 17:11
我用的是stm8L151k4 ,
程序如下
void main(void)

我的系统与你的问题相似
,我也写过只有HALT指令的程序,
我还做过时钟切换,HSI 切换至LSI,中间有一个LED闪灯的过程,明显发现时间周期不一样了,说明切换是成功的,但在执行完HALT指令后,单片机的功耗还在200uA左右;
两者好像没有什么多大的差别,请高手指教!!!!

int main( void )
{
  unsigned int i,j;
  
  PA_DDR_DDR2 = 1;                //PA2作输出口
  PA_CR1_C12 = 1;
  PA_CR2_C22 = 0;
for(j=0;j<5;j++)                //PA2高速闪10次
{
      PA_ODR_ODR2 = 1;
      for(i=0;i<10000;i++)
      {
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
      }
      PA_ODR_ODR2 = 0;
      for(i=0;i<10000;i++)
      {
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
      }
}
  CLK_CKDIVR_CKM = 0;             //分频数为1,不分频
  CLK_ECKR_HSEON = 0;             //关闭外部高速时钟
  CLK_ECKR_LSEON = 0;             //关闭外部低速时钟
  CLK_ICKCR_LSION = 1;            //打开内部低速时钟
  while(CLK_ICKCR_LSIRDY == 0)    //判断内部时钟准备完成标志
  {asm("nop");}
  CLK_SWCR_SWEN = 1;              //时钟切换
  CLK_SWR = 0x02;                 //选择LSI内部低速时钟作为系统时钟
  while(CLK_SCSR == 0X01)         //判断时钟切换完成
  {asm("nop");}  

   for(j=0;j<3;j++)                //PA2低速闪10次
{
      PA_ODR_ODR2 = 1;
      for(i=0;i<10000;i++)
      {
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
      }
      PA_ODR_ODR2 = 0;
      for(i=0;i<10000;i++)
      {
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
        asm("nop");
      }
}
  i = 0;
  j = 0;
//  PA_ODR_ODR2 = 1;
  CLK_ICKCR_HSION = 0;              //关闭内部HSI时钟
  CLK_ICKCR_HSIRDY = 0;
  while(CLK_ICKCR_HSIRDY == 1)
  {  asm("nop");}
  asm("halt\n");
  asm("nop");
  return 0;
}

使用特权

评论回复
20
ljl885712| | 2013-4-10 22:49 | 只看该作者
  CLK_ICKCR_HSION = 0;              //关闭内部HSI时钟
   CLK_ICKCR_HSIRDY = 0;
   while(CLK_ICKCR_HSIRDY == 1)
   {  asm("nop");}
这几条指令本来没有的,实在没办法加的,但加了更不行,HSIRDY不能清零

使用特权

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

本版积分规则

0

主题

7

帖子

1

粉丝