蜂鸣器(触摸提示音)

驱动用 PWM1 通道 2(PWM1->PCNR2 / PCMR2 / PDR_2 / PDDR_2 / CH2EN),
与背光(PWM1 内 Timer1)互不影响。鸣叫时长固定 50 ms,由 PIT1 的 10 ms 时基计数。

一、开关

User/module_select.h

宏 当前值 说明
LT_TOUCH_BUZZER 1 0 = 关闭,三个函数体编译为空
Buzzer_type 0 0 = 直流电平驱动,1 = PWM 方波驱动

二、API(User/bsp.c)

函数 作用
touch_buzzer_init() 配置引脚与 PWM。
touch_buzzer() 置 buzzer_start=1 并发声
touch_buzzer_close() 停止发声

Buzzer_type=1 时的波形参数(touch_buzzer_init() 内):

寄存器 值 作用
U32_PCSR.CSR2 2 8 分频,168/8 = 21 MHz
U32_PPR.CP1 0 不再分频
PCNR2 9999 周期,21MHz/(9999+1)
PCMR2 5000 占空比 50%
U32_PPCR.PDDR_2 1 引脚输出

Buzzer_type=0 走 PIN_PWM_Default() 后当 GPIO 用:PDR_2=1 响、PDR_2=0 停。

三、状态变量与 50ms 关断

变量 定义 说明
buzzer bsp.c 软件总开关,为 1 才允许响
buzzer_start bsp.c 正在鸣叫标志
buzzer_10ms_count bsp.c 10 ms 计数(递增,不是递减)
// Function/pit.c
if (buzzer_start) {
    buzzer_10ms_count++;
    if (buzzer_10ms_count >= 5) {     // 5 × 10ms = 50ms
        touch_buzzer_close();
        buzzer_start = 0;
        buzzer_10ms_count = 0;
    }
}

四、初始化与调用

// User/main.c
LT758_PWM1_Init(1, 0, 9, 800, gDutyBuf[var[0x7001 * 2 + 1]]);   // 背光
#if LT_TOUCH_BUZZER
    if (buzzer == 1) touch_buzzer_init();
#endif

控件里统一写 if (buzzer) touch_buzzer();,约 21 处:
Widget/button.c、varButton.c、sliderBar.c、slideMenu.c、popupBox.c、
multiVarButton.c、keyBoard.c、circularTouch.c,以及 Function/gbk.c、rtp.c。

五、用法

buzzer = 1;                 // 默认 0,必须手动置 1
touch_buzzer_init();        // 放在 LT758_PWM1_Init 之后
...
if (buzzer) touch_buzzer(); // 50ms 后由 PIT1 中断自动关闭

六、改参数

需求 位置
时长(当前 50 ms) pit.c 里 buzzer_10ms_count >= 5,改成 N 即 N×10 ms
音调(仅 Buzzer_type=1) bsp.c 的 PCNR2(越小频率越高)
响度 bsp.c 的 PCMR2 占空比,或改硬件限流电阻
作者:罗珍雪  创建时间:2026-10-20 10:25
最后编辑:罗珍雪  更新时间:2026-11-02 20:02
上一篇:
下一篇: