嵌入式软件--stm32 DAY 3

0、GPIO回顾

GPIO,通用型输入输出,控制stm32输入输出的引脚,统称GPIO。

主功能是默认的功能

复用的功能在芯片里都是由连线的,有联系才能复用。所以GPIO引脚能复用的功能只能是它默认复用功能和重定义功能。一般都使用默认功能,重定义往往不会打开,一旦要用重定义功能需要用到重映射。

想象成多路开关,内部的配置决定输入输出模式。

端口配置寄存器   低位CRL (0-7) 高位CRH(8-15) 4位配一个引脚,CNF和MODE各配2个。

一、改进GPIO流水灯

(1)复制案例,修改名称

03_led_flow_pro_register

(2)删减

删除除user和start以外的文件夹和文件,保留.uvprojx文件

(3)创建文件

像这样的基础配置,都可以放在一起称为初始化。也就是将外围的LED灯,写一个驱动程序。LED灯是属于硬件外设,所以新建文件夹Hardware,新建两个文件,如下:

(4)打开keil文件项目

(5)打开项目管理,添加User文件夹下delay.c文件

(6)在Hardware文件下创建LED文件夹,将led.c和led.h文件放进去。

 

(7)配完关掉keil,通过vscode打开。

首先补充delay.c,第一步肯定是引入.h文件。

在delay.h中如此定义

前一个文件在main中定义的函数可以直接挪移。

led.c也是同理。引入led.h

之后把所有定义函数的操作放进.c文件里。

#include "led.h"//初始化
void LED_Init(void)
{//1.时钟配置,开启GPIOA时钟RCC->APB2ENR|=RCC_APB2ENR_IOPAEN;//2.工作模式配置,PA0 PA1 PA8通用推挽输出  CNF=00,MODE=11GPIOA->CRL&=~GPIO_CRL_CNF0;GPIOA->CRL|=GPIO_CRL_MODE0;GPIOA->CRL&=~GPIO_CRL_CNF1;GPIOA->CRL|=GPIO_CRL_MODE1;GPIOA->CRH&=~GPIO_CRH_CNF8;GPIOA->CRH|=GPIO_CRH_MODE8;//3.初始全高电平,都置1, 全关灯/*GPIOA->ODR|=GPIO_ODR_ODR0; LED_Off(LED_1);GPIOA->ODR|=GPIO_ODR_ODR1;   LED_Off(LED_2)GPIOA->ODR|=GPIO_ODR_ODR8;   LED_Off(LED_3);*/uint16_t leds[]={LED_1,LED_2,LED_3};LED_OffAll(leds,3);
}//开关LED灯,参数就定为led,要开哪个灯就传哪个灯
void LED_On(uint16_t led)
{
GPIOA->ODR&=~led;
}
void LED_Off(uint16_t led)
{GPIOA->ODR|=led;
}//反转LED灯状态
void LED_Toggle(uint16_t led)
{//根据IDR对应位的值,判断当前LED状态.  IDR和ODR对应的位是一样的if((GPIOA->IDR&led)==0){LED_Off(led);}else{LED_On(led);}
}//控制所有灯的开关
void LED_OnAll(uint16_t leds[],uint8_t size)//全开
{for (uint8_t i = 0; i < size; i++){LED_On(leds[i]);}}
void LED_OffAll(uint16_t leds[],uint8_t size)//全关
{for (uint8_t i = 0; i < size; i++){LED_Off(leds[i]);}}

为了看起来方便,将开启数据端口的寄存器写法宏定义为我们的白话。

合理规范代码:

delay.c

#include "delay.h"
//延时函数
void Delay_us(uint16_t us)
{SysTick->LOAD=72*us;SysTick->CTRL=0x05;while(!(SysTick->CTRL&SysTick_CTRL_COUNTFLAG)){}SysTick->CTRL&=~SysTick_CTRL_ENABLE;
}
void Delay_ms(uint16_t ms)
{while(ms--){
Delay_us(1000);}}
void Delay_s(uint16_t s)
{while(s--){
Delay_ms(1000);}}

delay.h

#ifndef __DELAY_H
#define __DELAY_H#include "stm32f10x.h"
//定义延时函数
void Delay_us(uint16_t us);
void Delay_ms(uint16_t ms);
void Delay_s(uint16_t s);
#endif

led.c

#include "led.h"void LED_Init(void)
{// 时钟配置,打开时钟RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;// 工作模式配置,PA0 PA1 PA8通过推挽输出。CNF=00,MODE=11GPIOA->CRL |= GPIO_CRL_MODE0;GPIOA->CRL &= ~GPIO_CRL_CNF0;GPIOA->CRL |= GPIO_CRL_MODE1;GPIOA->CRL &= ~GPIO_CRL_CNF1;GPIOA->CRH |= GPIO_CRH_MODE8;GPIOA->CRH &= ~GPIO_CRH_CNF8;// 初始化引脚输出高电平,关灯LED_Off(LED_1);LED_Off(LED_2);LED_Off(LED_3);
}void LED_On(uint16_t led)
{GPIOA->ODR &= ~led;
}void LED_Off(uint16_t led)
{GPIOA->ODR |= led;
}void LED_Toggle(uint16_t led)
{// 根据IDR对应位的值,判断当前LED状态if ((GPIOA->IDR & led) == 0){LED_Off(led);}else{LED_On(led);}
}void LED_OnAll(uint16_t leds[], uint8_t size)
{for (uint8_t i = 0; i < size; i++){LED_On(leds[i]);}
}void LED_OffAll(uint16_t leds[], uint8_t size)
{for (uint8_t i = 0; i < size; i++){LED_Off(leds[i]);}
}

led.h

#ifndef __LED_H
#define __LED_H
#include "stm32f10x.h"
//定义LED灯
#define LED_1 GPIO_ODR_ODR0
#define LED_2 GPIO_ODR_ODR1
#define LED_3 GPIO_ODR_ODR8
//初始化
void LED_Init(void);
//开关LED灯
void LED_On(uint16_t led);
void LED_Off(uint16_t led);//翻转LED灯状态
void LED_Toggle(uint16_t led);
//控制所有LED灯的开关
void LED_OnAll(uint16_t leds[],uint8_t size);
void LED_OffAll(uint16_t leds[],uint8_t size);
#endif

main.c

#include <stdint.h>
#include "delay.h"
#include "led.h"
int main(void){//初始化
LED_Init();
uint16_t leds[]={LED_1,LED_2,LED_3};
uint8_t n=3;while(1){for(uint8_t i=0;i<n;i++){LED_On(leds[i]);Delay_ms(500);LED_Off(leds[i]);}}}

二、总体架构和时钟系统

1.总体架构stm32

(1)3个被动单元

内部SRAM

存储程序执行时用到的变量

在嵌入式环境中,SRAM相当于运行内存

内部闪存存储器 

存储下载的程序 程序执行时用到的常量

flash严格来讲划分为ROM(随机访问存储器,掉电就丢)类型

在嵌入式环境中,flash相当于存储内存

AHB到APB的桥(AHB to APBx) 

B:Bus  总线的意思  AHB:高速系统总线  是总线的核心

桥1,通过APB2总线连接到APB2上的外设。属于高速外设,最高72MHz.

桥2,通过APB1总线连接APB1的外设。低速外设,最高36MHz。时钟配置时需要二分频。

(2)四个驱动(主动)单元

(3)其他单元

内核Code总线

通过外部的ICode总线连接Flash,实现指令的读取

FSMC

2.时钟系统

51不需要开启时钟,因为简单,只有一个时钟,不用配。

32有不同时钟来源,高速设备接高速时钟,低速设备接低速时钟。这样效率最高。

时钟源

内部的低速时钟 40k    外部的低速时钟 32.768k

SYSCLK 系统时钟

RTCCLK 实时时钟

(1)HSE时钟

高速外部时钟是由外部时钟源提供。做过STM32项目的同学都知道,几乎所有的单片机都会外部接一个8Mhz的晶振,经过PLL九倍频得到72MHZ的系统时钟,这是系统默认的时钟。

(2)HSI时钟

HSI时钟是内部的8MHZ的RC振荡器产生,可直接作为系统时钟或在2分频后作为PLL输入。不需要任何外部器件就能提供系统时钟。启用时间比HSE晶体振荡器短。缺点是就算校准,时钟频率精度较差。

 

(3)PLL时钟

内部PLL用来倍频HSI RC的输出时钟或HSE晶体输出时钟。PLL设置必须在其被激活前完成,一旦激活,参数不能被改动。如果PLL中断在时钟中断寄存器里被允许,当PLL准备就绪时,可产生中断申请。

