【温酒笔记】电源管理-低功耗模式(一)

情系淮思:五款车规MCU横向对比与VCU选型 本文对比五款车规MCU中的S32K312与S32K324,聚焦核心架构、存储、通信及安全特性。S32K324为双核160MHz Cortex-M7,内存、外设(如以太网、QuadSPI、SAI)全面升级,支持高实时并行处理与复杂应用;而S32K312为单核120MHz,适用于中端车身控制。两者均满足ASIL B功能安全,具备完整安全引擎。选型建议:中端用S32K312,高端复杂系统优选S32K324。 阅读详情

参考资料:野火电子F103文档
参考资料:STM32F1XX数据手册(官方)

1. 休眠模式

  1. 休眠指令
 /** brief  等待中断

     等待中断 是一个暂停执行指令
     暂停至任意中断产生后被唤醒
 */
 #define __WFI                             __wfi

  __WFI();//中断唤醒

 /** brief  等待事件

     等待事件 是一个暂停执行指令
     暂停至任意事件产生后被唤醒
 */
 #define __WFE                             __wfe

 __WFE();//事件唤醒
  1. 停止模式
 /**
 * @brief 进入停止模式
 * @note 在停止模式下所有I/O都会保持在停止前的状态
 * @note 从停止模式唤醒后,会使用HSI作为时钟源
 * @note 调压器若工作在低功耗模式,可减少功耗,但唤醒时会增加延迟
 * @param Regulator: 设置停止模式时调压器的工作模式
 *        @arg PWR_MAINREGULATOR_ON: 调压器正常运行
 *        @arg PWR_LOWPOWERREGULATOR_ON: 调压器低功耗运行
 * @param STOPEntry: 设置使用WFI还是WFE进入停止模式
 *        @arg PWR_STOPENTRY_WFI: WFI进入停止模式
 *        @arg PWR_STOPENTRY_WFE: WFE进入停止模式
 * @retval None
 */
 void HAL_PWR_EnterSTOPMode(uint32_t Regulator, uint8_t STOPEntry)

要注意的是进入停止模式后,STM32的所有I/O都保持在停止前的状态,而当它被唤醒时,STM32使用HSI作为系统时钟(8MHz)运行,由于系统时钟会影响很多外设的工作状态,所以一般我们在唤醒后会重新开启HSE,把系统时钟设置回原来的状态
3. 待机模式

 /**
 * @brief 进入待机模式
 * @note 待机模式时,除了以下引脚,其余引脚都在高阻态:
 *          - 复位引脚
 *          - RTC_AF1 引脚 (PC13)(需要使能侵入检测、时间戳事件或RTC闹钟事件)
 *          - RTC_AF2 引脚 (PI8) (需要使能侵入检测或时间戳事件)
 *          - WKUP 引脚 (PA0) (需要使能WKUP唤醒功能)
 * @retval None
 */
 void HAL_PWR_EnterSTANDBYMode(void)

在进入待机模式后,除了被使能了的用于唤醒的I/O,其余I/O都进入高阻态,而从待机模式唤醒后,相当于复位STM32芯片,程序重新从头开始执行

当系统处于停止模式低功耗状态时(包括睡眠模式及待机模式),使用DAP下载器是无法给芯片下载程序的,所以下载程序时要先把系统唤醒

2. 电源电压监测

STM32芯片主要通过引脚VDD从外部获取电源,在它的内部具有电源监控器用于检测VDD的电压,以实现复位功能及掉电紧急处理功能,保证系统可靠地运行

可编程电压检测器PVD
电压阈值与外部供电电压VDD比较,当低于工作阈值时,会直接进入复位状态,这可防止电压不足导致的误操作
STM32还提供了可编程电压检测器PVD,它也是实时检测VDD的电压,当检测到电压低于编程的VPVD阈值时,会向内核产生一个PVD中断(EXTI16线中断)以使内核在复位前进行紧急处理

