输入捕获示例
源码路径:example/hal/pulse_in
支持的平台
例程可以运行在以下开发板上:
sf32lb52-lcd_n16r8
sf32lb52-lcd_a128r16
sf32lb52-nano_a128r16
sf32lb52-nano_n16r16
sf32lb56-lcd_a128r12n1
sf32lb56-lcd_n16r12n1
sf32lb58-lcd_a128r32n1_qspi
sf32lb58-lcd_n16r32n1_qspi
概述
包含了GPT PWM输入捕获(Input Capture)的示例
例程先通过GPT输出PWM波形作为信号源,再用杜邦线将PWM信号引入捕获定时器,测量信号的周期、频率、脉宽和占空比
PWM信号源:52x/56x使用GPTIM2_CH1,58x使用GPTIM1_CH2
捕获定时器:52x/56x使用GPTIM1_CH1,58x使用GPTIM3_CH2/PB01(GPTIM2的通道引脚在58x开发板上未引出)
支持中断采集(INPUT_CAPTURE_USE_IT=1,默认)和轮询采集(INPUT_CAPTURE_USE_IT=0)两种方式
例程的使用
编译和烧录
切换到例程project目录,运行scons命令执行编译(board=版型):
scons --board=sf32lb52-lcd_n16r8 -j8
build_sf32lb52-lcd_n16r8_hcpu\uart_download.bat,按提示选择端口即可进行下载:
build_sf32lb52-lcd_n16r8_hcpu\uart_download.bat
Uart Download
please input the serial port num:5
关于编译、下载的详细步骤,请参考快速入门的相关介绍。
配置工程
本例程无需额外配置,使用默认配置即可编译运行。如需查看工程配置项,可执行:
sdk.py menuconfig --board=sf32lb52-lcd_n16r8
硬件连接
例程运行后会先输出一路PWM波形作为信号源(默认200Hz,20%占空比)并保持运行,用杜邦线将PWM输出引脚与输入捕获引脚短接,即可开始测量。
PWM输出与捕获引脚如下表:
版型名称 |
PWM输出 |
PWM输出引脚 |
输入捕获定时器 |
输入捕获引脚 |
|---|---|---|---|---|
sf32lb52-nano |
GPTIM2_CH1 |
PA09 |
GPTIM1_CH1 |
PA27 |
sf32lb52-lcd |
GPTIM2_CH1 |
PA09 |
GPTIM1_CH1 |
PA27 |
sf32lb56-lcd |
GPTIM2_CH1 |
PA36 |
GPTIM1_CH1 |
PA27 |
sf32lb58-lcd |
GPTIM1_CH2 |
PA51 |
GPTIM3_CH2 |
PB01 |
注意:
58x使用LPSYS域的GPTIM3_CH2(PB01)
HAL_PIN_Set(pad, func, flags, hcpu)的第4个参数虽然注释为hcpu/lcpu选择,但实际由pad决定:HPSYS引脚(PA,pad < PIN_PAD_MAX_H)强制为hcpu,LPSYS引脚(PB,pad >= PIN_PAD_MAX_H)强制为lcpu,传入的0/1会被忽略中断入口重名的处理:例程通过HAL直接驱动GPT、不使用hwtimer设备,因此根目录
proj.conf中关闭了hwtimer驱动(# CONFIG_BSP_USING_TIM is not set)。该驱动关闭后drv_pwm_tim.c会接管GPTIMx_IRQHandler(这些中断入口由!BSP_USING_TIM条件保护),所以与捕获定时器对应的PWM实例也要一并关闭:PWMT1对应GPTIM1、PWMT3对应GPTIM3,而例程在52x/56x用GPTIM1捕获、58x用GPTIM3捕获。因此根目录proj.conf中关闭了PWMT1(52x板默认开启该实例,其余芯片为no-op),PWMT3只对58x有意义、放在sf32lb58x/proj.conf中关闭(56x板虽默认开启PWMT3,但其捕获用GPTIM1,不受影响)。如需在本例程中同时使用hwtimer设备,请改用其它定时器做输入捕获
例程输出结果展示
log输出(中断模式,
INPUT_CAPTURE_USE_IT=1,默认):
SFBL
Start PWM signal source!
GPT_clock 24000000,psc 2, Period 60000,Pulse 12000
PWM signal source setup done!
Start input capture demo (interrupt mode)!
connect PWM output pin to capture input pin with a jumper wire
captured(IT): period=5000 us, freq=200 Hz, pulse=1000 us, duty=20%
captured(IT): period=5000 us, freq=200 Hz, pulse=1000 us, duty=20%
log输出(轮询模式,
INPUT_CAPTURE_USE_IT=0):
SFBL
Start PWM signal source!
GPT_clock 24000000,psc 2, Period 60000,Pulse 12000
PWM signal source setup done!
Start input capture demo!
connect PWM output pin to capture input pin with a jumper wire
captured: period=5000 us, freq=200 Hz, pulse=1000 us, duty=20%
captured: period=5000 us, freq=200 Hz, pulse=1000 us, duty=20%
每秒打印一次捕获结果:信号源为200Hz/20%占空比的PWM,对应周期5000us、脉宽1000us
若未接好杜邦线,会每秒打印一次:
no capture event, check the jumper wire!
捕获原理说明
PWM输入捕获模式:周期通道(上升沿、直接TIx捕获)保存周期值,脉冲通道(下降沿、间接TIx捕获,与周期通道同引脚)保存脉宽值
从机复位模式:在周期边沿清零计数器,使CCR直接保存当前周期的period/pulse值,无需再计算相邻两次捕获的差值
52x/56x使用TI1FP1触发从机复位(GPTIM1_CH1),58x使用TI2FP2触发从机复位(GPTIM3_CH2)
捕获计数时钟为
PCLK1/(CAPTURE_PRESCALER+1)(当前CAPTURE_PRESCALER=9,即分频10)。CCR为16位,故可测最大周期约为65535/(PCLK1/(CAPTURE_PRESCALER+1));若目标芯片PCLK1更高导致长周期溢出,需调大该预分频。捕获定时器选择(main.c宏定义):
#if defined(SF32LB52X) || defined(SF32LB56X)
#define CAPTURE_INSTANCE hwp_gptim1
#define CAPTURE_CORE CORE_ID_HCPU
#define CAPTURE_TRIGGER GPT_TS_TI1FP1
#define CAPTURE_PERIOD_CH GPT_CHANNEL_1
#define CAPTURE_PULSE_CH GPT_CHANNEL_2
#define CAPTURE_PERIOD_FLAG GPT_FLAG_CC1
#define CAPTURE_PULSE_FLAG GPT_FLAG_CC2
#define CAPTURE_PERIOD_ACT HAL_GPT_ACTIVE_CHANNEL_1
#define CAPTURE_PULSE_ACT HAL_GPT_ACTIVE_CHANNEL_2
#define CAPTURE_IRQn GPTIM1_IRQn
#define CAPTURE_IRQ_HANDLER GPTIM1_IRQHandler
#elif defined(SF32LB58X)
#define CAPTURE_INSTANCE hwp_gptim3
#define CAPTURE_CORE CORE_ID_LCPU
#define CAPTURE_TRIGGER GPT_TS_TI2FP2
#define CAPTURE_PERIOD_CH GPT_CHANNEL_2
#define CAPTURE_PULSE_CH GPT_CHANNEL_1
#define CAPTURE_PERIOD_FLAG GPT_FLAG_CC2
#define CAPTURE_PULSE_FLAG GPT_FLAG_CC1
#define CAPTURE_PERIOD_ACT HAL_GPT_ACTIVE_CHANNEL_2
#define CAPTURE_PULSE_ACT HAL_GPT_ACTIVE_CHANNEL_1
#define CAPTURE_IRQn GPTIM3_IRQn
#define CAPTURE_IRQ_HANDLER GPTIM3_IRQHandler
#endif
捕获引脚配置(main.c capture_pin_set):
#if defined(SF32LB52X) || defined(SF32LB56X)
HAL_PIN_Set(PAD_PA27, GPTIM1_CH1, PIN_NOPULL, 1);
#elif defined(SF32LB58X)
HAL_PIN_Set(PAD_PB01, GPTIM3_CH2, PIN_NOPULL, 0);
#endif
中断/轮询模式切换
通过INPUT_CAPTURE_USE_IT宏(main.c顶部)切换采集方式:
1(默认):中断方式,由HAL_GPT_IC_CaptureCallback回调在中断中采集数据,主循环等待信号量,每秒打印一次最新结果,log输出格式为captured(IT): ...0:轮询方式,主循环查询捕获标志寄存器,每秒打印一次结果
注意:中断方式需要例程自己定义捕获定时器的中断入口(CAPTURE_IRQ_HANDLER),如果工程中同时打开了占用同一定时器的其它驱动(如hwtimer实例),会出现中断入口重名,详见支持的平台下的注意事项。
异常诊断
如果未能出现预期的log和波形输出,可以从以下方面进行故障排除:
硬件连接是否正常(杜邦线是否将PWM输出引脚与捕获引脚正确短接)
管脚配置是否正确
管脚对应的通道是否匹配
捕获无数据:确认信号源PWM正常输出,且杜邦线连接牢固
如有任何技术疑问,请在GitHub上提出issue。
参考文档
更新记录
版本 |
日期 |
发布说明 |
|---|---|---|
0.0.1 |
9/2026 |
初始版本(由example/hal/pwm改造为输入捕获示例) |