单片机
返回首页

STM8L151C8学习笔记5:低功耗

2022-01-12 来源:eefocus

一、低功耗模式介绍

根据STM8L15X的数据手册,可以知道该芯片有5种低功耗模式,如下:


1.等待模式: CPU时钟停止,选择的外设可继续运行,内部或外部中断或复位信号都可退出等待模式(WFE或WFI模式)。


2.低功耗运行模式: CPU和选择的外设在运行,由低速RAM或低速振荡器(LSI或LSE)执行完成。停止了闪存(flash memory)和EEPROM数据存储器,配置稳压器为超低功耗模式。单片机可通过软件进入低功耗运行模式,也可通过软件或复位退出该模式。


3.低功耗等待模式: 在低功耗运行模式下执行等待事件时进入此模式。除了CPU时钟被停止了,它和低功耗运行模式差不多。单片机可通过复位或内部或外部事件(由定时器、串行接口、DMA控制器(DMA1)、比较器和I/O端口生成的外设事件)触发唤醒此模式,当唤醒被其中一个事件触发时,系统会回到低功耗运行模式。


4.活跃停机模式: 除了RTC外,CPU和外设时钟停止。唤醒可由RTC中断、外部中断或复位触发。


5.停机模式: CPU和外设时钟停止,设备保持开机状态。RAM内容被保存,唤醒可由外部中断或复位来触发。一些外设也有从停止模式中唤醒的能力。可关闭内部参考电压来减少功耗。通过软件配置,也可在不等待内部参考电压唤醒时间的情况下唤醒设备,使其在5us后快速唤醒。

在这里插入图片描述

二、工程要求

1.低功耗模式,PB1口输入电压为0的时候,系统处于低功耗模式。


2.工作模式,PB1口输入电压大于某个值时,系统处于工作模式。


这里只是初步要求,后面可能要用RTC时钟来唤醒并发送信息(电池电量等)。


三、实现思路

初步思路:PB1对应的ADC采集口,一直处于开启状态,当采集值超过某个值时,唤醒进入工作模式,否则处于低功耗状态,但是从停机模式唤醒,这需要中断来触发。


而从数据手册得知,ADC中断无法唤醒Halt模式,所以这个思路行不通。

在这里插入图片描述

而在标准固件库看STM8的例程时,找到了一个通过COMP外设来唤醒的实例(COMP/COMP1_Halt):


This example shows how to configure the COMP peripheral to exit MCU from Halt mode. 

这个例子展示了如何配置COMP外围设备使MCU从Halt模式退出。

When the user presses the key push-button, the MCU enters Halt mode. 

当用户按下按键时,单片机进入停止模式。

And when the comparator 1 non inverting input (which is connected to the potentiometer) exceeds the internal reference voltage which is set to 1.22V,

当比较器1的非反相输入(连接到电位器)超过内部基准电压设置为1.22V时,

the comparator 1 causes the CPU to exit halt mode.

比较器1会使CPU退出halt模式。


COMP中断能够唤醒Halt模式,其中PB1也是连接至COMP1+的一个I/O口。

在这里插入图片描述

最终思路:利用COMP进行比较,比较器1的同相端(+)连接至PB1,反向端连接至 VREFINT ,其中 VREFINT 为内部基准电压1.22V,COMP1寄存器中CMP1OUT标志位:当非反相输入电压低于反相输入电压时,比较器1的输出低,该标志位为0;当非反相输入比反相输入电压高时,比较器1输出高,该标志位为1。所以我可以通过比较器输出标志来判断是否开启工作模式,而唤醒由COMP中断来完成,其触发方式为上升沿事件检测。

在这里插入图片描述

四、具体代码:

1.COMP1配置

根据数据手册中的Comparator block diagram和I/O groups and selection (continued),可知要想将PB1连接至COMP1+,将VREFINT 连接至COMP1-:


首先需要将PB1对应的I/O switches通道18打开。

在这里插入图片描述

