打印
[STM32U0]

【STM32U083测评】测评之二:低功耗功耗测评

[复制链接]
3141|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
#申请原创#    
STM32U083
STM32U083x系列提供高达256 KB的Flash存储器和高达40 KB的SRAM,具有八种封装方式,包括32至81引脚的UFQFPN、WLCSP、LQFP和UFBGA封装。 
STM32U083x器件提供:
  • 一个12位ADC,两个内置的轨到轨模拟比较器,一个运算放大器
  • 一个低功耗RTC,一个通用32位定时器,一个专门用于电机控制的16位PWM定时器,三个通用16位定时器以及三个16位低功耗定时器。
  • 多达21个电容感应通道
  • 三个I2C、两个SPI、四个USART和两个低功耗UART,以及一个支持设备模式的无晶振USB2.0。
  • 一个带内部升压转换器的LCD控制器,可以驱动8x48或4x52个段码。
  • STM32U083xC器件内置了一个AES硬件加速器。



低功耗特性:
根据规格书STM32U0 :
*1.71 V至3.6 V电源
*-40°C至85/125°C的温度范围
*VBAT模式:130 nA(带RTC和9个32位备份寄存器)
*关机模式(6个唤醒引脚):
*16nA待机模式(6个唤醒引脚):
*带RTC的160 nA,不带RTC的30 nA
*Stop 2模式:带RTC的825 nA,不带RTC的695 nA
*运行Mode(LDHmode):52uA/MHZ
*批量采集模式
*4uA从停止模式唤醒用户
*断电复位
   在STM32微控制器家族中,MSI指的是Multi-Speed Internal Oscillator(多速内部振荡器)。对于STM32U0系列来说,MSI是一种灵活的内置低功耗振荡器,它可以生成多种频率的时钟信号,无需外部晶振或陶瓷谐振器。STM32U0系列中的MSI时钟源可以在一定范围内调整其输出频率,这样设计人员可以根据系统需求选择合适的时钟速度,既可以满足性能要求,也能优化功耗。在STM32U0系列中,MSI时钟源支持多个预定义的频率输出级别,这对于在低功耗模式下操作特别有用,因为它可以在不增加外部组件成本的同时提供稳定的时钟信号,从而简化系统设计并降低成本。此外,由于它是内部振荡器,因此不受外部环境温度和电压波动的影响,提高了系统的稳定性和可靠性。

  CubeMX  需要升级到6.11才可以对STM32U0支持。
   STM32U0的低功耗编程主要涉及配置微控制器进入不同的低功耗模式,以及管理这些模式的进入和退出条件。
1). 选择合适的低功耗模式
STM32U0支持多种低功耗模式,包括睡眠模式、停止模式和待机模式。根据应用的需求,选择合适的模式非常重要。
  • 睡眠模式:CPU停止工作,但外设时钟保持开启。这种模式适用于外设需要持续运行但CPU不需要处理任务的场景。
  • 停止模式:所有时钟都停止,但SRAM和寄存器内容保持不变。这种模式适用于需要快速唤醒的场景。
  • 待机模式:功耗最低,关闭了1.8V的内核电源。这种模式适用于长时间不需要工作的场景。
2). 配置外设
在进入低功耗模式之前,需要配置好外设的行为。例如,如果使用了外部中断来唤醒微控制器,那么需要配置相应的中断引脚,并设置中断优先级和触发条件。
3). 配置时钟系统
进入低功耗模式时,需要关闭不必要的时钟信号以降低功耗。这包括CPU时钟、外设时钟等。根据选择的低功耗模式,合理配置时钟系统是关键。

  通过板子建立工程

时钟配置


配置GPIO


功耗测评之一:测试MSI(Multi-Speed Internal)时钟频率对功耗的变化


static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
/* USER CODE BEGIN MX_GPIO_Init_1 */
/* USER CODE END MX_GPIO_Init_1 */

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_RESET);

  /*Configure GPIO pin : LED0_Pin */
  GPIO_InitStruct.Pin = LED0_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(LED0_GPIO_Port, &GPIO_InitStruct);

/* USER CODE BEGIN MX_GPIO_Init_2 */
/* USER CODE END MX_GPIO_Init_2 */
}

  RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_11; RCC_MSIRANGE_11 是STM32微控制器中的一个宏定义,它通常用于配置MSI(Multi-Speed Internal)时钟的范围。MSI是STM32微控制器内部的一个时钟源,它可以提供不同的频率范围。
通过JP5测试功耗:48M满速跑仅仅4.23 MA。

改为10
RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_10;

电流2.84MA

依次类推:
RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_9; 电流2.17MA。
RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_8; 电流1..48MA。
RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_8; 电流1..48MA。
RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_7; 电流0.78MA。
RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_6; 电流457uA。
RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_5; 电流: 286uA。

RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_4; 电流: 201uA。
RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_3; 电流:182 uA。
RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_2; 电流:148 uA。
RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_1; 电流: 132uA。
RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_0; 电流: 126uA。
小结:
    MSI(Multi-Speed Internal)是STM32系列微控制器内置的一种可调节频率的内部RC振荡器,其特点是能够在多个预定义的频率之间切换,以便优化系统的性能与功耗之间的平衡。通过测试发现MSI时钟频率对功耗很大。
  • 时钟速度与功耗的关系:
    • 一般来说,时钟频率越高,MCU消耗的功率也就越大,因为更高的时钟速度意味着更快的运算速度和更多的开关动作,这些都会增加动态功耗。
    • 当降低MSI时钟频率时,由于内部电路的工作频率降低,动态功耗会随之减少。
  • 休眠和低功耗模式:
    • 在进入低功耗模式时(如睡眠、停止或待机模式),即使MSI时钟仍在运行,它的频率也会影响唤醒延迟时间和唤醒过程中的瞬态功耗。通常情况下,更低的MSI频率会导致更长的唤醒时间,但可以进一步降低微控制器在低功耗模式下的电流消耗。
  • 外围设备同步:
    • MCU的各个外围设备时钟通常是由系统时钟分频得到,所以选择合适的MSI频率不仅影响整体系统性能,还会影响外围设备的功耗。某些设备在较低时钟频率下可能工作更节能。
  • 省电策略:
    • 在满足系统性能要求的前提下,选择较低的MSI时钟频率是一种有效的节能措施。在实时性要求不高的应用场合,适当降低时钟频率可以帮助降低总体功耗。通过调整STM32的MSI时钟频率,可以在性能和功耗之间找到最佳折衷方案,从而在不同应用场景下优化系统的能源效率。在设计时,应根据实际需求选择最合适的时钟速度,并结合其它低功耗技术(如智能电源管理、唤醒源选择等)来实现最优的功耗表现


功耗测评之二:睡眠模式(Sleep Mode)
   睡眠模式下,STM32U0 停止工作,但外设可以继续运行(如果有需要的话)。进入和退出睡眠模式可通过以下步骤:
  • 配置唤醒源 根据需求配置相应的唤醒源,比如可以选择一个或多个中断作为唤醒源。这可以通过配置相关的GPIO中断、EXTI(外部中断/事件控制器)、RTC闹钟、USART等。
  • 禁用非必要的外设时钟 关闭那些在睡眠期间不需要工作的外设的时钟,以降低功耗。
  • 调用固件库函数 如果使用STM32标准库或HAL库,可以直接调用库函数来进入睡眠模式:HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI); 其中,第一个参数指定电源模式(在某些MCU系列上可选),第二个参数指定进入睡眠的方式,WFI(Wait For Interrupt)表示等待中断,WFE(Wait For Event)表示等待事件。




关机模式(Shutdown Mode)意味STM32u083着几乎所有的内部电路都会被断电,仅保留备份寄存器和复位逻辑。进入关机模式通常是为了达到最低功耗状态,唤醒则需要通过特定的唤醒源,比如NRST引脚上的低电平持续一段时间或者RTC闹钟事件.
  调用指令:HAL_PWR_EnterSHUTDOWNMode();万用表检测不到电流了。只有重新复位才唤醒。请注意,一旦执行这个函数,CPU立即进入关机状态,不会执行后续代码。需要不断复位才能重新烧录程序。
唤醒处理:
如果通过NRST引脚低电平触发唤醒,则在复位后执行的main()函数开头应该包含重启后的初始化代码。
若是通过RTC闹钟唤醒,则在复位并初始化后,需要检查RTC的状态以确定是正常的上电还是由RTC闹钟引起的唤醒。


  功耗测评之三:待机模式

待机模式Standby Mode)是一种深度低功耗模式,该模式下,CPU、内核时钟以及大多数外设都被关闭,只有SRAM和寄存器的内容丢失,备份域(Backup Domain)的寄存器以及RTC(如果有的话)仍保持供电并继续运行。
int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
//        HAL_PWR_EnterSHUTDOWNMode();

   HAL_PWR_EnterSTANDBYMode();
  while (1)
  {
   }
}
               
电流0.1UA




总体测试

串口2打印,LED闪烁五次,进入待机模式:电流从4.65MA进入待机功耗机几乎味0uA,测不到了电流了。


static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
/* USER CODE BEGIN MX_GPIO_Init_1 */
/* USER CODE END MX_GPIO_Init_1 */

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOC_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_RESET);

  /*Configure GPIO pin : LED0_Pin */
  GPIO_InitStruct.Pin = LED0_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(LED0_GPIO_Port, &GPIO_InitStruct);

/* USER CODE BEGIN MX_GPIO_Init_2 */
/* USER CODE END MX_GPIO_Init_2 */
}



