历史上的今天
返回首页

历史上的今天

今天是:2024年12月19日(星期四)

正在发生

2019年12月19日 | STM8L超低功耗程序编写教学,简单易懂

2019-12-19 来源:eefocus

之所以写这篇博客,是因为最近做一个项目,需要用到单片机的低功耗模式。第一次用stm8,我在网上看了很多资料,虽然有些写的还是挺详细的,但是我自己实际调试的时候还是出了不少意外,花了不少时间,因此想写一篇文章让你们少走一些弯路。语文水平有限,写的不好勿怪。


在讲程序之前先说明几点:

1.STM8低功耗的几种模式我不多说了,这方面的资料很多,自己可以先去了解一下。

2. 我测试用的主控芯片是STM8L151G6。(其他L系列程序上没有什么区别,至于功耗是不是一样我就不知道了)

3. 程序用的是库函数的写法。

4. 低功耗模式用的是Halt模式,也就是停机模式,功耗是最低的,其他模式的功耗我没有测过,这里不说。

5. 为了更加直观,我下面写的程序尽可能简化。(外设部分的程序没写进去)

6. 如果我有哪里写错了,欢迎来指正。


好了废话不多说,马上开始程序的编写。


//main函数

void mian(void)

{

  //配置时钟

  CLK_HSICmd(ENABLE);

  CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_HSI);  // 我用的是内部时钟

  CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);   //1分频,也就是16M,实际测试,时钟分频对功耗没什么影响

  

  //下面可以写外设的初始化函数

  

  //下面可以写外部中断初始化,halt模式只能通过外部中断或复位唤醒,我这里用了PB1,引脚接的是OPT3001光感芯片的中断脚

  disableInterrupts(); //先关闭总中断(也可以不写,如果是多个外部中断,最好加上,不然会有个bug,具体这里不说了)

  GPIO_Init(GPIOB, GPIO_Pin_1, GPIO_Mode_In_PU_IT);  //PB1 配置成上拉外部中断

  EXTI_DeInit();

  EXTI_SetPinSensitivity(EXTI_Pin_1,EXTI_Trigger_Falling);  //PIN1 设置为下降沿中断(具体根据实际情况)

  enableInterrupts();//使能总中断

  

  //下面可以控制外设进入休眠模式

  //除了单片机,单片机控制的各个模块也会耗电,如果不需要一直工作可以进入休眠

  //比如我用到的LORA模块,不需要一直发射或接收数据,所以进入休眠模式

  //比如光照传感器,需要一直采集数据,并判断有没有超出设置好的上限或下限,因此不能休眠


  //单片机在进入停机模式之间,关闭没有用到的外设可以降低功耗(根据实际情况增加和删减)

  CLK_PeripheralClockConfig(CLK_Peripheral_ADC1,DISABLE); 

  CLK_PeripheralClockConfig(CLK_Peripheral_TIM1,DISABLE);

  CLK_PeripheralClockConfig(CLK_Peripheral_TIM2,DISABLE);

  CLK_PeripheralClockConfig(CLK_Peripheral_TIM3,DISABLE);

  CLK_PeripheralClockConfig(CLK_Peripheral_TIM4,DISABLE);

  CLK_PeripheralClockConfig(CLK_Peripheral_I2C1,DISABLE);

  CLK_PeripheralClockConfig(CLK_Peripheral_SPI1,DISABLE);

  CLK_PeripheralClockConfig(CLK_Peripheral_USART1,DISABLE);


  //把没有接外设或者暂时不用的引脚设置为低速,输出低(这里需要根据实际情况配置)

  //千万别小瞧这些悬空的引脚,如果有几个悬空的引脚没有配置可能会多出几百uA

  //在网上看到一些资料说可以设为浮空输入,我实际测试过,在引脚悬空的情况下,引脚输出低,功耗会更低,有外设的引脚看情况而定

  //比如引脚接了一个低电平点亮的LED灯时,引脚拉高才能降低功耗

  //我这里只写单片机引脚不接任何外设的情况,引脚全部拉低

  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);


  //进入停机模式

  while(1)

  {

    // 下面这一句很关键,加上这句才能真正进入超低功耗模式(这个函数在stm8l15x_pwr.c里面,需要把它加到工程里面)

    PWR_UltraLowPowerCmd(ENABLE); 

    //进入停机模式

halt();

  }

}


//中断服务函数(在stm8l15x_it.c里面)

INTERRUPT_HANDLER(EXTI1_IRQHandler, 9)

{

  EXTI_ClearITPendingBit(EXTI_IT_Pin1); //清除中断标志

  

  //下面可以写中断唤醒单片机之后需要执行的程序

  

}


功耗测试结果(仅供参考):

1.单片机引脚全部悬空,引脚全部拉低,电流为0.4uA,这个和官方手册上面的最低功耗是一致的。

2.单片机只接一个SX1276 868MLORA模块,LORA设置为休眠,除了LORA其他单片机引脚全部拉低,总电流为1.6uA。

3.单片机接SX1276 868MLORA模块和OPT3001光照IC,LORA休眠,OPT3001工作,中断不触发的时候,电流为14uA左右。中断唤醒后的功耗和执行的程序相关。


测试功耗需要注意的几点:

1.电流表接在整个电路总电源输入的地方

2.测试的时候把单片机和下载器、仿真器、串口等断开连接。

3.测试的时候建议先单独测试stm8,然后再把外设一个一个加上去测试,我一开始测试的时候用的是一块电路完整的模块,测试的时候很难确定电流降不下去的原因,折腾了很久。

推荐阅读

