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时钟唤醒停机模式(也就是活跃停机模式)。这次也提醒我,当思路遇阻时,可以看看官方固件库例程,所有的外设都有相应的例程,可以从其中来找到新的办法,如果只是对代码的一味地移植,学到的东西没有这条途径多,所以可以多看看数据手册和官方固件库中给的例程。