PLL时钟对外部8MHZ时钟信号9倍频,得到72MHZ时钟频率,这是STM32F1系列允许的最高时钟频率。

(4)LSE时钟

LSE晶体是一个32.768khz的低速外部晶体或陶瓷谐振器。它为实时时钟或者其他定时功能他提供一个低功耗且精确的时钟源。LSE不能驱动系统时钟。

(5)LSI时钟

低功耗时钟源,在停机和待机模式下保持运行,为独立看门狗和自动唤醒单元提供时钟。时钟频率大约40kHZ(30-60之间)。

不能驱动系统时钟。

(6)stm32时钟配置源码分析

关于时钟配置的源代码,往往在启动文件中已经做完了。

CR是时钟的控制器

CFGR 时钟配置寄存器

三、HAL库开发

1.简介

寄存器效率虽高,但是开发效率低,对开发者来说不太友好。

2.环境与安装

Java8很稳定,我们就安装这个。

win+r  cmd  

输入 java -version   检验是否安装java8

能够显示版本号,就说明电脑安装着Java的jdk.

然后就是傻瓜式安装。cubmx  图形化界面,自动生成ST的hal库文件,让我们的配置变成点点点。

之后就是芯片支持包了。双击打开cubeMX.

这是在线安装,可能时间费得有些多。

下面是离线安装步骤:

文章结尾我会给大家资料包,里面就有离线芯片支持包

里面有两个,一个是基础的,一个是升级的1-8-5,比较尴尬的是只能安装基础包,但我们可以李代桃僵。

我们安装好CUBEMX之后,就去找它的仓库,之前安装的时候,不改路径的话,应该在C盘用户

我们在CUBEmx上先装基础包,之后将高版本的解压到仓库文件夹替换掉它

必须解压到这里哦。

解压之后替换掉基础包。

3.流水灯案例(HAL库)

(1)配置

联网的话,会出现更新提示,直接关掉即可。

之后让我开始点点点。

这里面都是我们所要配的引脚,找准需求,定位普通或要复用的引脚吧。

系统核心配置:

SYS是必配的。选择模式和系统时钟,单线模式SW,一根数据线,一根时钟线。JTAG有四根线。

如果是标准库寄存器写法,时钟需要自己配。

前边我们说过,PLL时钟会选择外部晶振提供时钟。这一点主要在下图体现:

之后配置GPIO,点亮LED灯主要是靠GPIO的通用推挽输出。

剩下两个引脚都一样。

之后创建工程文件

之后跟随窗口就打开KEIL。

(2)代码实现

话不多说,开始写代码。将我们之前写的硬件外设LED灯的两个文件导入工程。

led.c

#include "led.h"//开关LED灯,参数就定为led,要开哪个灯就传哪个灯
void LED_On(uint16_t led)
{
HAL_GPIO_WritePin(LED_1_GPIO_Port,led,GPIO_PIN_RESET);
}
void LED_Off(uint16_t led)
{HAL_GPIO_WritePin(LED_1_GPIO_Port,led,GPIO_PIN_SET);
}//反转LED灯状态
void LED_Toggle(uint16_t led)
{HAL_GPIO_TogglePin(LED_1_GPIO_Port,led);
}//控制所有灯的开关
uint16_t leds[]={LED_1_Pin,LED_2_Pin,LED_3_Pin};
void LED_OnAll(uint16_t leds[],uint8_t size)//全开
{for (uint8_t i = 0; i < size; i++){LED_On(leds[i]);}}
void LED_OffAll(uint16_t leds[],uint8_t size)//全关
{for (uint8_t i = 0; i < size; i++){LED_Off(leds[i]);}}

main.c

/* USER CODE BEGIN Header */
/********************************************************************************* @file           : main.c* @brief          : Main program body******************************************************************************* @attention** Copyright (c) 2025 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 "gpio.h"
#include "led.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 *//* USER CODE END 0 *//*** @brief  The application entry point.* @retval int*/
int main(void)
{HAL_Init();SystemClock_Config();MX_GPIO_Init();//初始化,所有引脚高电平,等全灭uint8_t n=3;uint16_t leds[]={LED_1_Pin,LED_2_Pin,LED_3_Pin};while (1){for (uint8_t i = 0; i < n; i++){LED_On(leds[i]);HAL_Delay(1000);LED_Off(leds[i]);}}/* USER CODE END 3 */
}/*** @brief System Clock Configuration* @retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;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_DIV2;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK){Error_Handler();}
}/* USER CODE BEGIN 4 *//* 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 */

