定时器输出PWM波配置(呼吸灯)

使用定时器 4 通道 3 生成 PWM 波控制 LED1 ,实现呼吸灯效果。 频率:2kHz,PSC=71,ARR=499

pwm.c:

#include "pwm.h"   // 本模块头文件:应声明 pwm_init/pwm_compare_set 等原型、并包含 HAL 头//(示例未贴出 pwm.h,注意里头应 #include "stm32f1xx_hal.h")TIM_HandleTypeDef pwm_handle = {0};  // 全局定时器句柄,供 HAL 例程与中断共同访问// init函数:配置 TIM4-CH3 为 PWM 输出(PB8),频率由 arr/psc 决定;默认给 50% 占空比
void pwm_init(uint16_t arr, uint16_t psc)
{TIM_OC_InitTypeDef pwm_config = {0};          // PWM 通道配置结构体(输出比较/ PWM 专用)pwm_handle.Instance = TIM4;                   // 选择定时器:TIM4(F103 默认 CH3 对应 PB8)pwm_handle.Init.Prescaler = psc;              // 预分频:计数时钟 = TIM4CLK/(PSC+1)pwm_handle.Init.Period = arr;                 // 自动重装载:计数满 (ARR) 产生更新事件并回到 0pwm_handle.Init.CounterMode = TIM_COUNTERMODE_UP;        // 向上计数(0 → ARR)HAL_TIM_PWM_Init(&pwm_handle);                // 初始化 PWM 基本参数(会回调 HAL_TIM_PWM_MspInit)pwm_config.OCMode = TIM_OCMODE_PWM1;          // PWM 模式1:CNT<CCR 时输出为“有效电平”pwm_config.Pulse  = arr/2;                    // 初始占空比:CCR = ARR/2 → 50%pwm_config.OCPolarity = TIM_OCPOLARITY_LOW;   // 有效电平为“低”;常用于“下拉点亮/灌电流”接法// 可选:显式关闭快速模式(F1 默认即可)// pwm_config.OCFastMode = TIM_OCFAST_DISABLE;HAL_TIM_PWM_ConfigChannel(&pwm_handle, &pwm_config, TIM_CHANNEL_3); // 配置通道3HAL_TIM_PWM_Start(&pwm_handle, TIM_CHANNEL_3);  // 启动通道3的 PWM 输出
}// MSP(MCU Support Package)底层初始化:由 HAL_TIM_PWM_Init() 自动调用
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM4)                           // 仅处理 TIM4 的底层{GPIO_InitTypeDef gpio_initstruct;// 1) 打开外设时钟__HAL_RCC_GPIOB_CLK_ENABLE();                    // 使能 GPIOB 时钟(PB8 用作复用推挽输出)__HAL_RCC_TIM4_CLK_ENABLE();                     // 使能 TIM4 时钟// 2) 配置 PB8 为 TIM4_CH3 的复用功能gpio_initstruct.Pin   = GPIO_PIN_8;              // TIM4_CH3 → PB8(默认映射,无需重映射)gpio_initstruct.Mode  = GPIO_MODE_AF_PP;         // 复用推挽输出(由定时器外设驱动)gpio_initstruct.Pull  = GPIO_PULLUP;             // 上拉(对输出模式影响不大,可用 NOPULL)gpio_initstruct.Speed = GPIO_SPEED_FREQ_HIGH;    // 高速(F1 表示 50MHz 等效)HAL_GPIO_Init(GPIOB, &gpio_initstruct);}
}// 修改 CCR(占空比)的函数:val ∈ [0, ARR];决定“有效电平持续的计数值”
void pwm_compare_set(uint16_t val)
{__HAL_TIM_SET_COMPARE(&pwm_handle, TIM_CHANNEL_3, val); // 将 CCR3 设为 val// 注:本例 OCPolarity=LOW + PWM1 → CNT<CCR 期间输出为低电平(有效电平=低),//     所以 val 表示“低电平持续的时间”;如要“高电平持续时间”,将极性改为 HIGH。
}

