#申请原创#
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();
}
|