前言
在芯驰 E3620 的外设配置中,经常会遇到下面这些需求:
text
eTimer / GTM → GPIO 输出
外部 IO → eTimer / GTM Capture
PWM / eTimer / GTM → ADC 硬件触发
软件事件 → eTimer 同步
XTRG1 → XTRG2 跨控制器传递信号
这些功能表面上属于不同模块,但中间往往都会经过一个共同模块:
text
XTRG
刚开始接触 XTRG 时,容易被 Sig_i、Sig_o、SSIG、TmuxDrt、TmuxIndrt 等概念绕晕。
其实只要抓住一个核心:
XTRG 本质上就是芯片内部的"信号路由器"。
本文按照实际工程配置的思路进行整理:
text
认识 XTRG
↓
了解 EB 配置页面
↓
根据实际需求选择配置项
↓
结合典型实例完成配置
↓
最后检查常见问题
1. XTRG 功能摘要
1.1 XTRG 是什么?
XTRG 全称:
text
Cross Trigger
它负责将芯片内部不同外设产生的信号进行路由、组合和触发,从而实现外设之间的硬件联动。
E3620 的 XTRG 可以连接 ETIMER、EPWM、ADC、I/O Pad 等模块,并且芯片内部包含两个独立的 XTRG Controller。
可以把它简单理解为:
text
信号源
│
▼
┌──────────────┐
│ XTRG │
│ │
│ 路由 / MUX │
│ 同步 / 逻辑 │
│ 触发 / 滤波 │
└──────────────┘
│
▼
目标模块
例如:
text
eTimer
│
▼
XTRG
│
▼
GPIO
或者:
text
PWM / eTimer
│
▼
XTRG
│
▼
ADC
又或者:
text
External IO
│
▼
XTRG
│
▼
GTM / eTimer Capture
所以配置 XTRG 时,第一步不是去研究 EB 中每一个参数,而是先回答:
text
1. 信号从哪里来?
2. 信号最终要去哪里?
只要这两个问题明确,XTRG 的配置方向基本就确定了。
1.2 E3620 有两个 XTRG Controller
E3620 内部存在:
text
XTRG1
XTRG2
因此在配置之前,还需要确认:
text
当前信号属于哪个 XTRG Controller?
如果信号源和目标分别位于不同的 XTRG Controller,还需要通过跨 XTRG 路由:
text
XTRG1
│
▼
INTER_XTRG_OUT
│
▼
INTER_XTRG_IN
│
▼
XTRG2
1.3 XTRG 中常见的信号类型
手册中主要涉及以下几类输入信号组:
text
SIG_I
SYNC_I
TRG_I
IO_I
TID_I
另外在实际配置中还会经常看到:
| 信号 | 简单理解 |
|---|---|
SIG_I |
普通内部功能信号 |
SYNC_I |
同步事件相关信号 |
TRG_I |
Trigger 相关信号 |
IO_I |
XTRG IO 输入 |
TID_I |
ADC Trigger ID 相关信号 |
SSIG |
Signal Matrix 运算后的输出 |
SWT_I |
Software Trigger 产生的信号 |
INTER_XTRG_IN |
另一个 XTRG Controller 传来的信号 |
实际开发不需要一开始把全部信号编号背下来。
更重要的是先理解:
text
Source
↓
XTRG 中间路由
↓
Destination
1.4 常见功能应该使用哪个配置模块?
先给出一个快速对应关系:
| 需求 | XTRG 主要配置 |
|---|---|
| 内部外设信号互相路由 | SigOutConfig |
| eTimer/GTM 信号输出到 IO | IOOutConfig |
| XTRG1 与 XTRG2 之间传递信号 | InterOutConfig |
| eTimer 同步、Set、Clear、Snap | SyncmuxConfig |
| 多路信号进行逻辑组合 | SignalMatrixConfig |
| 软件产生触发事件 | SwtConfig |
| 硬件触发 ADC | TmuxDrtConfig / TmuxIndrtConfig |
| 外部 IO 去毛刺/过滤 | IOFilterConfig |
| XTRG 信号触发 DMA | TrigDMACfg |
| 功能安全信号监控 | SmonFirstMuxCfg / SmonSecondMuxCfg |
| 信号 Watchdog | SwdtCfg |
后面看 EB 配置页面时,只需要围绕这张表去理解即可。
2. EB 中 XTRG 的配置结构
E3620 的 XTRG 在 EB 中大致可以看成:
text
XTRG
│
├── General
│
└── XTRGController
│
├── General
│
├── SigOutConfig
├── IOOutConfig
├── InterOutConfig
├── SyncmuxConfig
│
├── SignalMatrixConfig
├── SwtConfig
│
├── TmuxDrtConfig
├── TmuxIndrtConfig
│
├── IOFilterConfig
├── TrigDMACfg
│
├── SmonFirstMuxCfg
├── SmonSecondMuxCfg
└── SwdtCfg
实际项目并不需要全部配置。
只配置当前信号链真正需要经过的模块。
3. General 配置
XTRG 顶层 General 主要有:
text
XTRGDevErrorDetect
XTRGSafetyEnable
含义如下:
| 参数 | 含义 |
|---|---|
XTRGDevErrorDetect |
DET Error Report 开关 |
XTRGSafetyEnable |
Safety Report 开关 |
这两个配置主要和工程的错误检测以及 Functional Safety 策略有关。
4. XTRGController General
进入具体 Controller 后,首先会看到:
text
ControllerId
XTRGNotification
手册中的 EB 页面说明,ControllerId 用来选择 XTRG1/XTRG2,XTRGNotification 用于配置 XTRG 回调函数。
4.1 ControllerId
选择当前配置属于:
text
XTRG1
或者:
text
XTRG2
4.2 XTRGNotification
用于配置 XTRG 中断 Callback。
勾选以后,需要填写回调函数名称。
生成代码后可以在:
c
Xtrg_PBCfg.c
中的:
c
Xtrg_DeviceCfg
查看:
c
.cb
成员。
这里要特别注意:
XTRGNotification 只是配置 Callback,并不代表对应 XTRG 中断已经使能。
手册明确说明,Notification 只有在 XTRG Interrupt 真正使能之后才会起作用。
5. 信号路由类配置
这一类是最容易理解的。
核心模型永远都是:
text
Sig_i → Sig_o
也就是:
text
输入信号 → 输出目标
5.1 SigOutConfig
SigOutConfig 用于把一个内部信号送到另一个功能模块。
常见 Sig_i 包括:
text
SSIG
Etimer_CMP
ADC_DONE
IO_I
INTER_XTRG_IN
GTM_TRG_SIG
...
常见 Sig_o 包括:
text
Etimer Capture
Etimer Fault
Etimer Clock
GTM_SIG
...
手册中的例子是:
text
Sig_i = Etimer_Cmp_A0
Sig_o = ETIMER2_CPT_B0
对应:
text
ETIMER Compare A0
│
▼
XTRG
│
▼
ETIMER2 Capture B0
这类配置主要通过:
c
XTRG_SignalMutiplex()
完成。
5.2 IOOutConfig
IOOutConfig 用于:
把内部信号输出到 XTRG IO。
典型用途:
text
eTimer PWM
│
▼
XTRG
│
▼
XTRG_IO
│
▼
Physical Pin
配置思路依然是:
text
Sig_i = 信号来源
Sig_o = IO_O_x
例如:
text
Sig_i = Etimer_Cmp_A0
Sig_o = IO_O_0
即:
text
Etimer_Cmp_A0
│
▼
XTRG
│
▼
IO_O_0
手册中明确给出了 eTimer Compare 信号通过 IOOutConfig 路由到 XTRG_IO_0 的示例。
5.3 InterOutConfig
当信号需要:
text
XTRG1 → XTRG2
或者:
text
XTRG2 → XTRG1
时,需要使用:
text
InterOutConfig
例如:
text
Sig_i = Etimer_Cmp_A0
Sig_o = INTER_XTRG_OUT_0
对应:
text
Etimer_Cmp_A0
│
▼
XTRG1
│
▼
INTER_XTRG_OUT_0
│
▼
INTER_XTRG_IN_0
│
▼
XTRG2
手册说明,另一个 Controller 可以把该信号作为 INTER_XTRG_IN 使用。
6. 同步和软件触发配置
6.1 SyncmuxConfig
SyncmuxConfig 主要用于同步事件。
输入可以来自:
text
XTRG_SWT
SSIG
Etimer Snap
Etimer Set
Etimer Clr
GTM_TRG_SYNC
输出可以送给:
text
Etimer Set
Etimer Clr
Etimer Snap
PWMCNT_CLR_O
例如:
text
Software Trigger
│
▼
SWT
│
▼
Syncmux
│
▼
Etimer Clear
手册中对三个常用事件的解释为:
text
Set → 更新 Counter/Compare 相关值
Clr → 清除 Counter 或恢复 Compare Initial State
Snap → 将当前 Counter 保存到 Hold Register
对应 API:
c
XTRG_SignalSynchronize()
6.2 SwtConfig
SWT:
text
Software Trigger
即由 CPU 主动让 XTRG 产生一个内部触发信号。
支持:
text
Pulse
High Level
Low Level
Toggle
E3620 提供:
text
XTRG_SWT_SELECTOR0
~
XTRG_SWT_SELECTOR7
共 8 路 Software Trigger。
一个 SwtConfig 可以配置 1~8 个 SWT Event。
常见使用方式:
text
CPU
│
▼
XTRG_SoftwareTrigger()
│
▼
SWT_I
│
├──→ SyncMux
│
└──→ SignalMatrix
通常 SWT 不会单独使用,而是作为其他 XTRG 模块的输入。
7. SignalMatrixConfig
Signal Matrix 用于:
将多路信号做硬件逻辑组合,再输出新的 SSIG。
结构可以理解为:
text
Input0 ─┐
Input1 ─┤
Input2 ─┤
Input3 ─┤──→ Signal Matrix ──→ SSIG
Input4 ─┘
一个 Signal Matrix 有:
text
5 路输入
E3620 可以配置:
text
XTRG_SIG_MATRIX0
~
XTRG_SIG_MATRIX15
共 16 个 Signal Matrix。
例如:
text
XTRG_SIG_MATRIX0 → SSIG_0
XTRG_SIG_MATRIX3 → SSIG_3
其中:
text
Ssm_instanceid
就是用来选择当前 Signal Matrix 实例。
7.1 Ssm_reg
Ssm_reg 本质上是一张:
text
5 Input Truth Table
因为 5 个输入共有:
text
2^5 = 32
种组合,所以使用 32 bit 表示所有组合下应该输出 0 还是 1。
例如:
text
Output = Input0 && Input1
手册示例给出的:
text
SSE_REG = 0x88888888
只有 Input0 和 Input1 同时为 1 时,对应输出才为 1。
所以:
Ssm_reg并不是普通开关,而是 Signal Matrix 的逻辑真值表。
8. ADC 硬件触发:TmuxDrtConfig / TmuxIndrtConfig
这一部分通常是实际项目里最重要的 XTRG 功能。
典型链路:
text
PWM / eTimer / GTM
│
▼
Trigger
│
▼
XTRG
│
▼
TmuxDrt / TmuxIndrt
│
▼
ADC
XTRG 在这里相当于:
Timer/PWM 与 ADC 之间的硬件触发路由器。
8.1 Direct Trigger
对应:
text
TmuxDrtConfig
驱动数据结构:
c
Xtrg_DrtTrigMuxType
主要包括:
text
directTmux
tidSignal
triggerSource
targetCfg[]
可以简单理解为:
text
Trigger Source
│
▼
Direct Tmux
│
▼
ADC Target
8.2 Indirect Trigger
对应:
text
TmuxIndrtConfig
相比 Direct,多了一层:
text
TID Pool
可以理解为:
text
Trigger Source
│
▼
Indirect Tmux
│
▼
TID Pool
│
▼
ADC Target
因此在概念上:
text
Direct
→ 直接建立 Trigger 与 ADC Target 的关系
Indirect
→ 通过 TID Pool 进一步组织触发关系
驱动结构中 Direct 和 Indirect 分别具有独立的 Mux 配置,其中 Indirect 额外包含 tidPool。
8.3 Tmux 配置完之后还必须 Enable
这是非常容易遗漏的一步。
Direct Trigger 配置完成后,还需要:
c
XTRG_DirTrigEnableConfig()
Indirect Trigger 配置完成后,需要:
c
XTRG_IndirTrigEnableConfig()
否则:
text
配置已经生成
≠
Tmux 已经真正工作
手册对此有明确说明:Direct/Indirect Tmux 配置完成之后,都需要调用对应 Enable 接口才能生效。
8.4 Trigger Priority
如果:
text
Tmux0 ──┐
├──→ ADC1
Tmux1 ──┘
两个 Tmux 同一时刻触发同一个 ADC,就存在资源竞争。
此时可以配置:
c
XTRG_DirTrigAdcPrioConfig()
或:
c
XTRG_InDirTrigAdcPrioConfig()
需要注意:
text
Priority 数字越大
→ 优先级越高
并且:
text
Direct Priority
只比较 Direct Tmux
Indirect Priority
只比较 Indirect Tmux
如果:
text
Tmux0 → ADC1
Tmux1 → ADC2
目标 ADC 不同,则不存在竞争,也不需要考虑 Priority。
9. IOFilterConfig
如果外部 IO 作为 XTRG 输入,可以增加:
text
IOFilterConfig
用于输入信号过滤。
E3620 可以针对:
text
IO_I_0 ~ IO_I_63
配置 IO Filter。
主要参数:
text
Filter_Edge_Sel
Posedge_interval
Negedge_interval
Sample_interval
例如:
text
Filter_Edge_Sel = Rising Edge
Posedge_interval = 2
Sample_interval = 1
则上升沿后会过滤:
text
2 × 1
= 2 个 XTRG Clock
手册中给出了 IO_I_3 的相同配置示例。
10. 其他配置模块
除了前面常用功能外,XTRG 还提供以下能力。
TrigDMACfg
用于:
text
XTRG Signal
│
▼
DMA
主要配置:
text
Trigger_Signal
Trigger_Mode
Trigger_Channel
SmonFirstMuxCfg
先从 XTRG 信号中选出:
text
Input Signal
Output Signal
供 Signal Monitor / SWDT 使用。
SmonSecondMuxCfg
用于比较两个信号是否符合预期。
例如:
text
Input0 == Input1
或者:
text
Input0 != Input1
如果关系不符合预期,可以产生 Functional Safety Interrupt。
SwdtCfg
这里的 SWDT 是:
text
Signal Watchdog
不是普通 MCU WDG。
它可以监控:
text
Rising Edge
Falling Edge
Toggle
High
Low
Pulse Width
用于判断某个硬件信号:
text
是否丢失
是否卡高
是否卡低
边沿是否按时出现
脉冲宽度是否符合预期
11. 实例一:eTimer / GTM 波形输出到 GPIO
先看一个非常直观的需求:
text
eTimer
│
▼
XTRG
│
▼
GPIO
目标:
eTimer 已经产生 PWM/Compare 波形,希望把该信号输出到某个物理 Pin。
Step 1:先配置 eTimer
首先保证:
text
eTimer 本身已经能够产生预期波形
XTRG 并不会替代 eTimer 产生 PWM。
Step 2:配置 XTRG Controller
确认使用:
text
XTRG1
还是:
text
XTRG2
Step 3:进入 IOOutConfig
配置:
text
IO_Sig_i_Sel
选择需要输出的 eTimer 波形,例如:
text
Etimer_Cmp_A0
然后:
text
IO_Sig_o_Sel
选择:
text
IO_O_0
信号链变成:
text
Etimer_Cmp_A0
│
▼
XTRG
│
▼
IO_O_0
Step 4:配置 Port / PinMux
XTRG 只是把信号送到了:
text
XTRG_IO_O
还需要确认物理 Pin:
text
Port Mux
是否正确配置。
最终完整链路:
text
eTimer
│
▼
Compare Signal
│
▼
XTRG IOOutConfig
│
▼
XTRG_IO_O
│
▼
Port / PinMux
│
▼
Physical Pin
手册中的典型应用也明确说明:eTimer/GTM 的输出可以通过 IoOutConfig 路由到 IO。
12. 实例二:外部 IO 输入给 GTM/eTimer 做 Capture
需求:
text
External Signal
│
▼
GPIO
│
▼
XTRG IO_I
│
▼
XTRG
│
▼
GTM / eTimer Capture
例如:
外部有一个脉冲信号,希望由 GTM 进行 Input Capture。
Step 1:配置 Port
先把物理 Pin 配置为对应:
text
XTRG_IO_I
Step 2:如果需要,配置 IOFilterConfig
如果外部信号存在毛刺:
text
GPIO
│
▼
IOFilter
│
▼
XTRG
可以通过:
text
IOFilterConfig
进行硬件滤波。
Step 3:配置 SigOutConfig
例如:
text
Sig_i = IO_I_x
目标:
text
Sig_o = GTM_SIG_x
于是:
text
External Signal
│
▼
IO_I_x
│
▼
XTRG
│
▼
GTM_SIG_x
│
▼
GTM Capture
手册在 ICU Capture 场景中说明,XTRG 可以通过 Smux 将外部 IO 或内部信号导向 eTimer/GTM 捕获通道。
13. 实例三:PWM / eTimer 硬件触发 ADC
这是实际项目中非常典型的一种应用。
例如:
每个 PWM 周期到固定位置时,自动触发 ADC 采样。
最终信号链:
text
PWM / eTimer
│
▼
Trigger Event
│
▼
XTRG
│
▼
TMUX
│
▼
ADC
│
▼
Conversion
Step 1:确认 Trigger Source
首先确保 PWM/eTimer 已经产生对应触发事件。
这是整个链路的源头。
如果:
text
Trigger Source 本身没有产生
那么无论后面的 XTRG 怎么修改:
text
ADC 都不会触发
Step 2:确认 XTRG Controller
确认该 Trigger 属于:
text
XTRG1
或者:
text
XTRG2
Step 3:选择 Direct / Indirect Tmux
根据实际 ADC Trigger 方案选择:
text
TmuxDrtConfig
或者:
text
TmuxIndrtConfig
然后配置:
text
Trigger Source
TID
ADC Target
ADC Channel
具体 ADC Target/TID 对应关系还需要结合 ADC 硬件触发章节以及芯片 TRM。
Step 4:配置 Priority
如果存在多个 Tmux 同时触发同一个 ADC:
text
Tmux0 ──┐
├──→ ADC
Tmux1 ──┘
则需要配置 Priority。
如果不同 Tmux 分别触发不同 ADC,则可以忽略。
Step 5:Enable Tmux
Direct:
c
XTRG_DirTrigEnableConfig()
Indirect:
c
XTRG_IndirTrigEnableConfig()
这一项必须重点检查。
Step 6:配置 ADC 本身
XTRG 只负责:
text
把 Trigger 送到 ADC
但 ADC 本身还必须允许对应:
text
Hardware Trigger
因此排查 ADC 不采样时:
不能只检查 XTRG。
Step 7:需要时开启 TMUX_DONE 中断
调试阶段可以使用:
text
TMUX_DONE0 ~ TMUX_DONE7
确认:
text
XTRG 是否真正完成了一次 ADC Trigger
XTRG 的 TMUX 中断通过统一 Callback 返回,并通过 event 参数区分具体是哪一路 TMUX_DONE。
这样排查起来会很清晰:
text
Trigger Source 有没有产生?
│
▼
XTRG Tmux 有没有收到?
│
▼
TMUX_DONE 有没有发生?
│
▼
ADC 有没有真正转换?
│
▼
ADC Result 有没有更新?
14. 实例四:Software Trigger 触发 eTimer 同步
如果希望由 CPU 主动产生一次同步事件,可以使用:
text
SwtConfig
+
SyncmuxConfig
例如:
text
CPU
│
▼
XTRG_SoftwareTrigger()
│
▼
SWT_I
│
▼
SyncMux
│
▼
Etimer Clear
配置步骤可以概括为:
text
1. 配置 SwtConfig
2. 选择 SWT Selector
3. 选择 Pulse / High / Low / Toggle
4. Syncmux 的 Sig_i 选择对应 SWT
5. Sig_o 选择 Etimer Clear / Set / Snap
6. 软件调用 XTRG_SoftwareTrigger()
适合需要多个硬件模块同步动作的场景。
15. 生成代码后建议检查什么?
EB Generate 成功并不代表配置一定符合预期。
建议至少检查:
text
Xtrg_PBCfg.c
中的配置结构。
重点确认:
text
Controller Instance
Callback
Signal Input
Signal Output
Trigger Source
Tmux
ADC Target
Priority
特别是 ADC 硬件触发场景,要确认:
text
EB 页面配置
│
▼
生成的 XTRG Config
│
▼
实际初始化调用
三者是一致的。
16. XTRG 配置注意事项
最后把比较容易踩坑的地方统一整理一下。
16.1 XTRG 本身通常不是信号源
除了 SWT 等特殊功能以外:
text
XTRG 主要负责 Routing
而不是自己产生 PWM、ADC Conversion 或 Capture。
因此排查时一定先确认:
text
Source Signal 是否真实存在
16.2 Tmux 配置完成并不等于已经生效
重点检查:
c
XTRG_DirTrigEnableConfig()
以及:
c
XTRG_IndirTrigEnableConfig()
16.3 Priority 只在竞争同一个 ADC 时有意义
只有:
text
同时触发
+
同一个 ADC
才需要讨论优先级。
16.4 Direct 和 Indirect 的 Priority 是独立的
text
Direct
只和 Direct 比较
Indirect
只和 Indirect 比较
两者不是一个统一的优先级队列。
16.5 Notification 不等于 Interrupt Enable
要进入 Callback,需要检查完整链路:
text
XTRGNotification
+
Interrupt Enable
+
Callback Enable
16.6 IOOut 有配置但 Pin 没有波形
按照完整链路检查:
text
eTimer/GTM
│
▼
XTRG
│
▼
XTRG_IO_O
│
▼
Port / PinMux
│
▼
Physical Pin
不要只修改 XTRG。
16.7 ADC 不触发时不要只检查 ADC
建议按照下面顺序排查:
text
① PWM/eTimer 有没有波形?
② Trigger Event 有没有产生?
③ XTRG Controller 对不对?
④ Trigger Source 选对了吗?
⑤ Tmux 配对了吗?
⑥ TID / ADC Target 对吗?
⑦ Tmux Enable 了吗?
⑧ ADC Hardware Trigger 打开了吗?
⑨ TMUX_DONE 有没有产生?
⑩ ADC Result 有没有更新?
16.8 SWT 连续触发要注意上一次 Event 是否结束
手册说明,SWT 下一次触发需要等待上一次触发事件结束。
尤其配置较长 Pulse 时需要注意。
17. 总结
E3620 XTRG 的配置页面虽然比较多,但从工程角度看,本质上就是三件事。
首先确定:
text
Source
也就是:
谁产生信号?
然后确定:
text
XTRG Routing
也就是:
信号需要经过哪个 Mux、Matrix 或 Trigger 模块?
最后确定:
text
Destination
也就是:
最终由哪个外设使用?
整个配置过程始终围绕:
text
Source
│
▼
XTRG
│
▼
Destination
去展开即可。
实际使用时,可以先根据需求选择 XTRG 子模块:
text
普通内部路由
→ SigOutConfig
输出到 IO
→ IOOutConfig
跨 XTRG
→ InterOutConfig
同步事件
→ SyncmuxConfig
逻辑组合
→ SignalMatrixConfig
软件触发
→ SwtConfig
ADC 硬件触发
→ TmuxDrt / TmuxIndrt
IO 滤波
→ IOFilterConfig
DMA 触发
→ TrigDMACfg
Functional Safety
→ Smon / Swdt
然后再结合具体外设:
text
Port
eTimer
GTM
ADC
DMA
完成整个信号链配置。
相比单独记忆每一个 XTRG 参数,建立这种:
"从信号源一路跟到目标外设"
的思维方式,在后续做配置、代码检查以及问题排查时会更加高效。