接着开启模拟开关AS5和AS14,将PB1连接至COMP1+。


使能VREFINT 连接COMP1-的函数。


设置上升沿触发中断。

在这里插入图片描述

static void COMP_Config(void)

{

  /*PB1*/

  /* close the I/O switch number 4 */

  SYSCFG_RIIOSwitchConfig(RI_IOSwitch_18, ENABLE);

  /* close the analog switch number 14 */

  SYSCFG_RIAnalogSwitchConfig(RI_AnalogSwitch_14, ENABLE);

  /* close the analog switch number 1 */

  SYSCFG_RIAnalogSwitchConfig(RI_AnalogSwitch_5, ENABLE);

  /* Connect internal reference voltage to COMP1 inverting input */

  COMP_VrefintToCOMP1Connect(ENABLE);

  /* Enable COMP1 Interrupt */

  COMP_ITConfig(COMP_Selection_COMP1, ENABLE);

  /* Configure the event detection */

  COMP_EdgeConfig(COMP_Selection_COMP1, COMP_Edge_Rising);

}


2.工作模式切换

工作模式切换主要用了stm8l15x_comp.c中的COMP_GetOutputLevel()函数来判断当前处于什么状态,低功耗模式因为还没有仪器进行测量,现在只是单纯进入停机模式,可在停机前加上关闭所有外设,拉低所有I/O口等等操作,从停机模式唤醒后可以再对相应外设进行初始化。


这里需要注意的是:ADC和COMP1无法同时使用,因为它们共享同一组模拟开关,所以用到ADC的时候,需要关闭COMP,而停机前需关闭ADC,再开启COMP。


/**

  * @brief  Main program.

  * @param  None

  * @retval None

  */

void main(void)

{

   /* CLK configuration -------------------------------------------*/

  CLK_Config(); 

  /* Key button configuration */

  Key_Init();

  /* Initialize Leds,OLED */

  Led_Init();

  OLED_Init();

  OLED_Clear();

  OLED_ShowString(0,0,'  Hello World!');

   /* COMP configuration -------------------------------------------*/

  COMP_Config(); 

  /* Enable Interrupts */

  enableInterrupts();


  GPIO_SetBits(LED_PORT,LED2);

  /* Infinite loop */

  while (1)

  {

    if (COMP_GetOutputLevel(COMP_Selection_COMP1) == COMP_OutputLevel_High)

    {

    //工作模式:

      /* A rising edge is detected so the input voltage is over VREFINT

       and the ADC will be turned on for monitoring input voltage, the COMP2 will be off */

      GPIO_SetBits(GPIOA,GPIO_Pin_6);

       /* Toggle LDE1..4 */

      GPIO_ToggleBits(LED_PORT,LED2);

      /* Insert delay */

      Delay_ms(50);

      if(Flash_Flag)    LED_Flash();

      /*KEY*/

      Key_Function();

      /*DISPLAY*/

      System_Display();

    }

    else

    {

    //低功耗模式:

      //关闭所有外设(除了COMP),将所有IO口拉低,

      halt();

      //开启相关外设及初始化。

    }

    

  }

}


五、总结

现在还是初步探索STM8低功耗模式,STM8系列单片机主打的就是低功耗,这里面感觉学问还是挺多的,后面可能还有学一下RTC时钟唤醒停机模式(也就是活跃停机模式)。这次也提醒我,当思路遇阻时,可以看看官方固件库例程,所有的外设都有相应的例程,可以从其中来找到新的办法,如果只是对代码的一味地移植,学到的东西没有这条途径多,所以可以多看看数据手册和官方固件库中给的例程。


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 光控音效发生器电路

  • 如何利用ESP8266制作一个简单的四轴飞行器

  • 一个简单的警笛电路图

  • 基于IC555的可变PWM振荡器电路

  • 分享一个电网倾角计电路

  • 一种构建12V和230V双直流电源的简单方法

    相关电子头条文章