无标题
CCUH_SetupAcqTrigger()
是整个采集触发链路的“节拍发生器 + 路由配置器”。它并不直接触发 TXSLZR、HSADC 或 HSREF,而是完成以下几件事:
- 配置 CAPCOM1 生成一条“有效采集行窗口”;
- 将 NSU_TRG2 接入 CAPCOM1 的 Timer1 Event0,作为这一行采集时序的外部同步事件;
- 把 CAPCOM1 的 TMR1_COUT0 路由为主 acquisition trigger (acq_trg) 来源;
- 配置 ACQ trigger counter,使其按 aTrigInterval 周期产生采集触发;
- 打开 acquisition trigger counter。
代码位置:app/src/bcm/ccu_helper.c:136。
void CCUH_SetupAcqTrigger(uint32_t aTrigInterval,
uint32_t aNumSamples,
uint32_t aLineGap)
函数参数单位都是微秒或数量:
参数 含义 当前默认值
━━━━━━━━━━━━━━━ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━
aTrigInterval 两次 acquisition trigger 的间隔,单位 µs 5 µs
─────────────── ───────────────────────────────────────────── ────────────
aNumSamples 每行要进行多少次 acquisition 2000
─────────────── ───────────────────────────────────────────── ────────────
aLineGap 一行结束后到下一行开始前的空档时间,单位 µs 1000 µs
默认值来自 app/src/tasks/acq_task.c:25:
#define ACQ_TRIGGER_INTERVAL_US (5UL)
#define ACQ_NUM_ACQS_PER_LINE (2000UL)
#define ACQ_LINE_GAP_US (1000UL)
———
一、函数在整体采集链路中的位置
在 ACQ_Start() 中,顺序是:
HSADC 初始化与校准
->
配置 FIR(如果启用)
->
配置 TXSLZR / HSADC / HSREF 的附加触发延迟
->
配置 TX Serializer ToF 脉冲 pattern
->
CCUH_SetupAcqTrigger()
->
CCUH_StartNsuTrigger(2, 500000)
调用位置见 app/src/tasks/acq_task.c:189。
完整触发路径可以理解为:
NSU channel 2 event
|
v
ACQCMN Timer1 Event0
|
v
CAPCOM1 / Timer1
|
v
CAPCOM1 COUT0
|
v
ACQCMN acq_trg source
|
v
ACQ trigger counter
|
v
ACQCMN trigger outputs
|
+–> TXSLZR trigger
+–> HSADC trigger
+–> HSREF trigger
其中,最后三路的相对 delay 由前面的 ACQ_SetupTriggerDelays() 配置。
———
二、先计算“一行”的时间结构
函数一开始:
uint32_t activeLineTimeUs = aTrigInterval * aNumSamples;
uint32_t lineTimeUs = activeLineTimeUs + aLineGap;
uint32_t startTime = 1UL;
uint32_t endTime = startTime + activeLineTimeUs;
默认参数代入后:
aTrigInterval = 5 us
aNumSamples = 2000
aLineGap = 1000 us
得到:
activeLineTimeUs = 5 × 2000
= 10000 us
= 10 ms
lineTimeUs = 10000 + 1000
= 11000 us
= 11 ms
startTime = 1 us
endTime = 1 + 10000
= 10001 us
所以一行的时序目标是:
0 us 行周期开始
1 us 有效采集窗口开始
10001 us 有效采集窗口结束
11000 us 本行结束,进入下一行
图示如下:
一行总周期:11 ms
|——————————————————————|
0 us 1 us 10001 us 11000 us
|———|================================|—————-|
<—— 有效采集窗口 10 ms ——> <— gap 1 ms –>
每 5 us 产生一次采集 trigger
共计目标:2000 次
从配置意图看:
- 有效窗口为 10 ms;
- 在窗口内每隔 5 µs 做一次 ToF 发射与 ADC 采集;
- 一行理论上包含 2000 次 acquisition;
- 行结束后保留 1 ms 的空闲时间,供系统进入下一行、处理/同步或等待扫描机构动作。
因此,行频率约为:
1 / 11 ms ≈ 90.91 Hz
———
三、第一部分:配置 CAPCOM1 的 1 µs 时间基准和行周期
代码:
CCUH_CapComConfigure(1UL,
CCUH_CAPCOM_PRE_SCALAR,
lineTimeUs,
1UL);
其中:
#define CCUH_CAPCOM_PRE_SCALAR (100UL)
即调用等价于:
CCUH_CapComConfigure(1, 100, 11000, 1);
这表示使用:
CAPCOM1
预分频值:100
自动重装周期:11000
Event0 mask/control:1
辅助函数位于 app/src/bcm/ccu_helper.c:48。
———
1. 配置预分频器
CAPCOM_REG[aCCTIdx]->psc_ratio =
(CAPCOM_REG[aCCTIdx]->psc_ratio & ~CCT_PSC_RATIO_MASK) |
((aPreScaler - 1UL) << CCT_PSC_RATIO_SHIFT);
当前:
aPreScaler = 100
写入 PSC_RATIO = 99
代码注释说明 CAPCOM 基础时钟为 100 MHz:
100 MHz -> 一个原始时钟周期为 10 ns
预分频 100 -> 一个 CAPCOM tick 为 1 µs
所以后续写入 CAPCOM 的:
ARR
CCR A
CCR B
都按 1 µs 为单位解释。
这里利用的是常见的“寄存器值 = 实际分频值 - 1”编码:
PSC_RATIO = 99
实际除数 = 100
———
2. 配置 CAPCOM 的自动重装周期
CAPCOM_REG[aCCTIdx]->udc_ctrl =
(CAPCOM_REG[aCCTIdx]->udc_ctrl & ~CCT_UDC_CTRL_ARR_MASK) |
((aReload - 1UL) << CCT_UDC_CTRL_ARR_SHIFT);
当前:
aReload = lineTimeUs = 11000
ARR = 10999
寄存器字段为:
CCT_UDC_CTRL.ARR = bit[31:16]
因此 CAPCOM1 的计数周期是:
11000 × 1 µs = 11 ms
计数到周期末后重新装载,进入下一行。
———
3. 强制启用计数器
CAPCOM_REG[aCCTIdx]->udc_ctrl |=
CCT_UDC_CTRL_HW_EN_OVR_MASK;
即设置:
CCT_UDC_CTRL.HW_EN_OVR = 1
含义是覆盖正常硬件使能条件,让计数器可以运行。
然后:
CAPCOM_REG[aCCTIdx]->udc_ctrl &=
~CCT_UDC_CTRL_UDEN_MASK;
清除:
CCT_UDC_CTRL.UDEN = 0
按照源码注释,这代表配置为单向向上计数:
Unidirectional up-counter
即计数器从起点向上计数,到达 ARR 后回绕/重装。
———
4. Event0 与计数器/预分频器的关系
函数还做了:
CAPCOM_REG[aCCTIdx]->psc_ctrl &=
~(aEvtEnMsk << CCT_PSC_CTRL_MASK_EVT0_SHIFT);
CAPCOM_REG[aCCTIdx]->udc_ctrl &=
~(aEvtEnMsk << CCT_UDC_CTRL_UDC_MASK_EVT0_SHIFT);
当前:
aEvtEnMsk = 1
所以清除的是:
PSC_CTRL.MASK_EVT0
UDC_CTRL.UDC_MASK_EVT0
从字段名字和注释看,这意味着 Event0 不被 mask,它可以参与 CAPCOM 的同步/触发控制。
后面该 Event0 会连接到:
NSU_TRG2
因此整体意图是让外部的 NSU channel 2 事件与 CAPCOM1 的行时序相关联。
不过,RDB 头文件只提供了字段名和位定义,没有给出 Event0 对 CAPCOM counter 的精确硬件语义,例如:
- Event0 是启动 counter;
- Event0 是复位 counter;
- Event0 是重新同步 counter;
- Event0 只作用于 prescaler;
- Event0 对 compare output 的具体作用。
源码注释明确将其称为 trigger source,因此可以确认它被用于触发/同步,但具体是“从 Event0 的哪个瞬间开始计行周期”,仍需以 CCT/ACQCMN TRM 为准。
———
四、第二部分:生成有效采集行窗口
代码:
CCUH_CapComCompareConfigure(1UL,
startTime,
endTime,
1UL,
0UL);
代入默认值:
CCUH_CapComCompareConfigure(1, 1, 10001, 1, 0);
该函数位于 app/src/bcm/ccu_helper.c:84。
它使用 CAPCOM1 的 channel 0:
Channel 0, sub-channel A
Channel 0, sub-channel B
配置以下内容。
———
1. 使能 A/B compare mode
CAPCOM_REG[aCCTIdx]->cct_ccr_regs[0UL].ccr0_ctrl |=
CCT_CCR_CTRL_A_CCSEL_MASK;
CAPCOM_REG[aCCTIdx]->cct_ccr_regs[0UL].ccr0_ctrl |=
CCT_CCR_CTRL_B_CCSEL_MASK;
设置:
CCR0_CTRL.A_CCSEL = 1
CCR0_CTRL.B_CCSEL = 1
含义是将 channel 0 的 A/B 子通道切换到 compare 模式。
———
2. 配置 XOR 行为
regVal &= ~(CCT_CCR_CTRL_A_EN_XOR_MASK |
CCT_CCR_CTRL_B_EN_XOR_MASK);
CAPCOM_REG[aCCTIdx]->cct_ccr_regs[0UL].ccr0_ctrl =
regVal |
(aAEnXor << CCT_CCR_CTRL_A_EN_XOR_SHIFT) |
(aBEnXor << CCT_CCR_CTRL_B_EN_XOR_SHIFT);
当前:
aAEnXor = 1
aBEnXor = 0
因此:
A_EN_XOR = 1
B_EN_XOR = 0
代码注释把这段描述为:
Active signal from startTime to endTime - Enable XOR operation
意图是通过 compare point 和 output XOR/compare 逻辑生成一段“有效采集窗口”:
开始时刻:1 us
结束时刻:10001 us
也就是说,这个输出不是每 5 µs 的单次采集脉冲,而是“本行是否处于有效采集区间”的门控/窗口信号。
由于当前仓库中的 RDB 没有提供 CAPCOM compare 输出状态机的完整真值表,不能只凭 A_EN_XOR=1、B_EN_XOR=0 严格断言某个边沿是上升沿还是下降沿。但按照函数注释和参数命名,其目标是产生:
1 us 到 10001 us 之间为 active 的窗口
———
3. 设置 compare 时刻
CAPCOM_REG[aCCTIdx]->cct_ccr_regs[0UL].ccr0_val =
regVal | (aAVal << CCT_CCR_VAL_A_VAL_SHIFT);
CAPCOM_REG[aCCTIdx]->cct_ccr_regs[0UL].ccr0_val =
regVal | (aBVal << CCT_CCR_VAL_B_VAL_SHIFT);
默认值:
CCR0_VAL.A = 1
CCR0_VAL.B = 10001
因为 CAPCOM tick 是 1 µs,所以对应:
A compare:行开始后 1 µs
B compare:行开始后 10001 µs
可以画成:
CAPCOM1 counter(1 µs/tick)
counter:
0 1 10001 11000
|——|====================================|———-|
A compare B compare
采集窗口开始 采集窗口结束
———
五、第三部分:使能 CAPCOM1 的 COUT0 输出
代码:
CCUH_CapComOutputEnable(1UL, 0UL, 0UL, 0UL);
位于 app/src/bcm/ccu_helper.c:118。
即:
CAPCOM instance = 1
output index = 0
channel = 0
subchannel = A
函数中:
CAPCOM_REG[aCCTIdx]->out_ctrl |=
1UL << (8UL * aOut + 2UL * aChnl + aSubChnl);
代入参数:
bit position = 8 × 0 + 2 × 0 + 0
= 0
所以它设置:
CAPCOM1.OUT_CTRL bit0
即使能:
CAPCOM1 COUT0 <- channel 0, subchannel A
随后:
CAPCOM_REG[aCCTIdx]->ctrla |= CCT_CTRLA_EN_MASK;
设置:
CAPCOM1.CTRLA.CCT_EN = 1
这一步会使能 CAPCOM1 定时器。
代码中特意注明:
must be last step of initialization
不过这里是 CCUH_CapComOutputEnable() 内的“CAPCOM 局部配置最后一步”。从整个 CCUH_SetupAcqTrigger() 看,CAPCOM timer 在后续 ACQCMN trigger route 配置之前就已经 enable。
当前调用顺序中,真正的 NSU trigger 是在 CCUH_SetupAcqTrigger() 完成后才由:
CCUH_StartNsuTrigger(2UL, 500000UL);
启动的,因此通常不会在路由还没配置完时就产生有效的 NSU 同步事件。
———
六、第四部分:把 NSU_TRG2 接到 Timer1 Event0
代码:
regVal = ACQCMN_REG->tmr1_event0_src_ctrl &
~ACQCMN_TMR1_EVENT0_SRC_CTRL_NSU_TRG2_MASK;
ACQCMN_REG->tmr1_event0_src_ctrl =
regVal |
(4UL << ACQCMN_TMR1_EVENT0_SRC_CTRL_NSU_TRG2_SHIFT);
随后:
ACQCMN_REG->tmr1_event0_src_sel |=
ACQCMN_TMR1_EVENT0_SRC_SEL_NSU_TRG2_EN_MASK;
对应源码位置:app/src/bcm/ccu_helper.c:153。
寄存器字段:
TMR1_EVENT0_SRC_CTRL.NSU_TRG2 = bit[3:0]
TMR1_EVENT0_SRC_SEL.NSU_TRG2_EN = bit0
当前写入:
TMR1_EVENT0_SRC_CTRL.NSU_TRG2 = 4
TMR1_EVENT0_SRC_SEL.NSU_TRG2_EN = 1
代码注释说明这个配置含义为:
Configure input trigger for Timer1 Event0 - NSU_TRG2 falling edge
也就是选择:
NSU_TRG2 的 falling edge
作为 Timer1 Event0 的输入事件。
从后续调用可知,NSU channel 2 会被安排在 500 µs 后产生:
CCUH_StartNsuTrigger(2UL, 500000UL);
该函数用 NSU 的 10 ns 计数器,将事件时间设置为:
当前时间 + 500000 ns
= 当前时间 + 500 µs
因此,这个 NSU_TRG2 事件是整条采集时序的起始/同步事件。
———
七、第五部分:将 TMR1_COUT0 选为主 acq_trg 来源
代码:
regVal = ACQCMN_REG->acq_trg_src_ctrl0 &
~ACQCMN_CAPCOM_CMN_SRC_CTRL_TMR1_COUT0_MASK;
ACQCMN_REG->acq_trg_src_ctrl0 =
regVal |
(0UL << ACQCMN_CAPCOM_CMN_SRC_CTRL_TMR1_COUT0_SHIFT);
ACQCMN_REG->acq_trg_src_sel |=
ACQCMN_ACQ_TRG_SRC_SEL_TMR1_COUT0_EN_MASK;
对应源码位置:app/src/bcm/ccu_helper.c:160。
字段为:
ACQ_TRG_SRC_CTRL0.TMR1_COUT0 = bit[19:16]
ACQ_TRG_SRC_SEL.TMR1_COUT0_EN = bit4
当前配置:
TMR1_COUT0 source select field = 0
TMR1_COUT0 enable = 1
代码注释已经明确说明:
Select Timer1 COUT0 as the source for the main acquisition trigger (acq_trg).
也就是说,这里将 CAPCOM1 输出的时序窗口送入 ACQ Common 的 acquisition trigger 网络。
此处形成的关系是:
CAPCOM1 channel 0/A
|
v
TMR1_COUT0
|
v
ACQCMN acq_trg source
之后 acq_trg 会进入后面的 acquisition trigger counter,并进一步分发到:
TXSLZR
HSADC
HSREF
———
八、第六部分:将微秒周期转换为 3.2 ns 计数周期
代码:
uint32_t acqTrigInterCycles =
(aTrigInterval * 10000UL + 16UL) / 32UL;
位置:app/src/bcm/ccu_helper.c:167。
注释说明这个 counter 的单位是:
3.2 ns per cycle
换算公式:
1 µs = 1000 ns
一个 counter tick = 3.2 ns
触发间隔对应 tick 数
= aTrigInterval × 1000 / 3.2
= aTrigInterval × 10000 / 32
代码中额外加 16:
(aTrigInterval * 10000UL + 16UL) / 32UL
这是整数除法的“四舍五入到最近整数”写法。
因为:
16 = 32 / 2
所以它等价于:
round(aTrigInterval × 10000 / 32)
———
默认 5 µs 时的计算
aTrigInterval = 5 µs
代入:
acqTrigInterCycles
= (5 × 10000 + 16) / 32
= 50016 / 32
= 1563
实际周期:
1563 × 3.2 ns
= 5001.6 ns
= 5.0016 µs
理论目标为 5.0000 µs,因此单个触发间隔的量化误差是:
+1.6 ns
这个误差来自 3.2 ns 的计时粒度,不能由整数计数器完全消除。
对应的实际触发频率约为:
1 / 5.0016 µs
≈ 199.936 kHz
而理想 5 µs 周期是:
200 kHz
———
九、第七部分:写入 ACQ_TRG_CNTR_CTRL
代码:
regVal = ACQCMN_REG->acq_trg_cntr_ctrl &
~ACQCMN_ACQ_TRG_CNTR_CTRL_PROG_CNT_MASK;
ACQCMN_REG->acq_trg_cntr_ctrl =
regVal |
((acqTrigInterCycles - 1UL) <<
ACQCMN_ACQ_TRG_CNTR_CTRL_PROG_CNT_SHIFT);
默认配置:
acqTrigInterCycles = 1563
PROG_CNT = 1563 - 1
= 1562
= 0x061A
寄存器字段:
ACQ_TRG_CNTR_CTRL.PROG_CNT = bit[15:0]
ACQ_TRG_CNTR_CTRL.ACQ_TRG_CNTR_EN = bit16
采用的是典型的“周期长度减一”编码:
实际周期 = PROG_CNT + 1
因此:
PROG_CNT = 1562
实际计数周期 = 1563 个 3.2 ns tick
实际触发间隔 = 5.0016 µs
随后:
ACQCMN_REG->acq_trg_cntr_ctrl |=
ACQCMN_ACQ_TRG_CNTR_CTRL_ACQ_TRG_CNTR_EN_MASK;
设置 bit16:
ACQ_TRG_CNTR_EN = 1
即启用 acquisition trigger counter。
———
十、默认配置的最终寄存器结果
在默认配置下,函数产生的关键配置如下:
模块 字段 值 解释
━━━━━━━━━ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
CAPCOM1 PSC_RATIO 99 100 MHz / 100 = 1 MHz,即 1 µs tick
───────── ─────────────────────────────────── ─────── ────────────────────────────────────────
CAPCOM1 UDC_CTRL.ARR 10999 行周期为 11000 µs,即 11 ms
───────── ─────────────────────────────────── ─────── ────────────────────────────────────────
CAPCOM1 CCR0_VAL.A 1 有效窗口起点约为 1 µs
───────── ─────────────────────────────────── ─────── ────────────────────────────────────────
CAPCOM1 CCR0_VAL.B 10001 有效窗口终点约为 10001 µs
───────── ─────────────────────────────────── ─────── ────────────────────────────────────────
CAPCOM1 OUT_CTRL bit0 1 使能 output0/channel0/A,即 TMR1_COUT0
───────── ─────────────────────────────────── ─────── ────────────────────────────────────────
CAPCOM1 CTRLA.CCT_EN 1 启动 CAPCOM1
───────── ─────────────────────────────────── ─────── ────────────────────────────────────────
ACQCMN TMR1_EVENT0_SRC_CTRL.NSU_TRG2 4 选择 NSU_TRG2 对应的事件/边沿编码
───────── ─────────────────────────────────── ─────── ────────────────────────────────────────
ACQCMN TMR1_EVENT0_SRC_SEL.NSU_TRG2_EN 1 使能 NSU_TRG2 到 Timer1 Event0 的路由
───────── ─────────────────────────────────── ─────── ────────────────────────────────────────
ACQCMN ACQ_TRG_SRC_SEL.TMR1_COUT0_EN 1 使能 TMR1_COUT0 作为 acq_trg 来源
───────── ─────────────────────────────────── ─────── ────────────────────────────────────────
ACQCMN ACQ_TRG_CNTR_CTRL.PROG_CNT 1562 实际周期为 1563 × 3.2 ns
───────── ─────────────────────────────────── ─────── ────────────────────────────────────────
ACQCMN ACQ_TRG_CNTR_CTRL.ACQ_TRG_CNTR_EN 1 启用 acquisition trigger counter
———
十一、默认运行时序
默认参数下,较完整的时序可以概括为:
NSU channel 2 在约 500 µs 后产生事件
|
v
NSU_TRG2 falling edge
|
v
ACQCMN Timer1 Event0
|
v
CAPCOM1 的 11 ms 行周期同步/开始
|
+– 约 1 µs 后进入 active acquisition window
|
+– 在约 10 ms 的有效窗口中,以约 5.0016 µs 周期产生 acq_trg
|
+– 理论目标为 2000 次 acquisition
|
+– 之后保留约 1 ms line gap
|
v
下一行周期
在每个 acq_trg 到来后:
acq_trg
|
+– TXSLZR trigger(加 TXSLZR delay)
| |
| +– 输出 ToF 发送脉冲
|
+– HSADC trigger(加 HSADC delay)
| |
| +– 开始 ADC 单次采集
|
+– HSREF trigger(加 HSREF delay)
|
+– 开始参考采样
———
十二、一个值得注意的量化误差
代码希望在 10 ms 的有效窗口中得到:
2000 × 5 µs = 10 ms
但实际 acq_trg counter 的周期被量化到:
5.0016 µs
因此 2000 个周期的累计时间是:
2000 × 5.0016 µs
= 10003.2 µs
= 10.0032 ms
而代码定义的有效窗口是:
10000 µs
两者相差约:
3.2 µs
也就是约一个 3.2 ns tick 的 1000 倍,或者约 0.64 个 5 µs trigger 周期。
这不一定意味着系统一定会少一次或多一次 trigger,因为最终是否发出触发还取决于:
- TMR1_COUT0 的具体门控方式;
- acq_trg counter 是否在窗口结束后立即停止/复位;
- CAPCOM compare output 的真实输出状态机;
- ACQCMN 中 trigger counter 的具体 gating 行为。
但从纯数值上看,当前参数存在:
目标有效窗口:10.0000 ms
2000 个实际 trigger 周期:10.0032 ms
的轻微不匹配。
如果系统要求每行严格 2000 次采样,应当通过硬件计数器、DMA 完成计数、HSADC capture 状态或输出波形确认实际每行 trigger 数。
———
十三、函数当前缺少的参数检查
CCUH_SetupAcqTrigger() 返回 void,也没有输入参数保护。以下非法或极端值可能带来问题:
情况 当前风险
━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
aTrigInterval == 0 acqTrigInterCycles - 1UL 无符号下溢,写入极大值
──────────────────── ────────────────────────────────────────────────────────────────
aNumSamples == 0 有效窗口长度为 0,endTime 与 startTime 重叠
──────────────────── ────────────────────────────────────────────────────────────────
aLineGap 很大 lineTimeUs 可能超出 CAPCOM ARR 的 16-bit 容量
──────────────────── ────────────────────────────────────────────────────────────────
lineTimeUs > 65536 ARR 仅 16 bit,实际写入会截断
──────────────────── ────────────────────────────────────────────────────────────────
aTrigInterval 很大 PROG_CNT 仅 16 bit,周期可能截断
──────────────────── ────────────────────────────────────────────────────────────────
运行中重复调用 未先停 CAPCOM 和 acq trigger counter,可能产生不连续或毛刺时序
尤其是:
CCT_UDC_CTRL.ARR 是 16 bit
ACQ_TRG_CNTR_CTRL.PROG_CNT 是 16 bit
所以需要满足:
1 <= lineTimeUs <= 65536
1 <= acqTrigInterCycles <= 65536
默认值:
lineTimeUs = 11000
acqTrigInterCycles = 1563
均在安全范围内。
———
简要总结
CCUH_SetupAcqTrigger() 的作用可以压缩成一句话:
用 CAPCOM1 建立“每行 11 ms、其中前约 10 ms 为有效采样区”的行时序,再用 3.2 ns 精度的 ACQ trigger counter 在有效窗口内按约 5 µs 的周期驱动 TXSLZR、HSADC 和 HSREF。
默认配置下:
行总时长:11 ms
有效采集窗口:10 ms
行间空闲:1 ms
目标采集次数:2000 次/行
目标 trigger 间隔:5 µs
实际量化后的 counter 周期:5.0016 µs
TXSLZR / HSADC / HSREF:由 acq_trg 驱动,并叠加各自输出 delay