频率验证(给的参数):72 MHz 系统、APB1÷2 → TIM4CLK=72 MHz(F1 定时器×2 规则)。
PSC=71 ⇒ 计数时钟 72 MHz/(71+1)=1 MHz;ARR=499 ⇒ 周期 (499+1)/1 MHz=0.5 ms ⇒ 2 kHz

main.c:

#include "sys.h"    // 你的系统时钟/板级支持
#include "delay.h"  // 简易延时(阻塞)
#include "led.h"    // LED 初始化/翻转(若 LED1 与 PWM 引脚同线,注意别冲突)
#include "pwm.h"    // 本模块头:pwm_init/pwm_compare_setint main(void)
{HAL_Init();                           /* 初始化 HAL 库(中断优先级分组、Systick 等) */stm32_clock_init(RCC_PLL_MUL9);       /* HSE*9 → 72MHz,确保 TIM4 时钟为 72MHz(见 F1×2 规则) */led_init();                           /* 板载 LED 初始化(若是 PC13,不影响 PB8) */// 初始化 PWM:2kHz → PSC=71, ARR=499(注意传参减1的写法)pwm_init(500 - 1, 72 - 1);            // ARR=499, PSC=71uint16_t i = 0;while(1){// 渐亮:CCR 从 0 → 299(最大低电平时间 300/500=60%)for(i = 0; i < 300; i++){pwm_compare_set(i);           // 设置 CCR3 = i(决定“有效电平时宽”)delay_ms(10);                 // 粗糙的呼吸节奏(阻塞式,演示用)}// 渐暗:CCR 从 300 → 0for(i = 0; i < 300; i++){pwm_compare_set(300 - i);delay_ms(10);}// 注:若想“满范围”呼吸,可把上下限扩为 [0, ARR],并做非线性 Gamma 校正更符合人眼感知}
}

说明:当前把 CCR 只扫到 300(≤ARR=499),即“有效电平占比”最大约 60%(或在 HIGH 极性时为 60% 亮度)。
若 LED 是灌电流接法(LED 正端接 +3.3V,负端接 PB8),本例 OCPolarity=LOW 正合适(低电平点亮)。
若 LED 是拉电流接法(LED 负端接 GND,正端接 PB8),建议把 OCPolarity 改成 TIM_OCPOLARITY_HIGH

3) 字段与取值速查

A. 定时器基类(TIM_HandleTypeDefInit 字段)

  • Instance:定时器外设基址

    • 可选:TIM1(高级,APB2)、TIM2/3/4(通用,APB1)。

    • 本例:TIM4(CH3→PB8)。

  • Prescaler(PSC):uint16_t,0~65535

    • 计数时钟 CK_CNT = TIMxCLK / (PSC + 1);PSC 越大,计数越慢。

  • Period(ARR):uint16_t(F103 多数封装当 16 位用)

    • PWM 频率 f_pwm = CK_CNT / (ARR + 1)

  • CounterMode:计数模式

    • TIM_COUNTERMODE_UP(向上)

    • TIM_COUNTERMODE_DOWN(向下)

    • TIM_COUNTERMODE_CENTERALIGNED1/2/3(中心对齐:多用于对称 PWM)

  • ClockDivision(未在你代码中设置,默认 DIV1):数字滤波分频

    • TIM_CLOCKDIVISION_DIV1 / DIV2 / DIV4

    • 一般保持 DIV1

  • AutoReloadPreload:ARR 预装载

    • TIM_AUTORELOAD_PRELOAD_DISABLE:写 ARR 立即生效

    • TIM_AUTORELOAD_PRELOAD_ENABLE:写 ARR 进入影子,下次更新事件才生效(避免“撕裂”)

B. PWM 通道(TIM_OC_InitTypeDef

  • OCMode:输出比较模式(PWM 相关)

    • TIM_OCMODE_PWM1CNT < CCR 时输出有效电平,否则无效

    • TIM_OCMODE_PWM2:与 PWM1 反相(CNT < CCR 时输出无效电平

  • PulseCCR 初值(占空比计数)

    • 取值范围 [0, ARR],等于“有效电平持续的计数值”。

  • OCPolarity:极性(有效电平)

    • TIM_OCPOLARITY_HIGH:有效电平=高(CNT<CCR 时输出高)

    • TIM_OCPOLARITY_LOW :有效电平=低(CNT<CCR 时输出低)

    • 和 LED 接法相关:灌电流(低电平点亮)用 LOW;拉电流(高电平点亮)用 HIGH。

  • (可选)OCFastMode:快速模式

    • TIM_OCFAST_DISABLE/ENABLE;一般保持关闭。

  • 调用:HAL_TIM_PWM_ConfigChannel(&htim, &cfg, TIM_CHANNEL_1/2/3/4)

    • 本例:TIM_CHANNEL_3

C. GPIO(GPIO_InitTypeDef

  • PinGPIO_PIN_0 ... GPIO_PIN_15

    • 本例:GPIO_PIN_8(PB8)

  • Mode:工作模式

    • GPIO_MODE_AF_PP复用推挽输出,由外设驱动,PWM 必选)

    • GPIO_MODE_AF_OD(复用开漏)

    • 以及输入/普通输出模式(本例不适用)

  • Pull:上下拉(对输出影响不大)

    • GPIO_NOPULL / GPIO_PULLUP / GPIO_PULLDOWN

  • Speed:端口速度(F1 表示驱动能力/切换速度)

    • GPIO_SPEED_FREQ_LOW/MEDIUM/HIGH(HIGH≈50 MHz 级)

D. HAL 关键 API

  • HAL_TIM_PWM_Init(&htim)

    • 初始化定时器为 PWM 功能,并回调 HAL_TIM_PWM_MspInit() 完成时钟/GPIO。

  • HAL_TIM_PWM_ConfigChannel(&htim, &cfg, TIM_CHANNEL_x)

    • 为指定通道写入 OC/PWM 模式、极性、CCR 初值等。

  • HAL_TIM_PWM_Start(&htim, TIM_CHANNEL_x) / HAL_TIM_PWM_Stop(...)

    • 启停 PWM 输出(只影响该通道)。

  • __HAL_TIM_SET_COMPARE(&htim, TIM_CHANNEL_x, val)

    • 运行时修改 CCR(占空比):val ∈ [0, ARR]

    • PWM1 + HIGHval 表示“高电平时间”;PWM1 + LOWval 表示“低电平时间”。

E. 频率/占空比关系(便于心算)

  • f_pwm = TIMxCLK / ((PSC+1)*(ARR+1))

  • duty = CCR / (ARR+1)(以有效电平所占比例计)

  • 本例:PSC=71, ARR=499 ⇒ f_pwm=2 kHzCCR=250 ⇒ 50% 占空比(有效电平占一半周期)

4) 小改进建议

  • 范围保护:在 pwm_compare_set() 里把 val 限制到 [0, ARR],避免越界:

if (val > __HAL_TIM_GET_AUTORELOAD(&pwm_handle)) val = __HAL_TIM_GET_AUTORELOAD(&pwm_handle);
__HAL_TIM_SET_COMPARE(&pwm_handle, TIM_CHANNEL_3, val);
  • 视觉线性:人眼对亮度非线性,可用 val = (i*i)/k 或查表(Gamma≈2.2)做“呼吸更顺滑”。

  • 非阻塞刷新:用定时器中断/软件定时器定期更新 CCR,替代 delay_ms(10),让主循环可做别的事。

配置PWM步骤

一、步骤清单(从零到出波)

  1. 确认时钟树

    • 目标:SYSCLK=72 MHzAPB1=36 MHz (÷2)APB2=72 MHz (÷1)

    • F1 的“×2 规则”:APBx 分频≠1 时,TIMxCLK = 2×PCLKx

      • TIM2/3/4(APB1):若 APB1=36 MHz(÷2),则 TIM2/3/4CLK=72 MHz

      • TIM1(APB2):本例不必,但规则相同。

  2. 选定定时器与通道、引脚

    • 例:TIM4_CH3 → PB8(默认映射)。

    • 其他常见默认映射:

      • TIM2: CH1~4→PA0/PA1/PA2/PA3

      • TIM3: CH1~4→PA6/PA7/PB0/PB1

      • TIM4: CH1~4→PB6/PB7/PB8/PB9

      • TIM1: CH1~4→PA8/PA9/PA10/PA11(高级定时器)

  3. 开外设时钟

    • __HAL_RCC_TIMx_CLK_ENABLE();__HAL_RCC_GPIOx_CLK_ENABLE();(若 TIM1 还要 BDTR 的 MOE)。

  4. 配置引脚为复用推挽输出

    • GPIO_MODE_AF_PP、速度 GPIO_SPEED_FREQ_HIGH,引脚设为对应通道的管脚(如 PB8)。

  5. 计算频率并设置 PSC/ARR

    • 公式:

    • 例:TIMxCLK=72 MHzPSC=71ARR=499f=72e6/(72*500)=2 kHz

  6. 初始化定时器为 PWM 模式

    • htim.Instance = TIMx;

    • htim.Init.Prescaler = PSC;htim.Init.Period = ARR;CounterMode=UP;

    • HAL_TIM_PWM_Init(&htim);(会回调 MSP 完成时钟/GPIO)。

  7. 配置通道 PWM 参数

    • TIM_OC_InitTypeDef cfg;

    • cfg.OCMode = TIM_OCMODE_PWM1;(或 PWM2

    • cfg.Pulse = CCR 初值(占空比计数值,0~ARR)

    • cfg.OCPolarity = TIM_OCPOLARITY_HIGH/LOW有效电平是高还是低)

    • HAL_TIM_PWM_ConfigChannel(&htim, &cfg, TIM_CHANNEL_x);

  8. 启动 PWM 输出

    • HAL_TIM_PWM_Start(&htim, TIM_CHANNEL_x);(仅该通道)

    • TIM1(高级定时器)还需:HAL_TIMEx_PWMN_Start(...)(若用互补),并确保 MOE 置位(HAL 会在 HAL_TIM_PWM_Start 内处理 BDTR)。

  9. 运行时改占空比

    • __HAL_TIM_SET_COMPARE(&htim, TIM_CHANNEL_x, val);0~ARR)。

  10. (可选)中断/DMA 动态刷新

  • HAL_TIM_PWM_Start_DMA 或定时器中断里递增 CCR,可做“呼吸灯”等效果。

