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.

[参考译文] TMS320F28335:调用标准库 printf 函数会中断 PWM 输出

Guru**** 2522770 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/601591/tms320f28335-calling-standard-library-printf-function-disrupts-pwm-outputs

器件型号:TMS320F28335

你好

我正在使用 PWM 外设生成三相 PWM 输出。 PWM 计时器的超时事件会生成中断、并且在相应的 ISR 中、占空比会发生变化。

现在、我想使用 stdio.h 库函数与微控制器之间发送和接收信息。 在所有相关的初始化之后、我在一个空的 while (1)循环中有一条 printf 语句、该程序在等待下一个计时器中断时被限制在该语句中。 这是我输入的唯一 printf 语句。 因此、根据我的理解、这不应对 PWM 输出产生任何影响、因为它应在 ISR 运行时被中断和暂时挂起、然后在 ISR 完成后允许恢复。

但是、当我在示波器上查看它们时、PWM 输出会中断、当我关闭 CCS 中的调试会话时、从而移除微控制器和 CCS 控制台之间的连接(成功地)、PWM 输出返回到预期的运行状态。  

那么、为什么会发生这种情况呢? printf 函数内是否有更高优先级的中断例程、这些例程不能被我的 PWM 计时器中断? 如何解决此问题、使其能够在不中断 PWM 的情况下将字符串打印到控制台?

感谢您花时间阅读。

此致

Josh

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

    Josh、您好!

    printf 函数插入一个软件断点来格式化和导出指定的字符串。 当字符串通过仿真链路导出时、该断点会暂停 DSP。 通常、这需要几千个周期。

    正在发生的情况是、调制 PWM 占空比的(ISR)代码不会被调用、因为在调试器读取 CIO 缓冲器时、断点会暂停器件。 您不应看到 PWM 停止、因为它在硬件中运行、但在发生 printf 时、您可能会暂时丢失占空比更新。

    此处提供了几种 Web 资源、可帮助您了解背景:
    http://processors.wiki.ti.com/index.php/Tips_for_using_printf
    http://processors.wiki.ti.com/index.php/Printf_support_in_compiler

    当您使用 stdio 打印函数之一时、这种情况始终会发生。 我只能考虑两种方法来避免这一问题:
    -您可以通过其他通信端口传输消息,例如通过 SCI 通过 RS232链接传输到您的 PC。
    -或者、如果您准备将项目移植到使用 BIOS、则有一个 LOG_printf 函数可用、不存在此问题。

    此致、

    Richard

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

    正如 Richard 所说的、printf 例程会经过调试器仓体、减慢运行速度、并且在没有插入调试器的情况下无法使用。 如果您的产品有可用的 UART/SCI 端口、我们将执行以下操作。 我们使用 sprintf 生成格式化的缓冲区、然后使用中断驱动代码将其从 UART 端口发送出去。

    劳埃德
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您的回复。 这是一个很大的帮助。 非常感谢。