3. STM32电源系统组成

  1. ADC独立电源接口
  2. 调压器供电称为1.8V电源域,包括内核,RAM等
    正常运行模式:1.8V 全功率
    停止模式:1.8V 时钟关闭,外设停止,保留寄存器和RAM
    待机模式: 1.8V 断电,寄存器,RAM丢失
  3. 备份电源区
    给LSE和RTC供电

4.低功耗模式

在这里插入图片描述
在这里插入图片描述

5. 睡眠模式

内核时钟关闭,内核停止
外设正常运行

6. 停止模式

所有时钟都停止
所有外设都停止
内核寄存器,RAM保存

7. 待机模式

所有时钟关闭
RAM清除
唤醒后重启

8. 停止模式代码备份

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2024 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "rtc.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

uint32_t main_cnt =0;
		
extern void board_sleep_init(void);
extern void board_enter_sleep(void);
extern void board_exit_sleep(void);
/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
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();
  MX_RTC_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
	
	//获取重新配置后的时钟状态
	 uint32_t SYSCLK_Frequency=0;
	 uint32_t HCLK_Frequency=0;
	 uint32_t PCLK1_Frequency=0;
	 uint32_t PCLK2_Frequency=0;
	 uint32_t SYSCLK_Source=0;
	 SYSCLK_Frequency = HAL_RCC_GetSysClockFreq();
	 HCLK_Frequency   = HAL_RCC_GetHCLKFreq();
	 PCLK1_Frequency  = HAL_RCC_GetPCLK1Freq();
	 PCLK2_Frequency  = HAL_RCC_GetPCLK2Freq();
	 SYSCLK_Source    = __HAL_RCC_GET_SYSCLK_SOURCE();
	 
	 printf("SYSCLK_Frequency=%d\r\n", SYSCLK_Frequency);
	 printf("HCLK_Frequency=%d\r\n", HCLK_Frequency);
	 printf("PCLK1_Frequency=%d\r\n", PCLK1_Frequency);
	 printf("PCLK2_Frequency=%d\r\n", PCLK2_Frequency);
	 printf("SYSCLK_Source=%d\r\n", SYSCLK_Source);
	 
	 HAL_Delay(5000);
	 
	 board_sleep_init();
	 
	//关闭板载指示灯
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2, GPIO_PIN_RESET);
	HAL_Delay(2000);
	HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2, GPIO_PIN_SET);
	HAL_Delay(2000);
	 
	 
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		printf("sleep main_cnt= %d\r\n", main_cnt);
		HAL_Delay(1000);
		board_enter_sleep();
		HAL_Delay(1000);
		printf("wakeup\r\n");
		
  }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};

  /** Configure the main internal regulator output voltage
  */
  __HAL_PWR_VOLTAGESCALING_CONFIG(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_LSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.LSIState = RCC_LSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLLMUL_4;
  RCC_OscInitStruct.PLL.PLLDIV = RCC_PLLDIV_2;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
  {
    Error_Handler();
  }
  PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_RTC;
  PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
  PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSI;
  if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
  {
    Error_Handler();
  }
}

/* USER CODE BEGIN 4 */


void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *hrtc)
{
		main_cnt++;

}

void board_sleep_init(void)
{
	// 使能电源接口时钟
	__HAL_RCC_PWR_CLK_ENABLE();

	// 允许备份区域访问
	HAL_PWR_EnableBkUpAccess();

	// 禁用可编程电压检测器 (PVD)
	HAL_PWR_DisablePVD();


}