史海拾趣

博通集成(BEKEN)公司的发展小趣事

随着产品线的不断丰富和技术实力的提升,博通集成开始积极拓展市场。公司凭借优质的产品和服务,赢得了众多客户的信赖和支持。同时,公司注重品牌建设,通过参加行业展会、举办技术研讨会等方式,提升品牌知名度和影响力。如今,博通集成已成为无线连接芯片设计领域的知名品牌。

Conxall公司的发展小趣事

随着科技的飞速发展,物联网成为了新的热点。Conxall公司敏锐地捕捉到了这一机遇,投入大量资源进行物联网技术的研发。经过数年的努力,公司成功推出了一款具有高度集成和智能化特点的物联网模块,广泛应用于智能家居、智慧城市等领域,为公司的快速发展奠定了坚实的基础。

中科芯(CKS)公司的发展小趣事

中科芯自成立以来,一直致力于集成电路技术的研发与创新。在早期的发展阶段,公司成功研制了我国首块超大规模集成电路,这一里程碑式的突破标志着中国集成电路技术达到了国际先进水平。这一成果不仅填补了国内在该领域的空白,也为中科芯赢得了广泛的国际声誉,为后续的技术突破奠定了坚实基础。

AdaptivEnergy公司的发展小趣事

近年来,面对全球芯片市场的激烈竞争和内外部环境的挑战,中科芯坚持创新驱动发展战略,加大市场开拓和科技攻关力度。通过优化产品结构、提升产品质量和降低成本等措施,公司实现了营业收入和净利润的稳步增长。一季度,中科芯的营业收入较正常年度增长24%,净利润增长83%,新签合同增长50%以上。这一成绩的取得充分展示了公司的市场竞争力和发展潜力。

AirBorn公司的发展小趣事

AirBorn公司成立于1958年,总部位于得克萨斯州奥斯汀。在创立之初,AirBorn就致力于设计、制造和销售高性能连接器和电缆组件。随着电子技术的飞速发展,AirBorn敏锐地捕捉到航空航天领域对高性能连接器的需求,并开始了针对这一领域的定制化产品研发。凭借卓越的技术实力和创新能力,AirBorn很快在航空航天连接器市场占据了一席之地。

Communications公司的发展小趣事

在电子行业的浪潮中,一家名为“通信先锋”的公司凭借其前瞻性的技术创新,迅速崭露头角。公司创始人敏锐地捕捉到了无线通信市场的巨大潜力,并投入大量资源进行研发。经过数年的努力,他们成功开发出了一款具有革命性的无线通信技术,极大地提升了数据传输速度和稳定性。

随着这款技术的推广和应用,“通信先锋”迅速获得了市场的认可。他们不仅与各大运营商建立了紧密的合作关系,还积极开拓海外市场,将产品和技术推向全球。在激烈的市场竞争中,他们凭借卓越的技术实力和良好的口碑,逐渐成为了通信行业的领军企业。

问答坊 | AI 解惑

请帮忙分析下这个双稳态电路

如图所示,这是我从网上看到的一个双稳态电路(图中要实现的话应该把电容C1加大),有附带解释如下:《假设Q1的G极输入是高电平,Q1导通,输出低电平,低电平接到Q2的G极,Q2截止,Q2输出高电平,所以Q3也截止,LED灯灭。此时由于Q1输出端D极为低电平 ...…

查看全部问答>

ATmage128 芯片中文资料

新手报到,共享一些资料,有需要的随便下载…

查看全部问答>

三极管选用

现需要一三极管Vceo大于600V,电流尽量小(使用条件在mA级别)特征频率在百兆以上,请各位达人多给推荐推荐,谢谢!!!~~~急用…

查看全部问答>

问一下,用干一个电池将电压升到3.3V,电流为200mA,用什么芯片为好!

用干一个电池将电压升到3.3V,电流为200mA,用什么芯片为好?以前一直在用max1795,max856之类,但总感觉MAXIM公司的芯片太贵,想找一个性价比好的芯片,有谁用过,麻烦告诉一下,谢谢!…

查看全部问答>

VS2005 mfc无法添加消息???

VS2005中没有ClassWizard,而是使用属性窗口添加事件处理函数,但我写一个MFC本地应用程序时,在程序中使用工具栏ToolBar,在工具栏中新建了一项,却不知如何添加处理函数,属性窗口中没有可处理的消息列表呀。 …

查看全部问答>

这错误是什么意思

编译时没有错,但是向芯片下载时有一个错误,哪位明白这是什么意思? 指点一下。 下面是下载时给出的信息。 Building configuration: water - Debug water.c icc430.exe -I C:\\Program Files\\IAR Systems\\Embedded Workbench 3.2\\430\\INC ...…

查看全部问答>

两个运算符号" |= "和" &= "的问题,谢谢

PWM输出里面的两句: PCA0CPM0 |= 0x40;          // Set ECOM0 if it is \'0\' ............ PCA0CPM0 &= ~0x40;         // Clear ECOM0 帮我解析一下两个运算的意思吧,谢谢了…

查看全部问答>

新手求助。51单片机怎么判断连续按键啊

就是说条件判断里是一个特定的按键串。…

查看全部问答>

视频采集项目获奖感言

这一半年来,从一名学生转变成了研发工程师,项目比较紧,涉足的领域也是全新的,也没有什么人带,靠自己不断折腾和琢磨终于把公司的项目做完了。 由于自己一贯喜欢DIY点自己感兴趣的东西,而恰好eeworld提供了这样一个机会,于是我毫不犹豫的参加 ...…

查看全部问答>