当前位置: 首页 > news >正文

HC32L136K8TA单片机输出互为反相双路PWM

可这里可以参考stm32的代码看看 HC32L136K8TA的机制跟32差不多   以使用一个通用定时器输出两路互为反相的 PWM 波,但需要通过一定的配置技巧实现。与高级定时器(如 STM32 的 TIM1、TIM8 等)不同,通用定时器通常没有直接的互补输出功能。因此,我们需要以下两种方法来实现:

 

方法 1:通过两个通道输出反相 PWM 波

通用定时器通常支持多通道输出(如 TIMx_CH1 和 TIMx_CH2),我们可以:

  1. 配置一个通道(如 CH1)为标准的 PWM 输出。
  2. 配置另一个通道(如 CH2)的极性为反相输出。
实现步骤
  • 配置定时器的两个通道为 PWM 模式。
  • 将一个通道的输出极性配置为正常(高电平有效),另一个通道的输出极性配置为反相(低电平有效)。
  • 两个通道设置相同的占空比和频率,但由于极性反转,它们将输出互为反相的 PWM 波形。

 

#include "stm32f4xx.h"void PWM_Inverted_Init(void) {// 1. 启用时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // TIM3 时钟RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); // GPIOA 时钟// 2. 配置 GPIO 引脚为复用功能GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; // PA6 (TIM3_CH1), PA7 (TIM3_CH2)GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;GPIO_Init(GPIOA, &GPIO_InitStruct);// 将引脚复用为 TIM3 功能GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_TIM3); // PA6 -> TIM3_CH1GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_TIM3); // PA7 -> TIM3_CH2// 3. 配置定时器TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;TIM_TimeBaseStruct.TIM_Period = 1000 - 1; // 自动重装载值(决定 PWM 周期)TIM_TimeBaseStruct.TIM_Prescaler = 84 - 1; // 预分频器(假设系统时钟为 84MHz)TIM_TimeBaseStruct.TIM_ClockDivision = TIM_CKD_DIV1;TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStruct);// 4. 配置通道 1 为 PWM 模式 1(正常输出)TIM_OCInitTypeDef TIM_OCInitStruct;TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1; // PWM 模式 1TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;TIM_OCInitStruct.TIM_Pulse = 500; // 占空比 50%TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High; // 高电平有效TIM_OC1Init(TIM3, &TIM_OCInitStruct);// 5. 配置通道 2 为 PWM 模式 1(反相输出)TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_Low; // 低电平有效TIM_OC2Init(TIM3, &TIM_OCInitStruct);// 6. 启动定时器TIM_Cmd(TIM3, ENABLE);
}int main(void) {PWM_Inverted_Init();while (1) {// 主循环}
}

 

  • TIM3_CH1 输出标准 PWM 波。
  • TIM3_CH2 输出反相 PWM 波(通过 TIM_OCPolarity 配置为低电平有效)。
  • 两个通道的占空比和频率相同,但极性反转,形成互为反相的波形。

方法 2:软件模拟反相输出

如果通用定时器只支持单通道输出,可以通过软件方式生成第二路反相 PWM 波。这通常需要:

  1. 使用中断或 DMA 捕获定时器的 PWM 输出。
  2. 在软件中生成一个与原始 PWM 波形反相的信号。

这里其实只需要将输出通道极性改变就可以了 

#include "timer3.h"
#include "gpio.h"
#include "flash.h"
#include "pwm.h"/******************************************************************************** TIM3中断服务函数******************************************************************************/
void pwm_Init(uint16_t u16Period, uint16_t u16CHxACompare, uint16_t u16CHxBCompare){//pwm初始化		 				    App_ClockCfg();                            //时钟初始化App_Timer3PortCfg();                       //Timer3 Port端口配置App_Timer3Cfg( u16Period,  u16CHxACompare,  u16CHxBCompare);     //0x9000, 0x6000, 0x3000Timer3 配置:周期 0x9000 //周期 = 系统时钟/(2 * 分频系数 * pwm频率); CH0/1/2通道A比较值0x6000; CH0/1/2通道B比较值0x3000Tim3_M23_EnPWM_Output(TRUE, FALSE);        //端口输出使能Tim3_M23_Run();                            //运行。
}
void Tim3_IRQHandler(void)
{static uint8_t i;//Timer3 模式23 更新中断if(TRUE == Tim3_GetIntFlag(Tim3UevIrq)){if(0 == i){
//            Gpio_WriteOutputIO(STK_LED_PORT, STK_LED_PIN,TRUE);  //LED 引脚输出高电平//            Tim3_M23_CCR_Set(Tim3CCR0A, 0x3000); //设置CH0 通道A比较值
//            Tim3_M23_CCR_Set(Tim3CCR0B, 0x6000); //设置CH0 通道B比较值
//            
//            Tim3_M23_CCR_Set(Tim3CCR1A, 0x3000); //设置CH1 通道A比较值
//            Tim3_M23_CCR_Set(Tim3CCR1B, 0x6000); //设置CH1 通道B比较值
//            
//            Tim3_M23_CCR_Set(Tim3CCR2A, 0x3000); //设置CH2 通道A比较值
//            Tim3_M23_CCR_Set(Tim3CCR2B, 0x6000); //设置CH2 通道B比较值i++;}else if(1 == i){
//            Gpio_WriteOutputIO(STK_LED_PORT, STK_LED_PIN,FALSE);  //LED 引脚输出低电平//            Tim3_M23_CCR_Set(Tim3CCR0A, 0x6000); //设置CH0 通道A比较值
//            Tim3_M23_CCR_Set(Tim3CCR0B, 0x3000); //设置CH0 通道B比较值
//            
//            Tim3_M23_CCR_Set(Tim3CCR1A, 0x6000); //设置CH1 通道A比较值
//            Tim3_M23_CCR_Set(Tim3CCR1B, 0x3000); //设置CH1 通道B比较值
//            
//            Tim3_M23_CCR_Set(Tim3CCR2A, 0x6000); //设置CH2 通道A比较值
//            Tim3_M23_CCR_Set(Tim3CCR2B, 0x3000); //设置CH2 通道B比较值i = 0;}Tim3_ClearIntFlag(Tim3UevIrq);  //清中断标志}
}//时钟初始化
void App_ClockCfg(void)
{en_flash_waitcycle_t         enFlashWait;stc_sysctrl_pll_cfg_t     stcPLLCfg;//结构体初始化清零DDL_ZERO_STRUCT(stcPLLCfg);enFlashWait = FlashWaitCycle1;                      //读等待周期设置为1(当HCLK大于24MHz时必须至少为1)Flash_WaitCycle(enFlashWait);                       // Flash 等待1个周期stcPLLCfg.enInFreq    = SysctrlPllInFreq4_6MHz;     //RCH 4MHzstcPLLCfg.enOutFreq   = SysctrlPllOutFreq36_48MHz;  //PLL 输出48MHzstcPLLCfg.enPllClkSrc = SysctrlPllRch;              //输入时钟源选择RCHstcPLLCfg.enPllMul    = SysctrlPllMul12;            //4MHz x 12 = 48MHzSysctrl_SetPLLFreq(&stcPLLCfg);Sysctrl_SetPLLStableTime(SysctrlPllStableCycle16384);Sysctrl_ClkSourceEnable(SysctrlClkPLL, TRUE);Sysctrl_SysClkSwitch(SysctrlClkPLL);///< 时钟切换
}//Timer3 Port端口配置
void App_Timer3PortCfg(void)
{stc_gpio_cfg_t               stcTIM3Port;
//    stc_gpio_cfg_t               stcLEDPort;//结构体初始化清零DDL_ZERO_STRUCT(stcTIM3Port);
//    DDL_ZERO_STRUCT(stcLEDPort);Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE); //端口外设时钟使能//    stcLEDPort.enDir  = GpioDirOut;
//    Gpio_Init(STK_LED_PORT, STK_LED_PIN, &stcLEDPort);        //PD14设置为LED输出stcTIM3Port.enDir  = GpioDirOut;//    Gpio_Init(GpioPortA, GpioPin8, &stcTIM3Port);
//    Gpio_SetAfMode(GpioPortA,GpioPin8,GpioAf2);               //PA08设置为TIM3_CH0A
//    
//    Gpio_Init(GpioPortA, GpioPin7, &stcTIM3Port);
//    Gpio_SetAfMode(GpioPortA,GpioPin7,GpioAf4);               //PA07设置为TIM3_CH0B
//    Gpio_Init(GpioPortB, GpioPin10, &stcTIM3Port);Gpio_SetAfMode(GpioPortB,GpioPin10,GpioAf5);              //PB10设置为TIM3_CH1AGpio_Init(GpioPortB, GpioPin0, &stcTIM3Port);Gpio_SetAfMode(GpioPortB,GpioPin0,GpioAf2);               //PB00设置为TIM3_CH1B//    Gpio_Init(GpioPortB, GpioPin8, &stcTIM3Port);
//    Gpio_SetAfMode(GpioPortB,GpioPin8,GpioAf6);               //PB08设置为TIM3_CH2A
//    
//    Gpio_Init(GpioPortB, GpioPin15, &stcTIM3Port);
//    Gpio_SetAfMode(GpioPortB,GpioPin15,GpioAf2);              //PB15设置为TIM3_CH2B
}//Timer3 配置
void App_Timer3Cfg(uint16_t u16Period, uint16_t u16CHxACompare, uint16_t u16CHxBCompare)
{uint16_t                     u16CntValue;uint8_t                      u8ValidPeriod;stc_tim3_mode23_cfg_t        stcTim3BaseCfg;stc_tim3_m23_compare_cfg_t   stcTim3PortCmpCfg;//结构体初始化清零DDL_ZERO_STRUCT(stcTim3BaseCfg);DDL_ZERO_STRUCT(stcTim3PortCmpCfg);Sysctrl_SetPeripheralGate(SysctrlPeripheralTim3, TRUE);   //Timer3外设时钟使能stcTim3BaseCfg.enWorkMode    = Tim3WorkMode3;             //三角波模式stcTim3BaseCfg.enCT          = Tim3Timer;                 //定时器功能,计数时钟为内部PCLKstcTim3BaseCfg.enPRS         = Tim3PCLKDiv1;              //PCLK                                       预分频PSCstcTim3BaseCfg.enCntDir      = Tim3CntUp;                 //向上计数,在三角波模式时只读stcTim3BaseCfg.enPWMTypeSel  = Tim3IndependentPWM;        //独立输出PWM    //Tim3ComplementaryPWM;stcTim3BaseCfg.enPWM2sSel    = Tim3SinglePointCmp;        //单点比较功能stcTim3BaseCfg.bOneShot      = FALSE;                     //循环计数stcTim3BaseCfg.bURSSel       = FALSE;                     //上下溢更新Tim3_Mode23_Init(&stcTim3BaseCfg);                        //TIM3 的模式0功能初始化Tim3_M23_ARRSet(u16Period, TRUE);                         //设置重载值,并使能缓存                   //ARR 自动重装器的值
//    
//    Tim3_M23_CCR_Set(Tim3CCR0A, u16CHxACompare);              //设置CH0比较值A
//    Tim3_M23_CCR_Set(Tim3CCR0B, u16CHxBCompare);              //设置CH0比较值B
//    Tim3_M23_CCR_Set(Tim3CCR1A, u16CHxACompare);              //设置CH1比较值ATim3_M23_CCR_Set(Tim3CCR1B, u16CHxBCompare);              //设置CH1比较值B//    Tim3_M23_CCR_Set(Tim3CCR2A, u16CHxACompare);              //设置CH2比较值A
//    Tim3_M23_CCR_Set(Tim3CCR2B, u16CHxBCompare);              //设置CH2比较值BstcTim3PortCmpCfg.enCHxACmpCtrl   = Tim3PWMMode2;         //OCREFA输出控制OCMA:PWM模式2stcTim3PortCmpCfg.enCHxAPolarity  = Tim3PortPositive;     //正常输出stcTim3PortCmpCfg.bCHxACmpBufEn   = TRUE;                 //A通道缓存控制stcTim3PortCmpCfg.enCHxACmpIntSel = Tim3CmpIntNone;       //A通道比较中断控制:无stcTim3PortCmpCfg.enCHxBCmpCtrl   = Tim3PWMMode2;         //OCREFB输出控制OCMB:PWM模式2(PWM互补模式下也要设置,避免强制输出)stcTim3PortCmpCfg.enCHxBPolarity  = Tim3PortOpposite;     //反相输出stcTim3PortCmpCfg.bCHxBCmpBufEn   = TRUE;                 //B通道缓存控制使能stcTim3PortCmpCfg.enCHxBCmpIntSel = Tim3CmpIntNone;       //B通道比较中断控制:无//    Tim3_M23_PortOutput_Cfg(Tim3CH0, &stcTim3PortCmpCfg);  //比较输出端口配置Tim3_M23_PortOutput_Cfg(Tim3CH1, &stcTim3PortCmpCfg);  //比较输出端口配置
//    Tim3_M23_PortOutput_Cfg(Tim3CH2, &stcTim3PortCmpCfg);  //比较输出端口配置u8ValidPeriod = 1;                                        //事件更新周期设置,0表示三角波每半个周期更新一次,每+1代表延迟半个周期Tim3_M23_SetValidPeriod(u8ValidPeriod);                   //间隔周期设置u16CntValue = 0;Tim3_M23_Cnt16Set(u16CntValue);                           //设置计数初值Tim3_ClearAllIntFlag();                                   //清中断标志Tim3_Mode23_EnableIrq(Tim3UevIrq);                        //使能TIM3 UEV更新中断EnableNvic(TIM3_IRQn, IrqLevel0, TRUE);                   //TIM3中断使能
}

相关文章:

HC32L136K8TA单片机输出互为反相双路PWM

可这里可以参考stm32的代码看看 HC32L136K8TA的机制跟32差不多 以使用一个通用定时器输出两路互为反相的 PWM 波&#xff0c;但需要通过一定的配置技巧实现。与高级定时器&#xff08;如 STM32 的 TIM1、TIM8 等&#xff09;不同&#xff0c;通用定时器通常没有直接的互补输出…...

数据分析-55-时间序列分析之获取时间序列的自然周期时间区间

文章目录 1 获取某年的总天数1.1 get_year_days()1.2 应用函数2 获取某年的总周数2.1 get_year_weeks()2.2 应用函数3 获取某日期属于某年的周数3.1 get_time_yearweek()3.2 应用函数4 获取某年某周的开始时间和结束时间4.1 get_week_start_end()4.2 应用函数5 获取往前num周期…...

Java Stream流操作List全攻略:Filter、Sort、GroupBy、Average、Sum实践

在Java 8及更高版本中&#xff0c;Stream API为集合处理带来了革命性的改变。本文将深入解析如何运用Stream对List进行高效的操作&#xff0c;包括筛选&#xff08;Filter&#xff09;、排序&#xff08;Sort&#xff09;、分组&#xff08;GroupBy&#xff09;、求平均值&…...

Sentaurus TCAD学习笔记:transform指令

目录 一、transform指令简介二、transform指令的实现1.cut指令2.flip指令3.rotate指令4.stretch指令5.translate指令6.reflect指令 三、transform指令示例 一、transform指令简介 在Sentaurus中&#xff0c;如果需要对器件进行翻转、平移等操作&#xff0c;可以通过transform指…...

vscode支持ssh远程开发

文章目录 一、生成ssh使用的公钥/密钥对二、使用vscode通过ssh连接服务器1.安装插件2.配置文件3.连接服务器4.新建文件夹&#xff0c;存放不同的任务5.为不同的项目选择不同的conda环境 三、使用scp命令与服务器互传文件、文件夹1.检查Windows 系统是否支持scp命令2.在Windows系…...

Java线程详解

一、线程的基本概念 1. 什么是线程&#xff1f; 线程是程序执行的一个单元&#xff0c;它是进程中的一个实体&#xff0c;是被系统独立调度和分派的基本单位。一个进程可以包含多个线程&#xff0c;这些线程共享进程的资源&#xff0c;如内存空间和文件句柄&#xff0c;但每个…...

java -jar启动项目报错:XXX.jar中没有主清单属性

XXX.jar中没有主清单属性 1、错误复现2、错误原因3、解决方案 java -jar启动项目报错&#xff1a;XXX.jar中没有主清单属性 1、错误复现 今天使用springboot给项目打了jar包&#xff0c;使用命令启动时报错&#xff0c;截图如下&#xff1a; 2、错误原因 项目的pom文件配置如…...

【Vue - Element 】实现表单输入框的远程搜索功能

需求 表单是一个常见的元素&#xff0c;而在表单中&#xff0c;常常需要用户从大量的数据中选择一个或多个选项。 为了提高用户体验&#xff0c;提供远程搜索功能可以帮助用户快速找到所需的选项&#xff0c;而不是从冗长的下拉列表中手动查找。 以该需求为例&#xff0c;我…...

Linux(Centos 7.6)命令详解:split

1.命令作用 Linux系统中的一个用于拆分文件的命令。它可以将一个大文件拆分成多个小文件&#xff0c;以便于传输、存储或处理 2.命令语法 Usage: split [OPTION]... [INPUT [PREFIX]] Usage: split [选项]... [输入文件] [输出文件前缀] 3.参数详解 OPTION: -a, --suffi…...

八股学习 Redis

八股学习 Redis 使用场景常见问题问题1、2示例场景缓存穿透解决方案一解决方案二 问题3示例场景缓存击穿解决方案 问题4示例场景缓存雪崩解决方案 问题5示例场景双写一致性强一致方案允许延时一致方案 问题6RDB方式AOF方式两种方式对比 问题7示例场景惰性删除定期删除 使用场景…...

如何通过高防服务隐藏服务器源IP

在网络安全领域&#xff0c;隐藏服务器的真实源IP地址是保护服务器免受直接攻击的重要手段之一。暴露的源IP地址容易成为黑客攻击的目标&#xff0c;尤其是DDoS攻击、端口扫描和暴力破解等威胁。高防服务&#xff08;如阿里云盾、AWS Shield等&#xff09;不仅提供强大的流量清…...

【WEB】网络传输中的信息安全 - 加密、签名、数字证书与HTTPS

文章目录 1. 概述2. 网络传输安全2.1.什么是中间人攻击2.2. 加密和签名2.2.1.加密算法2.2.2.摘要2.2.3.签名 2.3.数字证书2.3.1.证书的使用2.3.2.根证书2.3.3.证书链 2.4.HTTPS 1. 概述 本篇主要是讲解讲一些安全相关的基本知识&#xff08;如加密、签名、证书等&#xff09;&…...

借助Claude实现Playwright的自动化(MCP Server)

借助Claude实现Playwright的自动化(MCP Server) MCP Server自己开发也是可以的,现在也有很多开箱即用的MCP Server,可以在https://github.com/modelcontextprotocol/servers中查找 Playwright的MCP Server Playwright的MCP Server是社区开发的,它能够为LLM提供操作浏览器的…...

【区间DP】【hard】力扣730. 统计不同回文子序列

给你一个字符串 s &#xff0c;返回 s 中不同的非空回文子序列个数 。由于答案可能很大&#xff0c;请返回对 109 7 取余 的结果。 字符串的子序列可以经由字符串删除 0 个或多个字符获得。 如果一个序列与它反转后的序列一致&#xff0c;那么它是回文序列。 如果存在某个 …...

【Vim Masterclass 笔记11】S06L24 + L25:Vim 文本的插入、变更、替换与连接操作同步练习(含点评课)

文章目录 S06L24 Exercise 06 - Inserting, Changing, Replacing, and Joining1 训练目标2 操作指令2.1. 打开 insert-practice.txt 文件2.2. 练习 i 命令2.3. 练习 I 命令2.4. 练习 a 命令2.5. 练习 A 命令2.6. 练习 o 命令2.7. 练习 O 命令2.8. 练习 j 命令2.9. 练习 R 命令2…...

分布式组件底层逻辑是什么?

分布式组件是指在分布式系统中执行特定功能的模块&#xff0c;通常分布在多个物理节点上&#xff0c;共同协作完成任务。其底层逻辑包括多个方面&#xff0c;从通信和数据管理到一致性和容错设计&#xff0c;具体如下&#xff1a; 1.分布式组件的核心特点 分布性&#xff1a;功…...

Spring Boot中的扫描注解如何使用

在 Spring Boot 中&#xff0c;扫描注解是指通过注解来告诉 Spring 框架应该扫描哪些包、哪些类或哪些特定的组件&#xff0c;并将其作为 Spring 容器中的 bean 进行管理。Spring Boot 主要通过以下几种注解来实现自动扫描&#xff1a; ComponentScanSpringBootApplicationCom…...

初识JVM HotSopt 的发展历程

目录 导学 目前企业对程序员的基本要求 面向的对象 实战 学习目标 JVM 是什么 JVM 的三大核心功能 各大 JVM look 看一下虚拟机 HotSopt 的发展历程 总结 导学 目前企业对程序员的基本要求 面向的对象 实战 学习目标 JVM 是什么 JVM 的三大核心功能 即时编译 主要是…...

基于springboot果蔬供应链信息管理平台

基于Spring Boot的果蔬供应链信息管理平台是一种集成了先进信息技术和果蔬供应链管理理念的综合性系统。 一、背景与意义 随着人们生活水平的提高和对健康饮食的重视&#xff0c;果蔬市场需求不断增长。然而&#xff0c;果蔬供应链涉及多个环节&#xff0c;包括种植、采摘、加…...

掌握 React 关键:理解 super () 和 super (props) 的不同应用

在 React 中&#xff0c;super() 和 super(props) 都与 React 类组件的构造函数&#xff08;constructor&#xff09;以及继承有关。为了理解它们之间的区别&#xff0c;我们需要了解 JavaScript 类继承机制以及 React 类组件的工作原理。 1. super() 与 super(props) 的区别 …...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...