四、资料下载

stm32开发官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘123云盘为您提供stm32开发最新版正式版官方版绿色版下载,stm32开发安卓版手机版apk免费下载安装到手机,支持电脑端一键快捷安装https://www.123684.com/s/TQubTd-1eEtv?提取码:xscF

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/902937.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

点云从入门到精通技术详解100篇-基于二次误差和高斯混合模型的点云配准算法

目录 知识储备 结合二次误差度量与高斯混合模型的点云配准 算法核心创新点: 关键参数说明: 性能优化建议: 前言 国内外研究现状 全局配准算法的国内外研究 局部配准算法的国内外研究 2 点云配准相关概念与方法 2.1 什么是点云配准 2.2 点云的获取及点云主要数据…

linux系统问题杂谈

1.配置好anaconda之后&#xff0c;在一个终端中编辑好环境变量之后能够正常使用conda命令&#xff0c;但是新打开一个中断使用conda命令报错"无法识别conda"。 原因&#xff1a;使用“export PATH"/home/username/anaconda3/bin:$PATH"命令&#xff0c;临…

【中级软件设计师】函数调用 —— 传值调用和传地址调用 (附软考真题)

【中级软件设计师】函数调用 —— 传值调用和传地址调用 (附软考真题) 目录 【中级软件设计师】函数调用 —— 传值调用和传地址调用 (附软考真题)一、历年真题二、考点&#xff1a;函数调用 —— 传值调用和传地址调用&#x1f53a;1、传值调用&#x1f53a;2、传引用(地址)调…

Spring Cloud Gateway 如何将请求分发到各个服务

前言 在微服务架构中&#xff0c;API 网关&#xff08;API Gateway&#xff09;扮演着非常重要的角色。它负责接收客户端请求&#xff0c;并根据预定义的规则将请求路由到对应的后端服务。Spring Cloud Gateway 是 Spring 官方推出的一款高性能网关&#xff0c;支持动态路由、…

打造高功率、高电流和高可靠性电路板的厚铜PCB生产

厚铜PCB生产是指制作一种具有较厚铜层的PCB&#xff08;Printed Circuit Board&#xff0c;印刷电路板&#xff09;。这种PCB通常用于高功率、高电流和高可靠性的电子设备中。厚铜PCB的生产过程包括以下几个 主要步骤&#xff1a; 1. 基材准备 厚铜PCB的基材通常采用FR4或CEM-…

软考高级-系统架构设计师 论文范文参考(一)

文章目录 论SOA技术的应用论SOA在企业信息化中的应用论UP&#xff08;统一过程方法&#xff09;的应用论分布式数据库的设计与实现论改进Web服务器性能的有关技术论基于UML的需求分析论基于构件的软件开发论基于构件的软件开发(二) 论SOA技术的应用 摘要&#xff1a;  本人于…

京东平台关键字搜索接口开发指南:Python实现与代码详解

一、接口概述 京东关键字搜索接口允许开发者通过HTTP请求获取平台商品的关键字搜索结果&#xff0c;常用于商品比价、数据分析等场景。本文基于Python演示如何调用京东搜索接口&#xff0c;解析返回数据并实现基础功能。 二、技术实现步骤 接口地址分析‌ 京东未完全公开API…

浅析锁的应用与场景

锁的应用与场景&#xff1a;从单机到分布式 摘要&#xff1a;在多线程和分布式系统中&#xff0c;“锁”是避免资源竞争、保障数据一致性的核心机制。但你真的了解锁吗&#xff1f;什么时候该用锁&#xff1f;用哪种锁&#xff1f;本文通过通俗的比喻和代码示例&#xff0c;带…

30天通过软考高项-第三天

30天通过软考高项-第三天 任务&#xff1a;项目范围管理 思维导图阅读 知识点集锦阅读 知识点记忆 章节习题练习 知识点练习 手写回忆ITTO 听一遍喜马拉雅关于范围的内容 范围管理-背 1. 过程定义 规划变瘦订份缺孔 规划范围管理&#xff1a;为了记录如何定…

文字过长使用省略号展示,text-overflow 的使用和不生效场景的解决办法,flex 布局中文字省略展示的坑

在前端开发过程中【单行文本内容过长使用省略号展示】这是一个特别常见的功能&#xff0c;大家都知道要使用 text-overflow 这个 css 属性。 关于这个属性&#xff0c;我们可以先看一下官方文档怎么说。 text-overflow CSS 属性用于确定如何提示用户存在隐藏的溢出内容。其形式…

(二)读写分离架构、冷热分离架构

文章目录 读写分离架构什么是读写分离结构架构模型优缺点优点缺点 技术案例写情况读情况 冷热分离架构什么是冷热分离架构?架构模型优缺点优点 缺点技术案例读数据写数据 读写分离架构 什么是读写分离结构 读写分离架构针对于数据库。数据库原本负责读写两个功能。 读写分离架…

windows中kafka4.0集群搭建

参考文献 Apache Kafka windows启动kafka4.0&#xff08;不再需要zookeeper&#xff09;_kafka压缩包-CSDN博客 Kafka 4.0 KRaft集群部署_kafka4.0集群部署-CSDN博客 正文 注意jdk需要17版本以上的 修改D:\software\kafka_2.13-4.0.0\node1\config\server.properties配置文…

无线通信网

注意区分CA&#xff08;无线&#xff09;和CD&#xff08;有线&#xff09; 无线局域网扩频技术 FHSS/DSSS 无线频谱和信道&#xff1a;2.4G/5GHz,2.4GHz共13个信道&#xff0c;3个不重叠信道 CSMA/CA&#xff0c;隐藏节点 MANET 无线安全&#xff1a;WEP、WPA、WPA2、AES/TP…

嵌入式开发:基础知识介绍

一、嵌入式系统 1、介绍 以提高对象体系智能性、控制力和人机交互能力为目的&#xff0c;通过相互作用和内在指标评价的&#xff0c;嵌入到对象体系中的专用计算机系统。 2、分类 按其形态的差异&#xff0c;一般可将嵌入式系统分为&#xff1a;芯片级&#xff08;MCU、SoC&am…

uv包管理器如何安装依赖?

uv包管理器如何安装依赖? 输入 uv pip install 包名 uv pip install python-docx

大模型驱动智能服务变革:从全流程赋能到行业纵深落地

大模型技术的快速发展&#xff0c;正深刻改变着人工智能的研发与应用模式。作为"软硬协同、开箱即用"的智能化基础设施&#xff0c;大模型一体机通过整合计算硬件、部署平台和预置模型&#xff0c;重构了传统AI部署方式&#xff0c;成为推动AI普惠化和行业落地的重要…

【MQ篇】RabbitMQ之简单模式!

目录 引言一、 初识 RabbitMQ 与工作模式二、 简单模式 (Simple Queue) 详解&#xff1a;最直接的“点对点快递” &#x1f4ee;三、 Java (Spring Boot) 代码实战&#xff1a;让小兔子跑起来&#xff01; &#x1f430;&#x1f3c3;‍♂️四、 深入理解&#xff1a;简单模式的…

Lua 第7部分 输入输出

由于 Lua 语言强调可移植性和嵌入性 &#xff0c; 所以 Lua 语言本身并没有提供太多与外部交互的机制 。 在真实的 Lua 程序中&#xff0c;从图形、数据库到网络的访问等大多数 I/O 操作&#xff0c;要么由宿主程序实现&#xff0c;要么通过不包括在发行版中的外部库实现。 单就…

【开源】STM32HAL库移植Arduino OneWire库驱动DS18B20和MAX31850

项目开源链接 github主页https://github.com/snqx-lqh本项目github地址https://github.com/snqx-lqh/STM32F103C8T6HalDemo作者 VXQinghua-Li7 &#x1f4d6; 欢迎交流 如果开源的代码对你有帮助&#xff0c;希望可以帮我点个赞&#x1f44d;和收藏 项目说明 最近在做一个项目…

【合新通信】浸没式液冷光模块与冷媒兼容性测试技术报告

一、测试背景与核心挑战 行业需求驱动 随着800G/1.6T光模块功耗突破30W/端口&#xff0c;传统风冷已无法满足散热需求&#xff0c;浸没式液冷成为超算/AI数据中心的主流方案。冷媒兼容性是系统可靠性的关键指标&#xff0c;涉及材料腐蚀、光学性能、长期稳定性等维度。 核心…