历史上的今天
今天是:2024年09月10日(星期二)
2018年09月10日 | STM8L的低功耗模式的配置
2018-09-10 来源:eefocus
低功耗可以说是stm8l系列单片机的核心特色了。假设假设我们有一个温度传感器设备,他处于某种很特殊的地方,只能使用电池,而且我们很难去更换,那么低功耗就显得尤为重要。那么继续假设我们这个温度传感器不需要一直工作,只需要1小时采集一次数据就行了,也就是说,一个小时内,我们这个传感器只工作1秒钟,那么剩下的59分59秒怎么办?也许有的同学就会说了,while(1)循环啊,这种回答就很没有灵性。都不需要工作了,我们还关机不就行了,让它一小时启动一次,测量完就继续关机。那么就可以让电池里的电物尽其用。stm8l就有一个停机指令halt(),执行这条指令后,内核时钟停止工作,就相当于关机了。
但是并不是停机了,整个电路中的电流消耗就达到了最小!
第一:
虽然MCU是停机了,但是电路板还有其他的芯片在工作,它们仍然在消耗电量,所以我们在停机前应该要把其他芯片给关闭(可以通过特定的指令或者片选线)。条件好的可以直接用切断它们的电源。
第二:
我是这样理解的:进入停机模式后,只是MCU中最耗电的内核部分被关了,而所有寄存器和内存中的值是保持不变的,所以它的外设还在消耗电量,所以我们要在停机之前把开启的外设给关了。这里要注意一点:外设开启时是先开时钟再设置寄存器,关闭时先清除寄存器再关闭时钟。我是这样理解的:操纵一个外设的寄存器肯定是需要时钟的,如果我们先把时钟给关了,那么还怎么操作寄存器呢,如果光关了时钟,不清寄存器的相应位,那么外设还处于“静态耗电”的状态。在研究低功耗的过程中,我被这个坑了好久。关于这一点的实例可以参考这篇博客:
http://blog.csdn.net/qq_25186745/article/details/52777375
第三:
关于IO口的电平,这个是非常重要的一点,和之前提到的外设一样,GPIO也是一种外设,但是特殊的是,这个外设是和芯片外部直接打交道的,如果GPIO外部接了个上拉电阻,而你在停机之前设置的IO口是低电平的,那么电流不就通过电阻,流到IO口里来了,比如正常的说接了个10k的上拉电阻,接到3.3v电压上,那么电流就是330uA,这个值可不小呢,stm8l在停机时极限最小电流好像能达到0.4uA。那么你这个电路就是因为这个电阻,停机电流比别人大了将近800倍了,那么假如你的产品能待机1年,人家待机800年,这还怎么比?所以IO口是绝对不能被忽视的。stm8l芯片复位以后所有引脚都是浮空输入模式,理论上悬浮空输入时IO口的状态为高阻态是最省电的,那么我们只要把所有IO都DeInit就可以了。但是事实上不是,我把没有用到的管脚全部推挽输出高电平或低电平,不用的外部晶振的引脚要改为上拉输入才省电,外部有上拉下拉电阻的引脚分别推挽输出高电平和低电平,一般电路中上拉电阻比较多(比如IIC的总线外部都有上拉的)。和外部芯片相连的引脚都推挽输出低电平,因为外部芯片断电后所有引脚都是高阻态或接地的吧,如果你弄个高电平,就可能会有电流流过去。
在实际的项目中我们采用的方法是进入停机模式后,只有RTC时钟在工作,然后RTC每隔一段时间唤醒一次MCU,MUC工作完成后继续停机。
停机的代码为:
DeInit外设;
关闭外设时钟;
逐个配置GPIO的电平
CLK_HaltConfig(CLK_Halt_FastWakeup,ENABLE); //快速唤醒后时钟为HSI
PWR_FastWakeUpCmd(ENABLE); //开启电源管理里的快速唤醒
PWR_UltraLowPowerCmd(ENABLE); //使能电源的低功耗模式(这句话的作用很大)
RTC_ITConfig(RTC_IT_WUT, ENABLE); //使能RTC中断
CLK_HSICmd(DISABLE); //关闭内部高速时钟(之前内核是工作在HSI下的)
//sim(); //关闭所有中断,手册上说最好关闭所有中断在进入停机模式,但是好像这条指令并不会关闭RTC中断,我也没用这行代码
halt(); //到这一步执行完后,内核时钟就停止了,进入停机模式
WakeUp_Init(); //rtc唤醒后PC指针在这里,从这里开始执行,所以我们要在这里添加初始化各种外设和外部芯片的代码
最后我测出来实际进入休眠模式后电流5~6uA左右,和理想的还是有一点差距,因为我们的板子上带有稳压芯片,消耗量一部分的电流。
这里有网友分享的低功耗模式下电流的数据:
http://bbs.21ic.com/icview-670756-1-1.html
上一篇:STM8L低功耗设置
史海拾趣
|
本帖最后由 paulhyde 于 2014-9-15 03:33 编辑 来源:http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3648721&bbs_page_no=1&bbs_id=9999 暑假学校里做机器人比赛,就是做出一个人型机器人来互相对打,要求无线控制的。 我因为去年做过这个 ...… 查看全部问答> |
|
应用场合不同,选择交流或直流取决于线圈,直流接触器的线圈只能通直流,交流接触器的线圈只能通交流工作。一般来说,在交流回路当中,主回路用的交流,辅助助回路一般都是从主回路上取电做控制回路,那么控制回路显然也是交流的,那么就要用交流接 ...… 查看全部问答> |
|
小弟刚上手驱动开发不久,现在用PB5.0做驱动。 现在是想按扇区读写全部的flash rom,我知道PB中有FMD_WriteSector等函数可以读写扇区,但不知道如何调用? 另外我还想问一下,用PB FOR CE5.0写的驱动能在windows mobile 上面用吗? 谢谢各位高手… 查看全部问答> |
|
#include <STM8S105C_S.h> #define uchar unsigned char #define uint unsigned int #define data_out PB_DDR|=0X04; #define data_in PB_DDR&=~0X04; #define scl_H PB_ODR|=0X02; #define scl_L PB_ODR&=~0X02; #define sda_ ...… 查看全部问答> |
|
用f123做了个电路板,用的是前2年的片子,烧写调试成功,偶然间不小心烧了片子,换了新的(刚买的),然后就提示60错误,找不到设备,请教斑竹为什么?头都大了,电路没问题的,用的是同样的电路板(同一批做的),元件也一样,是什么问题啊? 1。 ...… 查看全部问答> |
|
lowlevel_init.S的system_clock_init函数放到C语言下面实现——更好处理 在uboot原来的代码里,有系统时钟的初始化函数,在board/samsung/smdkv210/lowlevel_init.S的system_clock_init函数,我大概看了一下,寄存器不一样,而且是汇编写的,所以我就改成用c语言来实现,在BL1阶段初始化一下,BL2阶段就不用重新初始化了 ...… 查看全部问答> |