二、最小可跑模板(HAL,TIM4_CH3@PB8,2 kHz)

// pwm.h
#pragma once
#include "stm32f1xx_hal.h"
void PWM_Init_TIM4_CH3(uint16_t arr, uint16_t psc);
void PWM_SetCCR_TIM4_CH3(uint16_t val);
// pwm.c
#include "pwm.h"static TIM_HandleTypeDef htim4;void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{if (htim->Instance == TIM4) {__HAL_RCC_TIM4_CLK_ENABLE();__HAL_RCC_GPIOB_CLK_ENABLE();GPIO_InitTypeDef io = {0};io.Pin   = GPIO_PIN_8;                 // TIM4_CH3 → PB8io.Mode  = GPIO_MODE_AF_PP;            // 复用推挽io.Pull  = GPIO_NOPULL;io.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOB, &io);}
}void PWM_Init_TIM4_CH3(uint16_t arr, uint16_t psc)
{htim4.Instance = TIM4;htim4.Init.Prescaler         = psc;        // 例:71 → 72MHz/(71+1)=1MHzhtim4.Init.CounterMode       = TIM_COUNTERMODE_UP;htim4.Init.Period            = arr;        // 例:499 → 1MHz/(499+1)=2kHzhtim4.Init.ClockDivision     = TIM_CLOCKDIVISION_DIV1;htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;HAL_TIM_PWM_Init(&htim4);TIM_OC_InitTypeDef oc = {0};oc.OCMode     = TIM_OCMODE_PWM1;           // PWM1:CNT<CCR 输出“有效电平”oc.Pulse      = arr/2;                     // 50% 占空oc.OCPolarity = TIM_OCPOLARITY_HIGH;       // 有效电平=高(LED 拉电流点亮)HAL_TIM_PWM_ConfigChannel(&htim4, &oc, TIM_CHANNEL_3);HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_3);  // 开始输出
}void PWM_SetCCR_TIM4_CH3(uint16_t val)
{if (val > __HAL_TIM_GET_AUTORELOAD(&htim4)) val = __HAL_TIM_GET_AUTORELOAD(&htim4);__HAL_TIM_SET_COMPARE(&htim4, TIM_CHANNEL_3, val);
}
// main.c(节选)
PWM_Init_TIM4_CH3(499, 71);     // 2kHz
PWM_SetCCR_TIM4_CH3(250);       // 50% 占空

