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.

[参考译文] MSP430F5438A:如何触发 USCI39?

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/1113852/msp430f5438a-how-to-trigger-usci39

器件型号:MSP430F5438A

大家好、TI 论坛、

我正尝试通过 USCI39问题导致不可预测的代码执行、到目前为止、我一直无法执行。 这样做的动机是为了证明它会影响我们的微控制器、以便我可以证明更新看起来运行正常的现有固件是合理的。 我阅读以下论坛帖子、以更好地了解该问题:

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/409917/help-on-dealing-with-usci39-on-a-5xx-msp430

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/462451/msp430f5335-crashing

根据勘误表、"如果以下所有事件按以下顺序发生、则会触发此勘误表:
挂起中断:在 GIE=0时、UCxIFG=1和 UCxIE=1中的一个
2. GIE 由软件(例如 EINT)
执行"EINT"指令后、挂起的中断在1个 MCLK 时钟周期的时间窗口中由硬件(外部 I2C 事件)清除。"

因此、我一直在尝试创建这些事件、从而导致不可预测的代码执行。 我有一个测试设置、其中两个微控制器通过 I2C 和几条 GPIO 线路相互通信。 MSP430F5438A-EP 配置为 I2C 目标、Tiva-TM4C 配置为 I2C 控制器。 以下是我要执行的步骤:

MSP430禁用 GIE、然后将 GPIO 线路驱动为低电平。

2. GPIO 线路变为低电平会触发 Tiva 向 MSP430发送一个 I2C 启动命令

3. MSP430将 GPIO 线路驱动为高电平、执行8个 NOP、然后启用全局中断

GPIO 线路变为高电平将触发 Tiva 发送 I2C 停止命令。

我要尝试的是在 GIE=0时在 MSP430中创建一个挂起的 UCSTTIFG、然后设置 GIE=1、在接下来的 MCLK 周期中、通过引起一个 UCSTPIFG 来清除 UCSTTIFG。

我一直在使用示波器来验证信号时序、通过使用示波器并添加精确数量的 NOP、我感觉我已经非常接近我需要的位置。 我可以足够精确地生成 I2C 停止信号、以便在一次测试中可以看到 MSP430调用 UCSTPIFG ISR;通过在 下一次测试中将 I2C 停止命令延迟24纳秒、我可以看到 MSP430调用 UCSTTIFG ISR、然后是 UCSTPIFG ISR。

因此、虽然我能够精确控制此 I2C 停止命令并使 MSP430在 执行1个 ISR 或2个 ISR 之间"振荡"、但我似乎不能导致不可预知的代码执行。 有人对我可能会做什么有任何想法吗? 或者、我的 MSP430F5438A 在某种程度上不受此问题的影响吗?

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

    此问题是由中断硬件被混淆引起的。 它识别出它需要为中断提供服务并开始该过程。 然后从中断源的下方将其拉出。 (硬件可清除是关键变量。) 因此、当它计算矢量地址时、它没有要使用的中断源。 因此、获取的矢量可能来自知道何处的人。 当然、假设没有其他中断处于等待状态。

    但是您启用了停止中断、因此通过清除启动条件中断、您还可以提供停止条件。 这没用。

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

    尊敬的 David:

    感谢您的回复! 如果我理解正确、我的设置问题是我同时启用了 UCSTTIE 和 UCSTPIE。 如果我只启用 UCSTTIE、这将触发不可预知的代码执行、这是因为 MSP430将尝试为 UCSTTIFG 提供服务、但它将在它能够计算向量地址之前被清除。

    这是否意味着、只要我启用了 UCSTTIE、UCSTPIE 和 UCNACKIE、MSP430就不会出现此问题? 因为唯一清除 UCSTTIFG 的东西是 UCSPIFG?

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

    我不知道硬件的详细信息、所以不能说您能不能免疫。 我之前已经说过、但寄生中断矢量(其他一些处理器具有)在这里非常有用。

    如果您能够可靠地触发故障、您可能希望查看是否可以确定使用的矢量。 希望其中一个定义为矢量区域开头的空格的字符会被重用为 BSL 密码等。

    如果它是已定义的向量之一、则提供默认处理程序可能会解决问题。

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

    尊敬的 David:

    好的、谢谢您的建议! 我将尝试禁用 UCSTPIE、看看这是否意味着我可以始终重现问题。