TI F28P65 使用 ePWM 模块模拟 SPI 时钟的详细方法

news2026/4/14 15:35:49
引言在嵌入式开发中当芯片自带的硬件SPI接口数量不足或者需要适配非标准时钟极性与相位的SPI从设备时利用TI C2000系列芯片如F28P65x强大的ePWM增强型脉宽调制模块来模拟SPI时钟是一种高效且灵活的替代方案。本文将详细介绍如何将ePWM配置为一个可精确控制频率和占空比的方波发生器从而生成SPI从设备所需的串行时钟SCLK并提供完整的代码示例与调试建议。为什么需要模拟应用场景分析场景说明SPI模块资源不足F28P65x最多提供4个高速50MHzSPI端口若外接从设备超过此数量可用ePWM扩展非标准时序要求某些SPI从设备需要特定的时钟极性与相位通过ePWM可完全由软件自定义节约外设资源将硬件SPI保留给高速/关键设备ePWM模拟用于低速或非关键设备核心原理ePWM模块内部包含时基TB、计数比较CC、**动作限定AQ**等子模块。一个完整的PWM周期包含一个高电平和低电平对应一个完整的SPI时钟周期。因此SPI比特率SCLK频率 ePWM开关频率通过配置TBPRD周期寄存器和CMPA比较寄存器可生成50%占空比的方波直接作为SPI时钟信号。三步生成SPI时钟第一步计算频率公式TBPRD f_EPWMCLK / (2 * f_SPI_CLK)参数说明TBPRDePWM时基周期寄存器值f_EPWMCLKePWM模块输入时钟频率例如100MHzf_SPI_CLK目标SPI时钟频率计算示例f_EPWMCLK 100 MHz f_SPI_CLK 5 MHz TBPRD 100,000,000 / (2 * 5,000,000) 10第二步生成波形在向上计数模式下设置CMPA TBPRD / 2得到50%占空比。通过AQ子模块配置计数值等于CMPA→ 引脚输出高电平计数值等于TBPRD→ 引脚输出低电平生成的方波即为SPI_SCLK。第三步精确使能控制使用TZ模块SPI从设备通常需要仅在数据传输期间有时钟其余时间时钟应为空闲状态。利用ePWM的TZTrip Zone模块结合外部使能信号如GPIO或片选信号可精确控制时钟的输出与关闭。配置思路将TZ模块的DCAEVT1或DCBEVT1事件配置为高电平有效当使能信号为高时触发TZ动作将ePWM输出强制拉低时钟停止通过反相逻辑或外部反相器可实现使能高有效→输出时钟的正逻辑简化方案若片选信号低有效可直接配置TZ为低电平有效触发使片选拉低时关闭时钟。示例代码基于DriverLib以下代码以F28P65x为例配置ePWM1生成5MHz的SPI时钟并演示TZ模块的基本使能控制使用GPIO作为使能信号高电平时关闭时钟。#include driverlib.h #include device.h void initEPWM_SPIClock(void) { // 1. 使能ePWM1模块时钟 SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM1); // 2. 配置GPIO0为ePWM1A输出 GPIO_setPinConfig(GPIO_0_EPWM1A); GPIO_setDirectionMode(0, GPIO_DIR_MODE_OUT); // 3. 时基配置向上计数周期TBPRD10100MHz / (2*5MHz) EPWM_setTimeBasePeriod(EPWM1_BASE, 10); EPWM_setTimeBaseCounterMode(EPWM1_BASE, EPWM_COUNTER_MODE_UP); EPWM_setTimeBaseClockDiv(EPWM1_BASE, EPWM_CLOCK_DIVIDER_1); // 4. 比较值配置CMPA TBPRD/2 5 EPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, 5); // 5. 动作配置CMPA匹配时置高PRD匹配时置低 EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA); EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD); // 6. TZ模块配置使能DCAEVT1事件高电平时强制拉低输出即关闭时钟 EPWM_disableTripZone(EPWM1_BASE); // 先清零配置 EPWM_setTripZoneAction(EPWM1_BASE, EPWM_TZ_ACTION_EVENT_DCAEVT1, EPWM_TZ_ACTION_LOW); // 事件触发时拉低 EPWM_setDigitalCompareEventTrigger(EPWM1_BASE, EPWM_DC_TYPE_DCAEVT1, EPWM_DC_EVT_TRIG_HIGH); // 高电平有效 // 7. 启动ePWM EPWM_setTimeBaseCounter(EPWM1_BASE, 0); EPWM_enableADCTrigger(EPWM1_BASE, EPWM_SOC_A); // 可选用于同步 }注意上述示例中使能信号高电平时关闭时钟如需反逻辑使能高电平时输出时钟可简单地将使能信号先反相输入到TZ引脚或在软件中配置TZ事件极性查阅具体芯片TRM。调试与验证1. 示波器/逻辑分析仪将探头连接到模拟时钟的GPIO引脚观察波形频率是否等于目标SPI时钟占空比是否为50%或符合从设备要求使能信号控制下时钟是否正确启停2. 代码级检查确认ePWM模块时钟已使能SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM1)检查GPIO复用配置是否正确在调试器中查看TBPRD、CMPA、TZ相关寄存器值是否符合预期3. 常见问题排查现象可能原因解决办法无输出波形GPIO未配置为ePWM功能检查GPIO_setPinConfig频率不正确TBPRD计算错误或时钟分频设置不对核对ePWM输入时钟频率及分频系数使能无法关闭时钟TZ事件极性配置错误检查DCAEVT1触发条件及动作设置扩展技巧同步多路SPI时钟若同一ePWM模块的A、B两路输出需作为两路独立SPI时钟可将B通道配置为A通道的从同步模式并设置相位偏移来控制两路时钟的延迟。使用CLB可配置逻辑模块对于极其复杂的时序要求如带死区的时钟、多相时钟等可考虑使用F28P65x内部的可配置逻辑块CLB实现更灵活的定制逻辑。总结方案对比方案优点缺点硬件SPI速度快、CPU负载低数量有限、时序固定ePWM模拟灵活、可扩展、节省外设需占用ePWM资源、CPU参与数据收发应用价值使用ePWM模拟SPI时钟在资源紧张或需要高度定制时序的场景下极具价值。通过上述方法您可以轻松生成精确的SPI时钟并结合TZ模块实现精确的使能控制。配合GPIO模拟MOSI/MISO数据线即可完整实现一个软SPI主机。希望本文能帮助您在C2000平台上灵活应对SPI扩展需求。如有疑问欢迎交流参考文献TI TMS320F28P65x Technical Reference Manual (TRM), Chapter: Enhanced Pulse Width Modulator (ePWM)TI C2000Ware DriverLib API Guide明白了您的实际需求是SSI协议通常用于绝对编码器如BISS、SSI它没有片选信号需要主机精确产生固定数量32个的时钟脉冲然后停止等待100μs后再产生下一组32个脉冲。即帧周期100μs10kHz每帧32个时钟脉冲。这比单纯的连续时钟复杂核心挑战是如何让ePWM精确输出指定数量的脉冲后自动停止并能周期性重启。 解决方案概览方案原理优点缺点方案一ePWM单次触发 中断计数用ePWM输出连续时钟在中断中计数达到32个后关闭ePWM再用定时器重启实现简单灵活中断响应有延迟高速时可能丢脉冲方案二ePWM的“单发模式” 软件重触发利用ePWM的EPWM_TB_COUNT_MODE_UP_ONESHOT模式仅向上计数一次硬件自动停止精确控制脉冲数F28P65是否支持需要确认C2000部分型号支持方案三ePWM 事件触发计数器ECAP/PCNTePWM输出始终使能但用外部计数器或芯片内部ECAP计数脉冲达到32个后触发TZ关闭ePWM纯硬件零CPU干预需要额外资源方案四使用CLB可配置逻辑块用CLB搭建一个32脉冲计数器自动门控时钟最灵活硬件自动开发复杂推荐方案一中断计数定时器重启实现简单在中等时钟频率如2~5MHz下完全可行100μs的间隔足够CPU处理中断。 详细实现步骤方案一整体思路配置ePWM输出连续SPI时钟例如5MHz。使能ePWM的周期中断或比较中断每输出一个时钟脉冲产生一次中断。在中断服务函数中累计脉冲个数当达到32个时禁用ePWM模块的输出或直接关闭时钟。配置一个CPU定时器TIMER0/1/2周期为100μs定时器中断中重新使能ePWM输出并重置计数器开始下一帧。注意事项中断优先级定时器中断应高于ePWM中断以确保帧周期精确。关闭ePWM输出可以用EPWM_setOutputEnable()或直接禁止ePWM时钟。为避免ePWM重新启动时相位不连续可以同步重置时基计数器。 代码示例基于DriverLib以下代码实现ePWM1输出5MHz连续时钟每输出32个脉冲后自动停止每隔100μs重新输出32个脉冲。#includedriverlib.h#includedevice.h// 全局变量volatileuint16_tpulseCount0;volatileuint16_ttargetPulse32;volatileuint8_tframeActive0;// 当前帧是否正在输出时钟// 定时器中断周期 100us#defineTIMER_PERIOD_US100// 函数声明voidinitEPWM_Continuous(void);voidinitTimerForFrame(void);__interruptvoidepwm1ISR(void);__interruptvoidtimer0ISR(void);voidmain(void){Device_init();Device_initGPIO();Interrupt_initModule();Interrupt_initVectorTable();initEPWM_Continuous();initTimerForFrame();// 使能中断Interrupt_enable(INT_EPWM1);Interrupt_enable(INT_TIMER0);// 先启动第一帧使能ePWM输出EPWM_setOutputEnable(EPWM1_BASE,EPWM_OUT_A,true);frameActive1;while(1){// 主循环可做其他事}}// 配置ePWM1为连续5MHz时钟使能周期中断每个周期产生一次中断 一个时钟脉冲voidinitEPWM_Continuous(void){SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM1);// GPIO0 - ePWM1AGPIO_setPinConfig(GPIO_0_EPWM1A);GPIO_setDirectionMode(0,GPIO_DIR_MODE_OUT);// 100MHz EPWMCLK - 5MHz PWM - TBPRD 10EPWM_setTimeBasePeriod(EPWM1_BASE,10);EPWM_setTimeBaseCounterMode(EPWM1_BASE,EPWM_COUNTER_MODE_UP);EPWM_setTimeBaseClockDiv(EPWM1_BASE,EPWM_CLOCK_DIVIDER_1);EPWM_setCounterCompareValue(EPWM1_BASE,EPWM_COUNTER_COMPARE_A,5);// 动作CMPA高PRD低 - 50%占空比EPWM_setActionQualifierAction(EPWM1_BASE,EPWM_AQ_OUTPUT_A,EPWM_AQ_OUTPUT_HIGH,EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);EPWM_setActionQualifierAction(EPWM1_BASE,EPWM_AQ_OUTPUT_A,EPWM_AQ_OUTPUT_LOW,EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);// 使能周期中断每个PWM周期触发一次 一个时钟脉冲EPWM_enablePeriodInt(EPWM1_BASE);EPWM_setInterruptSource(EPWM1_BASE,EPWM_INT_TBCTR_U_PERIOD);EPWM_setInterruptEventCount(EPWM1_BASE,1);// 每次周期事件都触发中断// 先禁止输出由定时器启动EPWM_setOutputEnable(EPWM1_BASE,EPWM_OUT_A,false);// 注册中断Interrupt_register(INT_EPWM1,epwm1ISR);Interrupt_enable(INT_EPWM1);// 启动ePWM时基但无输出EPWM_setTimeBaseCounter(EPWM1_BASE,0);}// 配置CPU定时器0周期100usvoidinitTimerForFrame(void){// 定时器时钟通常为 SYSCLK (200MHz 或 100MHz)uint32_ttimerClkSysCtl_getClock(SYSCTL_DEVICE_OSCSRC)/SYSCTL_SYSCLK_DIV_1;uint32_tperiodCycles(timerClk/1000000)*TIMER_PERIOD_US;// 100usCPUTimer_setPeriod(CPUTIMER0_BASE,periodCycles);CPUTimer_setPreScaler(CPUTIMER0_BASE,0);// 1分频CPUTimer_enableInt(CPUTIMER0_BASE);CPUTimer_enable(CPUTIMER0_BASE);Interrupt_register(INT_TIMER0,timer0ISR);Interrupt_enable(INT_TIMER0);}// ePWM中断每输出一个时钟脉冲调用一次__interruptvoidepwm1ISR(void){EPWM_clearEventTriggers(EPWM1_BASE);EPWM_clearPeriodInt(EPWM1_BASE);if(frameActive){pulseCount;if(pulseCounttargetPulse){// 已经输出32个脉冲立即关闭输出EPWM_setOutputEnable(EPWM1_BASE,EPWM_OUT_A,false);frameActive0;pulseCount0;}}else{// 未激活帧时忽略多余中断通常不会发生}Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP3);}// 定时器0中断每100us触发一次开始新的一帧__interruptvoidtimer0ISR(void){CPUTimer_clearInt(CPUTIMER0_BASE);// 确保上一帧已关闭EPWM_setOutputEnable(EPWM1_BASE,EPWM_OUT_A,false);// 重置脉冲计数和状态pulseCount0;frameActive1;// 可选同步ePWM时基计数器使每帧起始相位一致EPWM_setTimeBaseCounter(EPWM1_BASE,0);// 使能输出开始新帧EPWM_setOutputEnable(EPWM1_BASE,EPWM_OUT_A,true);Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1);}⚠️ 注意事项中断延迟ePWM中断频率 5MHz 每200ns一次中断这对于CPU来说是极高的负载且无法保证在下一个脉冲到来前完成中断处理。所以上述代码在高频时钟下不可行。➡️改进不要在每个时钟脉冲都进中断而是利用ePWM的比较器在输出第32个脉冲时产生中断例如设置CMPB 32然后使用“计数事件”触发中断。但ePWM本身没有脉冲计数器所以需要更巧妙的硬件方案。 更适合SSI的高效方案使用ePWM的“单次触发”模式 硬件定时器核心思路利用ePWM的向上计数模式 软件强制同步结合一个辅助定时器产生100μs的帧触发。但要求ePWM能输出恰好N个脉冲最好的办法是使用ePWM的“单次触发”模式One-shot mode配置时基为向上计数但设置TBCTL[FREE_SOFT] 0并在达到目标脉冲数后通过EPWM_forceSync()重新启动。不过F28P65的ePWM是否支持硬件单次触发需要查阅TRM。如果硬件不支持可以用ePWM ECAP的组合ePWM始终输出连续时钟。ECAP模块捕获ePWM输出信号配置为计数模式捕捉每个上升沿当计数值达到32时产生中断在中断中关闭ePWM输出。定时器100μs中断中重置ECAP计数器并重新使能ePWM。这样ePWM中断频率仍然是5MHz但ECAP中断只在每32个脉冲后触发一次大大降低CPU负载。 推荐最终方案ePWM ECAP 硬件计数原理框图定时器0 (100us) - 清除ECAP计数值 - 使能ePWM输出 ePWM输出 - ECAP输入通道 - ECAP计数模式 (上升沿) - 计数值32 - ECAP中断 - 关闭ePWM输出关键配置ePWM连续输出5MHz时钟或您需要的任何频率输出引脚同时连接到ECAP输入引脚可通过内部连接或外部跳线。ECAP配置为绝对计数模式Capture mode捕获上升沿每次捕获后计数器加1并可与预设值比较。或简单使用ECAP的“APWM模式”下的周期中断但更简单的是ECAP每次捕获产生中断在中断中计数达到32后关闭ePWM。这样仍然有中断但频率降低为5MHz/32 ≈ 156kHz仍较高。更好的方法是利用ECAP的多捕获模式设置连续捕获32个事件后触发中断。查阅F28P65 TRMECAP支持“连续/单次捕获模式”可以设定捕获次数如32当达到设定次数后产生中断。这样中断频率 帧率10kHz非常理想。 最终代码框架ECAP中断 定时器重启// 全局变量volatileuint8_tframeActive0;voidinitEPWM_5MHz(void){// 同之前配置连续时钟但不要使能ePWM中断// 输出到GPIO同时该GPIO也作为ECAP输入内部路由}voidinitECAP_PulseCounter(void){SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_ECAP1);// 将ePWM1A映射到ECAP1输入通过GPIO输入交叉开关或直接内部连接取决于芯片// 对于F28P65可以使用Input X-BAR将GPIO0连接到ECAP1InputXBAR_setInputPin(INPUT_XBAR_ECAP1,0);// GPIO0ECAP_enable(ECAP1_BASE);ECAP_setCaptureMode(ECAP1_BASE,ECAP_ABSOLUTE_MODE);// 配置为连续捕获32个事件后产生中断ECAP_setCaptureEdge(ECAP1_BASE,ECAP_EVENT_1,ECAP_EDGE_RISING);// ... 需查阅TRM设置捕获事件数量为32ECAP_enableInterrupt(ECAP1_BASE,ECAP_INT_CEVT1);// 达到捕获次数中断}voidinitTimer_100us(void){// 同前定时器中断中重置ECAP计数器并启用ePWM}__interruptvoidecap1ISR(void){ECAP_clearInterrupt(ECAP1_BASE,ECAP_INT_CEVT1);// 已捕获32个脉冲关闭ePWM输出EPWM_setOutputEnable(EPWM1_BASE,EPWM_OUT_A,false);frameActive0;// 清除ECAP计数器准备下一帧ECAP_setCounter(ECAP1_BASE,0);}__interruptvoidtimer0ISR(void){// 开始新帧ECAP_setCounter(ECAP1_BASE,0);EPWM_setOutputEnable(EPWM1_BASE,EPWM_OUT_A,true);frameActive1;// 清除定时器中断}✅ 总结步骤工具作用1ePWM产生连续的高频SPI时钟2ECAP硬件计数时钟脉冲个数达到32个后中断3CPU定时器每100μs启动新的一帧这种方案将脉冲计数完全交给硬件ECAPCPU只需处理10kHz的帧中断和32脉冲完成中断负载极低且能精确控制32个时钟。如需更具体的ECAP配置细节如如何设置捕获32个事件请查阅TMS320F28P65x TRM中“Enhanced Capture (ECAP)”章节的“连续捕获模式”说明。 详细实现步骤方案三方案三ePWM 事件触发计数器ECAP/PCNT除了用中断让CPU去关利用eCAP直接输出硬件触发信号是更高效的选择。在F28P65x上主要有两种不需要中断参与的硬件方法利用eCAP的TRIP_OUT信号和将eCAP配置为APWM模式进行匹配触发。⚙️ 方法一利用eCAP的TRIP_OUT信号这是最直接的硬件触发方式。eCAP模块内部有一个信号监控单元Signal Monitoring Unit专门用于检测输入信号的异常。你可以把它配置成一个计数器当它检测到预设数量的脉冲后就会输出一个TRIP_OUT信号。然后只需在芯片内部通过X-BAR将TRIP_OUT连接到ePWM的TZTrip Zone输入引脚即可实现TZ硬件联动。关键配置eCAP的TRIP_OUT默认是使能的你需要在X-BAR中选择正确的连接路径。这个方法优点是完全硬件实现CPU零负载触发延迟极低非常适合对时序要求严苛的场景。补充说明TRIP_OUT是eCAP Type 1模块的新功能由信号监控单元产生相关文档建议在使用TRIP_OUT时禁止ePWM的TRIPOUT反馈信号避免可能发生的误触发。⚙️ 方法二配置为APWM模式使用计数器匹配触发这是方法一的变体。将eCAP模块配置为辅助PWMAPWM模式。在这种模式下它的行为就像一个简化的PWM发生器内部有一个计数器你可以设置一个比较值Compare Value。当计数器值等于这个比较值时它会自动产生一个触发事件。如果把这个计数器“喂”上你想要的时钟信号例如配置eCAP去捕获你的SPI时钟那么当它数到预设值时就会触发动作。注意事项此模式在eCAP作为捕获模式时不可用。而且该触发事件通常还是需要中断来“响应”并非纯粹的硬件触发。 两种硬件方案对比下面表格清晰地展示了这两种硬件方案的区别对比维度eCAP的TRIP_OUT信号APWM模式计数器匹配触发方式硬件信号直接触发ePWM的TZ内部计数器匹配产生触发事件是否需要中断不需要通常需要中断触发源eCAP内部监控单元APWM模式下的计数器比较器主要优点完全硬件控制CPU零负载延迟低配置相对简单主要挑战需要理解信号监控单元的配置触发后仍需中断服务程序处理适用场景对实时性要求极高希望完全解放CPU的SSI脉冲计数更通用的触发场景或eCAP未用于捕获时 总结首选方案追求最优解的话方法一使用eCAP的TRIP_OUT信号是更彻底、更优雅的纯硬件解决方案能实现完全的硬件自动化最低的延迟和零CPU负载。后备方案如果需要快速实现可以评估APWM模式的可行性。但其“触发后仍需中断”的特性意味着最终可能还是要回到你最初想避免的中断方案。

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…