占空比换算

  • 有效电平=高(OCPolarity=HIGH,PWM1):duty = CCR/(ARR+1)

  • 有效电平=低(OCPolarity=LOW,PWM1):duty_low = CCR/(ARR+1)(低电平占比)。

三、常用可选项与意义

  • htim.Instance = TIM1/TIM2/TIM3/TIM4; → 选择定时器实例。

  • htim.Init.Prescaler = 0~65535; → 预分频(计数时钟 = TIMxCLK/(PSC+1))。

  • htim.Init.Period = 0~65535; → 自动重装载(周期计数)。

  • htim.Init.CounterMode = TIM_COUNTERMODE_UP/DOWN/CENTERALIGNED1/2/3;

  • htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1/DIV2/DIV4;

  • htim.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE/ENABLE;(ARR 是否影子寄存器)

  • oc.OCMode = TIM_OCMODE_PWM1/PWM2;(PWM2 与 PWM1 波形相反)

  • oc.Pulse = 0~ARR;(CCR,占空比计数)

  • oc.OCPolarity = TIM_OCPOLARITY_HIGH/LOW;有效电平是高还是低)

  • oc.OCFastMode = TIM_OCFAST_DISABLE/ENABLE;(一般关)

  • HAL_TIM_PWM_ConfigChannel(..., TIM_CHANNEL_1/2/3/4);(选择通道)

  • GPIO_InitTypeDef.Mode = GPIO_MODE_AF_PP/AF_OD/...(PWM 必须 AF_PP)

  • GPIO_InitTypeDef.Pull = GPIO_NOPULL/PULLUP/PULLDOWN;

  • GPIO_InitTypeDef.Speed = GPIO_SPEED_FREQ_LOW/MEDIUM/HIGH;


四、频率/占空比/极性要点

  • 频率f_pwm = TIMxCLK / ((PSC+1)*(ARR+1))

  • 占空比

    • PWM1 + HIGH:高电平占比 = CCR/(ARR+1)

    • PWM1 + LOW :低电平占比 = CCR/(ARR+1)

    • PWM2:与 PWM1 相反。

  • 极性选择(与 LED 接法相关):

    • 拉电流(PBx→电阻→LED→GND,置高点亮):OCPolarity=HIGH

    • 灌电流(+3V3→电阻→LED→PBx,下拉点亮):OCPolarity=LOW


五、常见坑位与排查

  • 无波形

    • GPIO 不是 AF_PP

    • PSC/ARR 不在范围;

    • 引脚占用(别和普通 GPIO_WritePin 冲突);

    • 选错通道/定时器;

    • TIM1 忘了 MOE(HAL 一般处理了);

    • JTAG 复用影响(若用到 PB3/PB4/PA15 的重映射场景,需 AFIO 处理)。

  • 频率不对

    • 没考虑 APB×2 规则

    • 系统时钟非 72 MHz;

    • Cube 配置与手算不一致。

  • 亮度“线性差”

    • 人眼非线性,做 gamma 校正或查表;

    • 用 DMA/定时器中断平滑更新 CCR,避免阻塞式 delay

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

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

