This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F28376S:MCU 启动 SWI 偶数引脚未切换

Guru**** 2387830 points
Other Parts Discussed in Thread: TDC7200, TMS320F28376S
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1515815/tms320f28376s-mcu-starts-swi-even-pin-is-not-toggled

器件型号:TMS320F28376S
主题中讨论的其他器件: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

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Robert:

    很抱歉耽误了回复。 您仍然看到该问题吗? 我将邀请 SYS BIOS 专家对您的问题进行评论。

    此致、

    Delaney

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢你。 是的、我们仍然有问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Robert:

    您是否能够把一个 GPIO 切换XINT3_ISR () 来看看它是否被触发两次,或者软件中是否有其他东西无意中发布了两次 SWI ? 您认为 BIOS 应该处理 ACK(我看到您使用了)是正确的hwi11Params.enableAck = true

    从图中看似乎没有问题、但您是否在用于 XINT3 的 GPIO 上启用了一些限定条件?

    Whitney

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Whitney、

    是的,我们在我的帖子的第二张图片中看到了这一点。 黄线是片选信号、仅在 SWI 中拉至低电平、由 XINT3 的 HWI ISR 发出。 仅当 TDC7200 中断线被拉至低电平(橙色线)时、才会调用 XINT3 的 HWI。 您可以看到、这不会发生。

    我在软件中没有看到任何其他触发 SWI 的内容。 此外、我可以测量是否调用了 XINT3_ISR、即使不应该调用它也是如此。 因此、调用了 SWI。 XINT3 是 12 组中最致命的 ISR。

    我不太确定您是什么意思、但这里是我们的 TDC7200 设置。

    GPIO_SetupPinMux(c_TDC7200IntGpio, GPIO_MUX_CPU1, 0);
    GPIO_SetupPinOptions(c_TDC7200IntGpio, GPIO_INPUT, (GPIO_PULLUP | GPIO_SYNC));
    PieCtrlRegs.PIEIER12.bit.INTx1 = 1; // Enable PIE Group 12 XINT3
    IER |= M_INT12; // Enable CPU INT12

    GPIO_SetupXINT3Gpio(c_TDC7200IntGpio);

    XintRegs.XINT3CR.bit.POLARITY = 0; // Falling edge interrupt
    XintRegs.XINT3CR.bit.ENABLE = 1; // Enable XINT3

    // TDC chip select
    GPIO_SetupPinMux(s_spiChipSelect, GPIO_MUX_CPU1, 0);
    GPIO_SetupPinOptions(s_spiChipSelect, GPIO_OUTPUT, GPIO_PUSHPULL);
    GPIO_WritePin(s_spiChipSelect, s_gpioHighLevel);

    谢谢、此致

    Robert

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    根据鉴定、我是指配置具有小采样窗口的输入来处理噪声。 这可以配置为GPIO_SetupPinOptions FLAGS 参数的一部分(例如使用 GPIO_QUAL6 而不是 GPIO_SYNC)。

    Whitney

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、谢谢。
    您如何评价我们的配置?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您不应   直接写入 PieCtrlRegs.PIEIER12。 您应该使用 SYS/BIOS 函数启用中断。

    如前所述、您还可以尝试更改 XINT 引脚配置以包含一些限定条件:

    GPIO_SetupPinOptions(c_TDC7200IntGpio, GPIO_INPUT, (GPIO_PULLUP | GPIO_QUAL6));

    否则、到目前为止、您分享的代码没有出现任何问题。

    Whitney

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Whitney、

    GPIO_QUAL6 / GPIO_GPIO3 解决了这个问题。 我仍然不明白为什么我们会得到这样一个不同的调用栈。 这就是我没有查看 GPIO 设置并为 SYS/BIOS 贡献了大量精力的原因。
    此处是不同的调用堆栈:

    您是否得到了这方面的答案?

    此致

    Robert

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在一切正常工作的情况下、我假设上下文切换的顺序可能是类似的

    计时器 Hwi ->计时器 SWi ->【一些后台任务或其他任务】-> XINT Hwi -> XINT SWi

    但是、如果 XINT 在计时器 Swi 完成之前非常快地触发、则上下文切换到 XINT Swi 可能会在计时器 Swi 内或在计时器 Swi 结束时发生、具体取决于它们的相对优先级。 所以我认为调用堆栈的差异是由交换机是从 XINT Hwi 发出的还是从另一个 Swi 发出的。 考虑到您看到的事件的时间安排、这是否有意义?

    Whitney

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、同意了。
    您的情况正确。 但是、我仍然不理解为什么 SYS/BIOS 不清除相应 ISR 行的确认和标志位。
    根据我的理解、这应该由 SYS/BIOS 处理并且独立于调用函数?

    Robert

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如果 “enableAck"为“为 true、则在 Hwi 调度程序中(在调用 Hwi 函数之前)、ACK 会在相当早的时间内被清除。 您看到它是在 XINT Swi 中的断点处停止时设置的? 我想如果您坐在断点处时出现 XINT 事件、它可能会设置标志。 这是不是会发生、还是 TDC2700 始终保持该线路处于高电平?

    Whitney