void board_enter_sleep(void)
{
	
	  //禁用串口
		HAL_UART_DeInit(&huart1);
	
		// 禁用 GPIOA 端口时钟
		__HAL_RCC_GPIOA_CLK_DISABLE();

		// 禁用 GPIOB 端口时钟
		__HAL_RCC_GPIOB_CLK_DISABLE();

		// 禁用 GPIOC 端口时钟
		__HAL_RCC_GPIOC_CLK_DISABLE();

		// 禁用 GPIOH 端口时钟
		__HAL_RCC_GPIOH_CLK_DISABLE();

		// 使能超低功耗模式
		HAL_PWREx_EnableUltraLowPower();

		// 使能快速唤醒功能
		HAL_PWREx_EnableFastWakeUp();

		// 禁用调试接口在 STOP 模式下的调试功能
		HAL_DBGMCU_DisableDBGStopMode();

		// 禁用调试接口在睡眠、停止和待机模式下的低功耗配置
		HAL_DBGMCU_DBG_DisableLowPowerConfig(DBGMCU_SLEEP | DBGMCU_STOP | DBGMCU_STANDBY);
		
    // 清除唤醒标志
    __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);	
    

		// 注释掉的代码:禁用 RTC 唤醒定时器
		// HAL_RTCEx_DeactivateWakeUpTimer(&hrtc);

		// 注释掉的代码:设置 RTC 唤醒定时器中断,周期为 60 个 RTC 时钟周期
		// HAL_RTCEx_SetWakeUpTimer_IT(&hrtc, 60, RTC_WAKEUPCLOCK_CK_SPRE_16BITS);

		// 配置 STOP 模式下的唤醒时钟为 HSI
		__HAL_RCC_WAKEUPSTOP_CLK_CONFIG(RCC_STOP_WAKEUPCLOCK_HSI);
	
		// 进入 STOP 模式,使用低功耗稳压器,并通过等待中断 (WFI) 指令进入 STOP 模式
		HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);  

		board_exit_sleep();
      
}
void board_exit_sleep(void)
{
		// 检查唤醒标志是否被设置
		if (__HAL_PWR_GET_FLAG(PWR_FLAG_WU) != RESET)
		{
			// 如果唤醒标志被设置,则清除唤醒标志
			__HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU);  
		}

		// 检查待机标志是否被设置
		if (__HAL_PWR_GET_FLAG(PWR_FLAG_SB) != RESET)
		{
			// 如果待机标志被设置,则清除待机标志
			__HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB);  
		}

		// 配置系统时钟
		SystemClock_Config();

		// 使能 GPIOA 端口时钟
		__GPIOA_CLK_ENABLE();

		// 使能 GPIOB 端口时钟
		__GPIOB_CLK_ENABLE();

		// 使能 GPIOC 端口时钟
		__GPIOC_CLK_ENABLE();

		// 使能 GPIOH 端口时钟
		__GPIOH_CLK_ENABLE();

		// 初始化 USART1 UART 接口
		MX_USART1_UART_Init();
}

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  __disable_irq();
  while (1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

### STM32L051低功耗调试笔记


## 第一步

* 使用的是STM32L051
* 使用的是停止模式
* 系统时钟+RTC中断唤醒, 休眠的时候是1uA的功耗
* 所有IO都设置为模拟输入
* GPIO始终有一个输入通道,可以是数字或模拟通道。

  如果不需要读取GPIO数据,则优先配置为模拟输入。
  这节省了输入施密特触发器的消耗。

  在STM32CubeMX配置中都有这么一个选项:
  将不用引脚配置为模拟状态
* 测试RTC唤醒工作的话功耗为6MA


## 第二步

* 唤醒后初始化串口,打印输出日志,每次输出值自增
* 可以看到RAM保持,数据没有被清楚掉
* 功耗为1uA
* 休眠失能串口,唤醒使能串口

## 第三步

 测试功耗的时候注意使用3.3 V电源供电,不然功耗


9. PVD电源监控备份

 void PVD_Config(void)
 {
     PWR_PVDTypeDef sConfigPVD;

     /*使能 PWR 时钟 */
     __PWR_CLK_ENABLE();
     /* 配置 PVD 中断 */
     /*中断设置,抢占优先级0,子优先级为0*/
     HAL_NVIC_SetPriority(PVD_IRQn, 0 ,0);
     HAL_NVIC_EnableIRQ(PVD_IRQn);

     /* 配置PVD级别5 (PVD检测电压的阈值为2.8V,
     VDD电压低于2.8V时产生PVD中断,具体数据
     可查询数据手册获知) 具体级别根据自己的
     实际应用要求配置*/
     sConfigPVD.PVDLevel = PWR_PVDLEVEL_5;
     sConfigPVD.Mode = PWR_PVD_MODE_IT_RISING_FALLING;
     HAL_PWR_ConfigPVD(&sConfigPVD);
     /* 使能PVD输出 */
     HAL_PWR_EnablePVD();
 }

 void PVD_IRQHandler(void)
 {
     HAL_PWR_PVD_IRQHandler();
 }
 /**
 * @brief  PWR PVD interrupt callback
 * @param  None
 * @retval None
 */
 void HAL_PWR_PVDCallback(void)
 {
     /* 亮红灯,实际应用中应进入紧急状态处理 */
     LED_RED;
 }

注意这个中断服务函数的名是PVD_IRQHandler而不是EXTI16_IRQHandler(STM32没有这样的中断函数名),示例中我们仅点亮了LED红灯,不同的应用中要根据需求进行相应的紧急处理。

21 硬件工程师笔面试高频考点真题解析——单片机 本文系统介绍了单片机的核心概念与应用知识,包括:单片机定义与选型要点(性能、存储、外设等);核心参数(主频、I/O、通信接口等);最小系统组成(电源、复位、晶振、BOOT);常见外设(GPIO、ADC、定时器等);GPIO工作模式(输入/输出);死机原因分析(硬件干扰、软件错误等);上电故障排查流程(电源、时钟、程序等);与DSP、FPGA的对比(控制vs运算vs可编程);常用通信总线特点(UART、I2C、SPI、CAN);看门狗功能(超时复位防死机)。内容涵盖单片机硬件设计关键要点,适合嵌入式开发者参考 阅读详情

相关推荐

NV MCU与SoC的交互

MCU通过IST_REQ信号触发SoC执行IST,由IST_DONE_N通知完成,SOC_RESET_N由MCU控制。MCU与SoC间通过通信通道(如以太网)传输IST结果。热/电压监测通过I2C实现,阈值由MCU初始设置、SoC动态更新,异常可中止IST。客户应用可在检测严重错误时通过IST管理器中止IST,相关原因与状态将被记录。

liu-yonggang的专栏 54

第42章 电源管理—实现低功耗—零死角玩转STM32-F429系列

第42章 电源管理—实现低功耗 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/firege 本章参考数据:《STM32F4xx 中文参考手册》、《STM32F4xx规格书》、库说明文档《stm32f4xx_dsp_stdperiph_lib...

aicai1841的博客 1015

FPGA工程师必看:JESD204B同步机制实战指南(含SYSREF信号调试技巧)

本文为FPGA工程师提供了一份JESD204B同步机制的实战指南,重点聚焦于SYSREF信号的调试技巧。文章从同步的核心逻辑出发,深入剖析了时钟、SYSREF与对齐序列这“三驾马车”的协作,并详细阐述了硬件PCB布局、FPGA IP核配置、状态机监控以及使用示波器进行波形分析等关键实战步骤,旨在帮助工程师解决多通道高速系统中的同步难题,确保链路的稳定与确定性延迟。

weixin_29239661的博客 333

【温酒笔记】电源管理(二)

4.PLL是一个耗电大户,如果做低功耗还是把PLL禁用,直接HSE/HSI/MSI到SYSCLK。要使停止模式下的功耗最低,内部 Flash 也进入低功耗模式。5.内核电压,根据不同的运行速度和VDD电压调节动态调压器,达到速度与功耗的平衡。0.3 μA 停机模式:无实时时钟运行,保存上下文,保留RAM内容。在停止模式下,所有 I/O 引脚的状态与运行模式下相同。调压器既可以配置为正常模式,也可以配置为低功耗模式。在停止模式下,VCORE 域中的所有时钟都会停止,6μA低功耗运行模式,32kHz运行频率。

Longrun的博客 383

深入NAND Flash信号与接口:结合ONFI 5.0协议,聊聊DBI、ODT和差分信号到底在解决什么实际问题

本文深入探讨了NAND Flash信号与接口设计,结合ONFI 5.0协议,详细解析了DBI、ODT和差分信号等技术如何解决高速数据传输中的信号完整性问题。通过实际案例和数据,展示了这些技术在降低功耗、减少噪声和提升抗干扰能力方面的显著效果,为存储工程师提供了宝贵的实践参考。

weixin_33736649的博客 343

Win10下YOLOv8环境搭建避坑指南:从CUDA 11.6到cuDNN配置全流程

本文详细介绍了在Windows 10系统下搭建YOLOv8环境的完整流程,包括CUDA 11.6和cuDNN的配置步骤,以及常见问题的解决方案。通过硬件准备、软件安装、环境验证和性能优化等环节,帮助开发者高效完成YOLOv8环境配置,提升目标检测项目的开发效率。

defi6farmer的博客 225

【温酒笔记】电源管理-GPIO浮空输入

‌电平波动引发动态漏电流‌浮空输入状态下,IO引脚处于高阻态,其电平易受电磁干扰或寄生电容影响,导致内部MOS管栅极电压在0V至VDD间波动,形成动态充放电路径。这种波动会持续消耗约5-8μA电流‌34。‌内部保护二极管导通路径‌当浮空引脚因干扰产生高于VDD或低于GND的电压时,内部ESD保护二极管导通。例如,引脚电压>VDD时,电流路径为:引脚→VDD→电源→GND,典型漏电流约3-5μA‌68。‌输入缓冲器的静态功耗‌施密特触发器在浮空输入模式下处于激活状态。

Longrun的博客 917

Python+OpenCV实战:5分钟搞定机械臂手眼标定(眼在手上模式)

本文详细介绍了使用Python和OpenCV在5分钟内完成机械臂手眼标定(眼在手上模式)的实战教程。通过解析相机坐标系与机械臂基坐标系的转换关系,提供从数据采集到标定矩阵计算的全流程代码实现,帮助开发者快速解决AX=XB问题,提升机械臂视觉引导精度。

weixin_33670786的博客 498

基本定时器(TIM6/TIM7)

基本定时器最简单,就干一件事:到点了触发中断。定时器本质就是计数器,每个时钟脉冲加1,数到ARR就溢出、产生中断、清0重来。三个核心寄存器:PSC(预分频器):对输入时钟分频CNT(计数器):从0往上数ARR(自动重装载值):数到这个值就溢出,CNT清0,产生更新中断公式:  定时周期 = (PSC+1) × (ARR+1) / 定时器时钟  更新事件频率 = 定时器时钟 / ((PSC+1) × (ARR+1)) 例:TIM6时钟84MHz,要定时0.5秒(2

2401_89890233的博客 256

Unity - gamma space下还原linear space效果

还有头发之后的 (头发没有处理完整,因为使用 ASE 连连看练出来的,使用 surface shader,虽然可以生成一下 vert, frag 的方式在修改,但是我懒得去修改了,这样就是 PBR 的 BRDF 里面的部分曲线是不一样的,所以可以看到头发有一些差异)其实上面的代码判断 是否有分量 > 1.0f 的方式来判断是否 HDR 是不太合理的,因为不同的贴图格式的编码方式不同。还有比较隐蔽的一些颜色相关的常量值 (比如PBR中的 绝缘体的 F0 常量值,等等)

Jave.Lin 的学习笔记 2830

源码编译部署篇(二)源码编译milvus成功后如何启动standalone并调试成功!

由于Milvus官方文档只提及如何使用docker安装部署Milvus,关于源码安装方式篇幅较少,因此,我整理撰写了如何通过源码编译方式成功安装Milvus,详见此篇。之所以选择这种复杂的安装方式,可以调试源码进而熟悉Milvus如何搭建整个框架支持AI上层应用功能。根据上篇步骤部署虽然可以成功,然而,我却不能成功启动Milvus服务,这个问题困扰了一两天,现在终于得以解决并能成功调试Milvus源码。接下来,分为三个部分介绍如何启动和成功调试。

qq_43893755的博客 3369

TMS320F28335 学习笔记(二):系统时钟、PLL 与看门狗

本文系统介绍F28335的时钟架构与看门狗应用,涵盖外部晶振、PLL倍频生成系统时钟(SYSCLKOUT)、高速/低速外设时钟分频配置,以及看门狗的启用、关闭与喂狗机制。强调时钟配置准确性对延时、PWM、通信等外设的重要性,指出常见错误如晶振不匹配、未等待PLL锁定、随意修改PLL或喂狗周期过长等问题,并提供初始化框架与验证方法,帮助开发者正确配置时钟系统,确保程序稳定运行。

2403_83044722的博客 355

[密码学实战]商密TLCP协议抓包解析与深度分析(二十九)

[密码学实战]商密TLCP协议抓包解析与深度分析(二十九)

曼岛_的博客 633

串口实验-11

① 显示串口0接收到的数据② 串口0每隔3秒发送“waitting for serial data”信息COM30IDE 右上角 …三个点打开 串口监视器,选择波特率 115200在串口监视器 消息 位置 输入:hello esp32s3,会打印输出使用串口1来实现 串口数据回显功能方便大家后面用到串口接口的模块时,能知道使用方法COM26。

智能机器人产学研基地 25

蓝牙攻防实战指南:低功耗蓝牙

Bluetooth Low Energy(也称Bluetooth Smart)是经典蓝牙(Bluetooth Classic)的演进版本,设计目标是实现极低功耗,适用于无需频繁更换电池的设备,如智能手环、健康监测器、蓝牙标签等。Bluetooth Low Energy 是一项极具前景的无线通信技术,它以极低的功耗实现了短距离高效通信,广泛应用于智能设备和物联网领域。然而,其简化的协议结构和配对机制也带来了不小的安全挑战。

idlecloud0105的博客 683

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

MCU 启动流程解析:从 SRAM 到 DDR

MCU 的性能瓶颈通常不在 DDR 带宽,而在访问延迟与确定性。因此,关键代码、中断向量、栈以及功能安全数据应放在片内 SRAM;大块传感器数据缓冲、堆和冷数据则放在 DDR。启动流程的核心可以概括为三步:Boot ROM 搬运、Remap 切换、SRAM 执行。

Where there is life, there is hope. 286

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

MCU的ADC采样怎么配

一块采集板,室温下读电池电压挺准,一上高低温箱就差出0.3V。软件反复查了三遍,没改一行代码,最后发现是参考电压选错了——电源纹波直接灌进了测量基准。ADC这东西,代码就那么几行,坑全在配置里。这篇拿ATmega16当例子,把采样链路从头讲清:参考电压怎么选、时钟为什么卡在50到200kHz、结果为什么要讲究读取顺序。这些规则不只对AVR成立,换成车规MCU,思路一样。

qq_43241255的博客 194

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

XZ6273H 100V低功耗高压LDO硬件设计与实测体验

这款LDO提供SOT23-3、SOT89-3和TO92三种通用封装,不同场景下可以灵活选择:做小型化的PCB节点时用SOT23-3,板卡面积能控制得非常小;常规工业板卡选SOT89-3,贴片焊接方便,自带的焊盘也能提供基础散热能力;从实际落地的情况来看,它最适配两类场景:一类是汽车电子里的休眠值守子模块,车辆熄火后仍能保持极低的待机功耗,不会过度消耗电瓶电量;另一类是户外无人值守的通信远端节点,长期运行下的低功耗表现能大幅降低设备的供电维护成本。

koce13544100678的博客 231

PHY内部环回通过,能证明网口整条链路正常吗?

PHY内部环回通过,只能证明该测试路径在记录条件下工作正常,不能直接证明变压器、RJ45、网线和对端组成的整条链路正常。采购收到“环回合格”报告时,应先确认数据从哪里发出、在哪里折返、又在哪里检查。

Voohu_Elsa的博客 176

认识元器件 · 单片机(MCU/MPU/SOC) · 实战篇14

本文系统阐述了STM32晶振电路设计要点,强调负载电容匹配与R_Ext必要性需基于计算验证,指出PCB寄生参数对振荡精度影响显著。重点提出振荡器PCB设计规范:缩短走线、加地保护环、分离地平面、避免串扰,并说明焊接工艺与环境防护对稳定性的重要性。同时解析内部时钟不可用于USB因温漂大,且PLL不放大ppm误差。最后推荐使用MEMS振荡器替代传统晶振,实现低功耗、小体积与高可靠性。

一只天天被叨叨的小可爱 296

从FT 93k测试机角度看如何测试芯片的VOH/VOL/VIH/VIL,通俗易懂的方式介绍

FT 93k测试中,VIH/VIL与VOH/VOL的核心是验证芯片“听清”与“说清”的能力。VIH/VIL测试芯片输入灵敏度,通过施加边界电压并观察功能响应;VOH/VOL则在负载下测量输出电平,模拟真实工作状态。测试需严格遵循规格书的负载电流条件,确保信号可靠传输,避免灰色地带干扰。本质是精准复现测试条件,实现“听话的对话者”与“挑剔的听众”的双重角色。

Wang20122013的博客 224

Arduino-MEGA-ESP单片机理论课笔记-06温湿度-07时间-延时定时-2026

本文解析了DHT11温湿度传感器的Arduino代码,逐行讲解了库引入、引脚定义、传感器初始化及数据读取流程。重点说明了delay(1000)导致阻塞的问题,并提出使用millis()实现非阻塞定时,将采样间隔改为2秒,提升程序响应性。同时建议增加isnan()错误检测、优化串口输出格式,确保数据稳定可靠。

zhangrelay的专栏 348

认识元器件 · 单片机(MCU/MPU/SOC) · 实战篇16

VBUS检测用于识别USB主机是否存在,自供电设备强制检测,采用PA9引脚(5V耐压)通过分压或MOSFET方案实现。分压电阻取高阻值(如82k+33k),确保分压后电压≤4V,符合GPIO输入电平要求;当GPIO耐压条件不足时,改用N沟道MOSFET(如2N7002)检测,适用于高电压场景(如5–48V)。三电阻加焊桥可覆盖1.8V/3.3V双档,但量产建议使用标准封装。需避免MCU未上电时5V VBUS接入PA9,以防损坏器件。

一只天天被叨叨的小可爱 206

哪些国产单片机厂家提供FAE技术支持?英锐恩等对比

大厂FAE资源通常优先服务大客户,中小批量项目往往只能找代理商或看论坛。如果你需要,推荐:收到请求当日或次日回复,必要项目24小时内工程师到场,还能组织芯片研发工程师一起评审问题。生态成熟、资料丰富;通过代理商体系提供支持。

2601_95079068的博客 223

使用模板lwip工程,tcp测试板子硬件,跑通

路(IP层)已经修通了(能Ping),但你要找的房间(端口7)目前只接待“TCP”客人,不接待“UDP”客人。建议你先按第二步用Telnet测试一下TCP端口7,这能立刻证明你的板子网络是健康的。然后,根据你的实际需求,选择是继续使用TCP,还是将代码改造为第三步所示的UDP服务器结构。那个“EMAC”的警告,可以按第一步顺手修复,让工程更清爽。太棒了!祝贺你,网络通信的最难关卡已经被你彻底打通了!🎉看到这张截图,作为老师我特别开心。你看上面的日志:你发送了hello,成功收到了hello。

AlibabaApple的博客 282

【电感专题2:电感的感抗、电路的阻抗、电流的滞后】

本文系统阐述了电感的感抗特性及其对交流电路的影响。感抗 随频率升高而增大,阻碍电流变化,导致电流滞后电压90°。在串联RL电路中,总阻决定电流大小,频率或电感增大时阻抗上升,电流减小;反之则电流增大。仿真验证了理论计算与波形特征一致,直观展示了电流滞后于电压的相位关系。

weixin_57246604的博客 327
上一篇: 【硬件选型】STM32(二)
下一篇: 【速查笔记】单片机
Long-Run
博客等级 码龄3年 4602粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值