相关文章

[ai-agent]环境简介之沙盒e2b vs daytona

所谓的环境的就是agent运行在哪里&#xff0c;或者是agent和那里进行交互。 最常见的环境就是本地开发环境&#xff0c;也就是个人主机&#xff0c;但是存在问题就是没有办法出网和横向扩展。 在沙盒之前也是有其他选择的&#xff1a; 云服务器&#xff0c; 虚拟机&#xff0c;…

【前端面试题】前端面试知识点(第三十一题到第六十一题)

三十一. CSS实现垂直水平居中 实现元素的垂直水平居中是前端开发中的常见需求,主要有以下几种思路: text-align + line-height实现单行文本水平垂直居中 适用于单行文本元素,通过text-align: center实现水平居中,line-height等于容器高度实现垂直居中 text-align + vertic…

嵌入式练习项目——————抓包获取天气信息

一、内容 尝试通过实时天气接口 - 数据接口 - NowAPI此网站获取天气信息&#xff0c;实现可以发送城市查询当前天气和未来天气 二、获取请求报文 可以根据测试示例看到获取内容&#xff0c;此时数据是cJSON格式&#xff0c;我们首先要通过合适的网址抓包获取到请求报文&#x…

Python爬虫实战:研究NewsCrawl ,构建新浪和网易新闻数据采集系统

1. 引言 1.1 研究背景与意义 在信息时代,新闻作为社会动态、公众观点的重要载体,其传播速度与影响力持续扩大。传统的人工筛选与采集方式已无法满足对海量新闻数据的高效处理需求,亟需自动化工具实现大规模、结构化的新闻数据采集。网络爬虫技术作为一种按照预设规则自动抓…

PyTorch神经网络工具箱全解析:nn.Module vs nn.functional

&#x1f50d; 为何需要神经网络工具箱&#xff1f; 在仅用 Autograd 和 Tensor 实现模型时&#xff0c;开发者需手动设置参数梯度&#xff08;requires_gradTrue&#xff09;、反向传播&#xff08;backward()&#xff09;及梯度提取&#xff0c;过程繁琐且易出错。nn 工具箱应…

Java注解学习记录

目录 一、为什么要学注解&#xff1f; 二、注解是什么&#xff1f; 三、为什么要使用注解&#xff1f; 四、注解的作用 五、注解的分类 5.1 元注解 Retention&#xff08;/ rɪˈtenʃ(ə)n /&#xff09; ★★★★★ Target ★★★★★ Inherited(/ ɪnˈherɪtɪd /…

43.安卓逆向2-补环境-使用unidbg(使用Smali语法调用方法和使用方法地址调用方法)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1bb8NhJc9eTuLzQr39lF55Q?pwdzy89 提取码&#xff1…

【Kubernetes知识点问答题】Pod 调度

1. 如何将特定 Pod 调度到指定的节点&#xff1f;可以使用下列方法中的任何一种来选择 K8s 对特定 Pod 的调度&#xff1a;① 与节点标签匹配的 nodeSelector&#xff1a;在 Pod 的规范中使用 nodeSelector 字段来指定节点标签&#xff0c;以便将 Pod 调度到具有特定标签的节点…

wordpress显示时间日期的几种常见的方式

在WordPress中&#xff0c;显示时间日期有多种常见方式&#xff0c;包括使用默认设置、模板标签、插件等&#xff0c;以下是详细介绍&#xff1a; 使用默认设置 WordPress的默认设置允许你在文章列表中显示文章的发布时间。登录到WordPress后台&#xff0c;在“设置”中找到“…

基于飞算JavaAI实现布隆过滤器防止缓存穿透:原理、实践与全流程解析

