STM32L051低功耗的应用

STM32L051是ST推出的一款新的低功耗产品,相比STM32其他系列芯片,使用的人确实较少,资料也不是很多,但是其低功耗的性能优势还是比较大。官方给出的参数如下:


STM32L051低功耗的应用_第1张图片

本次STM32L051是应用于一款低功耗传感器节点产品上,产品的主要功能是传感器节点采集数据,通过ZIGBEE传输到主机,传感器节点采用纽扣电池供电,数据的传输周期暂定10s一次。在低功耗设计的思路上,采用的是节点无数据传输时,单片机关闭ZIGBEE模块电源,并将除烧录口外的所有IO设置为模拟输入模式,关闭所有外设的时钟,然后单片机进入STOP模式。唤醒采用RTC定时唤醒,RTC由单独的时钟LSI驱动。唤醒后重新配置要使用的IO和外设,发送数据。

低功耗设计的过程中,难点是相关时钟和电源的配置管理,进入STOP,配置RTC唤醒功能。由于STM32L051资料较少,网上也很难找到参考的代码,使得开发过程相对困难。在开发过程中前期查找芯片相关参考资料耗费了不少时间,而且几乎都是英文手册,最后找到一份STM32L0x3系列的中文参考手册(RM0367),将低功耗、电源管理和RTC相关章节看懂。程序编写参考的是官方STM32L053C8-Discovery例程里边的PWR_STOP_RTC一个DEMO,基于HAL库的。


STM32L051低功耗的应用_第2张图片

PWR_STOP_RTC例程移植过来基本就能够实现停止模式和唤醒的功能了。

调试过程中出现的两个比较麻烦的问题,一个是芯片进入停止模式之后,唤醒没有成功,导致程序不能下载,按照一些论坛里边的说法,接上RST脚重新下载,还是不成功,更换JLINK为STLINK,依然下不进程序。后边更换板子,修改唤醒功能,直到唤醒功能成功,板子在唤醒的状态下能够通过STLINK下载程序了。

第二个问题是唤醒之后,串口一直不能工作,停止前关闭了所有的外设,唤醒时也重新初始化过,串口还是不能工作;反复调试发现是HAL库的串口初始化函数要判断一个状态复位:

if(huart->gState == HAL_UART_STATE_RESET)

  {

    /* Allocate lock resource and initialize it */

    huart->Lock = HAL_UNLOCKED;

    /* Init the low level hardware : GPIO, CLOCK */

    HAL_UART_MspInit(huart);

  }

重新调用串口初始化函数时huart->gState的条件不正确,解决这个问题的方法是,关闭串口功能时需要使用 HAL_UART_DeInit(&huart1);才能将相关状态全部关闭复位。重新初始化串口就能使用了。

软件功能正确之后,整个节点板子在停止模式的时候电流在10uA,发数据的时候电流在25~30mA。为了降低停止时的电流,还可以将板子上的一些上拉电阻阻值加大,降低消耗功率的任何一个因素。

你可能感兴趣的:(STM32L051低功耗的应用)