主题中讨论的其他器件:TDC7200、
工具/软件:
尊敬的社区
当前情况:
我们使用 TMS320F28376S 微控制器和 TDC7200 时间数字转换器。 我们的应用使用 SYS/BIOS (6.83.0.18) 作为 RTOS。
我们已将计时器配置为 Hwi、该计时器通过向 TDC7200 发送命令来发布 SWI 以启动测量。 Hwi 只发布 SWI。 在 SWI 中、我们负责处理逻辑、清理、读取上一次测量中的 TOF 值并开始新的测量。 我们每 1.6ms 进行一次测量。 我们设置一个计时器、每 200us 调用一次、但在每 8 个切片上、我们发送测量命令。
void TIMER1_SWI() { // Timer Swi
Controller::handleTimerIsr();
}
void TIMER1INT_ISR(UArg) { // Timer Hwi
Swi_post(TIMER1_swi);
}
当然、我们设置了一个外部中断、该中断会发布一个 SWI、用于处理逻辑。 这意味着、启动 SPI 传输以读取这些值来计算 TOF1 和 TOF2。 TDC7200 具有一条中断线、该中断线在测量开始时拉至高电平、在测量完成时拉至低电平。
extern const Swi_Handle XINT3_swi;
void XINT3_ISR(void) // 0x000DF0 XINT3
{
Swi_post(XINT3_swi); // post a SWI
}
void XINT3_SWI() { // TDC Swi
Controller::handleXintIsr();
}
Here is the SYS/BIOS configuration which we set up the ISR's which come from the TDC7200. The XINT3_ISR is the only one which is called in the Interrupt Group 12.// XINT Configuration which is triggered too often
var hwi11Params = new Hwi.Params();
hwi11Params.enableAck = true;
hwi11Params.instance.name = "XINT3_HWI";
Program.global.XINT3_HWI = Hwi.create(120, "&XINT3_ISR", hwi11Params);
// The corresponding SWI which is posted in XINT3_ISR
var swi10Params = new Swi.Params();
swi10Params.instance.name = "XINT3_swi";
swi10Params.priority = 10;
Program.global.XINT3_swi = Swi.create("&XINT3_SWI", swi10Params);
问题:
我们观察到 ISR 已启动、即使 TDC7200 在中断线路上没有下降沿、 这可以在下图中看到。 我们使用 64 位均值计算来设置 TDC7200。
在第一张图中、可以看到 TDC7200 中断具有短脉冲的预期测量。 在这些脉冲内、有 64 个周期完成、我们从 TDC7200 接收有效数据。 这很有魅力。 然而、在四个周期后的“不良“测量中、我们的 SWI 被调用、由于 TDC7200 中断线路上缺少下降沿、甚至不应触发 HWI。
下图从前一个放大了。 可以看到、在 4 个周期后、我们被调用到 SWI、即使 TDC7200 中断也不会得到 0。 我们知道、我们处于 SWI 中、因为从 ToF 值进行的 SPI 传输仅在该 SWI 中实现。 这些值当然是错误的(我们计算出了负 TOF 值)。 有趣的是、我们在 4 个周期后得到了这个糟糕的测量结果。 这不是很规律的、但 1%到 2%的测量结果都是这样的。
调用堆栈和寄存器值:
当测量失败时、这是调用栈。
SWI 启动时的寄存器值如下测量不良时所示:
PieCtrlRegs->PIEACK.ACK12 = 1
IFR->INT12 = 1
PIEIFR12->INTx1 = 1
已完成的操作:
据我们所知、SYS/BIOS 应负责重置 ISR 的 PIEIFR 标志以及中断组的确认位。 我不知道 SYS/BIOS 的确切函数有什么作用、但我认为 SYS/BIOS 不知道此函数调用。 这也说明了未复位的 PIE 寄存器。 不过、大多数情况下、测量工作正常、仅在检测到下降沿时才调用 ISR。
此外、调用堆栈与良好的测量不同。 在一个良好的测量开关 AndDispatch 被称为,这是更多的是我期望的。 另外、还有调用的 restoreHwi、我想它会负责清除寄存器值。 这并不容易理解 SYS/BIOS、因为可用的文档相当差。
我们是否错过了正确配置 SYS/BIOS? 我们怎么可以肯定, Hwi 被称为,谁发布 SWI ?
当我们在 HWI 中发布 SWI 时,调度程序是如何工作的?
我真的很感激这个问题的任何提示。
此致、Robert