引言&#xff1a;当缓存失效时&#xff0c;系统如何避免“雪崩式崩溃”&#xff1f; 在互联网高并发场景中&#xff08;如电商秒杀、社交平台热点新闻&#xff09;&#xff0c;缓存是提升系统性能的核心手段——将频繁访问的数据&#xff08;如商品详情、用户信息&#xff09;存…

DeepResearch开源与闭源方案对比

在这个AI不再只是聊天工具的时代&#xff0c;"深度研究"已经成为大语言模型&#xff08;LLM&#xff09;的一项新能力。先进的LLM不再只是给出快速的一次性回答&#xff0c;而是可以像研究助手一样工作——搜索网上信息&#xff0c;调用各种工具&#xff08;比如搜索…

UniApp 页面传参方式详解

在 UniApp 开发中&#xff0c;页面间参数传递是核心功能之一。以下是 8 种常用的传参方式&#xff0c;每种方式都有其适用场景和特点&#xff1a;一、URL 拼接传参&#xff08;最常用&#xff09; 适用场景&#xff1a;简单数据传递&#xff0c;如 ID、状态值等基础类型数据 实…

音频分类标注工具

pyqt 分类标注工具&#xff1a;import glob import sys import json import os from PyQt5.QtWidgets import (QApplication, QMainWindow, QTableWidget, QTableWidgetItem,QSplitter, QVBoxLayout, QWidget, QPushButton, QRadioButton,QButtonGroup, QLabel, QHBoxLayout, Q…

云计算-Kubernetes+Istio 实现金丝雀发布:流量管理、熔断、流量镜像、ingreess、污点及pv案例实战

介绍 在微服务架构中,如何安全、高效地实现服务发布与流量管理是保障业务稳定性的核心挑战。金丝雀发布(Canary Release)、灰度发布等策略通过精细化的流量控制,可有效降低新版本上线风险, Istio 作为主流的服务网格(Service Mesh)工具。 此次Istio 在 Kubernetes 集群…

12.web api 3

定时器-间歇函数

ComfyUI进阶:EchoMimic插件全解析,让静态肖像实现音频驱动的精准口型动画

在数字内容创作中&#xff0c;让静态肖像“开口说话”并做出自然表情&#xff0c;是提升交互感与沉浸感的关键。传统动画制作需专业人员逐帧调整口型与表情&#xff0c;成本高且效率低。ComfyUI的EchoMimic插件通过音频驱动技术&#xff0c;实现了“输入音频→自动生成匹配口型…

链式前向星、vector存图

场景设定 想象你是一个社交达人&#xff0c;要记录你和所有朋友的关系&#xff08;这就是“图”&#xff09;。每个朋友是一个节点&#xff0c;关系是一条边。你需要快速回答&#xff1a;“我有哪些朋友&#xff1f;”&#xff08;遍历邻居&#xff09;。方式1&#xff1a;链式…

YAML 中定义 List 的几种方式

在 YAML 配置文件中定义 List 并在 Spring 应用中注入是非常常见的操作&#xff0c;下面详细介绍具体写法和注入方式。一、YAML 中定义 List 的几种方式1. 缩进式写法&#xff08;推荐&#xff09;最常用的方式&#xff0c;通过短横线 - 加空格表示列表项&#xff1a;yaml# app…

C# 反射和特性(自定义特性)

自定义特性 你或许已经注意到了&#xff0c;应用特性的语法和之前见过的其他语法有很大不同。你可能会觉得特 性是一种完全不同的结构类型&#xff0c;其实不是&#xff0c;特性只是一种特殊的类。 有关特性类的一些要点如下。 用户自定义的特性类叫作自定义特性。所有特性类都…

科目二的四个电路

一.K21电动机单连续运转接线(带点动控制)1.电路图2.主线路这可很明了,是一条直线,从上接到下就OK了,然后从热继电器出来,接到SB3按钮的常闭触点上接着往下走一端接到SB2的常闭触点上,接着往下走&#xff0c;走到接触器的线圈上,从L2借一条火线出来,从熔断器的上端接入,另一端接…