int main(void)
{
  /* USER CODE BEGIN 1 */


  HAL_Init();


  SystemClock_Config();

  /* USER CODE BEGIN SysInit */
  /* Initialize BSP Led for LED4 */
  BSP_LED_Init(LED4);
  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */

  /* Output a message on Hyperterminal using printf function */
//  printf("\n\r UART Printf Example: retarget the C library printf function to the UART\n\r");
//  printf("** Test finished successfully. ** \n\r");
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    printf("time: 5\r\n");
   HAL_GPIO_TogglePin(LED4_GPIO_PORT, LED4_PIN);
    HAL_Delay(1000);
    printf("time: 4\r\n");
     HAL_GPIO_TogglePin(LED4_GPIO_PORT, LED4_PIN);
    HAL_Delay(1000);
    printf("time: 3\r\n");
    HAL_GPIO_TogglePin(LED4_GPIO_PORT, LED4_PIN);
    HAL_Delay(1000);
    printf("time: 2\r\n");
      HAL_GPIO_TogglePin(LED4_GPIO_PORT, LED4_PIN);
    HAL_Delay(1000);
    printf("time: 1\r\n");
     HAL_GPIO_TogglePin(LED4_GPIO_PORT, LED4_PIN);
    HAL_Delay(1000);
    printf("进入系统待机模式\r\n");
    HAL_PWR_EnterSTANDBYMode();

  }
  /* USER CODE END 3 */
}

/**
  * [url=home.php?mod=space&uid=247401]@brief[/url] System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Configure the main internal regulator output voltage
  */
  HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_MSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.MSIState = RCC_MSI_ON;
  RCC_OscInitStruct.MSICalibrationValue = RCC_MSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_11;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }




使用特权

评论回复
沙发
LEDyyds| | 2024-4-25 14:03 | 只看该作者
板子上的那个黄灯不会影响测试吗

使用特权

评论回复
评论
abner_ma 2024-4-25 15:49 回复TA
功耗特小,有MOS管隔离,灌电流。官方要求点灯测试 
板凳
qintian0303| | 2024-4-25 16:20 | 只看该作者
这个低功耗测试,需要在前面加点延时吗?经常有开机进入低功耗导致无法调试的情况

使用特权

评论回复
评论
abner_ma 2024-4-28 14:53 回复TA
复位即可 
地板
地瓜patch| | 2024-4-27 21:28 | 只看该作者
万用表的电流精度不适合测量uA/nA级别低功耗电流吧
精度够么

使用特权

评论回复
评论
abner_ma 2024-4-28 14:54 回复TA
我这万用表500多元呢1正版FLUKE 15B+,当然有专业仪器更好 
5
地瓜patch| | 2024-4-27 21:30 | 只看该作者
万用表的电流档精度测量nA/uA级别低功耗电流不合适吧,精度不够

使用特权

评论回复
6
中国龙芯CDX| | 2024-4-28 18:09 | 只看该作者
福禄克的电流表还是比较准确的,但uA级别的是不是需要放大会更好

使用特权

评论回复
7
鹿鼎计| | 2024-4-28 18:58 | 只看该作者
待机模式Standby Mode,待机模式能开启外部中断吗?

使用特权

评论回复
8
软核硬核| | 2024-4-28 19:31 | 只看该作者
感觉测试的结果,比官方标称的多一些。

使用特权

评论回复
9
米多0036| | 2024-4-28 21:06 | 只看该作者
这个万用表精度不够吧?感觉需要更好的再测测。

使用特权

评论回复
10
天奕| | 2024-5-5 09:24 | 只看该作者
测试结果不准,还是什么原因 ,睡眠模式这么高

使用特权

评论回复
11
chenjun89| | 2024-5-5 12:58 | 只看该作者
ST的L系列才是低功耗MCU

使用特权

评论回复
12
137017878| | 2024-5-6 11:23 | 只看该作者
有对比和STM32前几代产品有哪些提升吗?

使用特权

评论回复
13
yangweiping| | 2024-5-13 11:58 | 只看该作者
0.几个uA,性能还是强大。

使用特权

评论回复
14
jlc317| | 2024-6-3 19:53 | 只看该作者
用台式表测量岂不更好

使用特权

评论回复
15
wzx1994| | 2024-6-24 09:26 | 只看该作者
万用表测量出来的结果,还是挺可观的。虽然可能这个精度还需要更准确才能体现出它低功耗的强悍,但是对于实际应用来说,这个功耗基本符合大部分低功耗产品了

使用特权

评论回复
16
OKAKAKO| | 2024-6-24 20:27 | 只看该作者
低功耗建议还是把一个误差率也描述一下会更有信服力

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:项目经理
简介:资深嵌入式开发工程师

83

主题

156

帖子

3

粉丝