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.

[参考译文] TM4C1292NCZAD:为单触发 PWM 和 LCD 调色板动画配置的定时器可能出现异常。

Guru**** 2482105 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/709358/tm4c1292nczad-possible-anomalies-with-timers-configured-for-one-shot-pwm-and-lcd-palette-animation

器件型号:TM4C1292NCZAD

我尝试将以下内容直接发送给 TI 支持、但这太痛苦了、所以我将其发布在这里、以防它对其他人有用。

在开发过程中、我遇到了一些问题、我会将这些问题称为芯片异常、但您的勘误表中目前未记录这些问题。

 

  1. 我为菊花链单次 PWM 配置了 Timer 1A 和 B 以及 Timer 2 A 和 B。 所有计时器均配置为具有相同的周期和占空比。 如果我尝试将计时器配置为大于16位的周期,则当上一个计时器过期时,链中的下一个计时器不会触发。 仅计时器1A 运行。 如果我将计时器配置为重复计时、它们按预期工作、或者如果我将计时器配置为65536或更短的周期、则它们按预期工作。 如果我将预分频设置或预分频匹配设置为非零,则链中的下一个计时器不会启动。 我找到的唯一权变措施是使用 ALTCLK 来驱动计时器、以获得我想要的更长周期。 系统以120MHz 的频率运行、我尝试将菊花链的每个相位设置为6ms。
  2. 我将调色板动画用于 LCD 控制器。 由于固件中存在错误、每隔30秒左右会发生几百次调色板写入的突发。 启动后大约20分钟到8小时、显示屏将闪烁、恢复它的唯一方法是重置主 LCD 时钟(LCDCLKRESET 中的 MAIN 位)。 我们每次修改调色板条目0时,使用的 TI LCD 库都会使用 RAM 结构写入调色板条目0,即使调色板条目0没有被修改。 如果条目0被更改、并且一旦 LCD 控制器被设置、应用程序从不更改条目0、我将库代码更改为仅更新调色板条目0。 使用的 TI 库版本是“这是 Tiva 外设驱动程序库版本2.0.1.11577的一部分”。 LCD 初始化代码为:

 

Ui32SysClkHz = 120000000

 

define PIXEL_CLOCK_FREQ     6000000

 

 

               SysCtlPeripheralEnable (SYSCTL_Periph_LCD0);

               while (!(SysCtlPeripheralReady (SYSCTL_Periph_LCD0)));

 

               LCDModeSet (LCD0_BASE、(LCD_MODE_RRAGH |LCD_MODE_AUTO_UFLOW_RESTART)、PIXEL_CLOCK_FREQ、ui32SysClkHz);

 

               LCDRasterConfigSet (LCD0_BASE、Raster FMT_ACTIVE_PALETTIZED_12位、0);

 

               LCDRasterTimingSet (LCD0_BASE、&g_sRasterTimings);

 

               LCDDMAConfigSet (LCD0_BASE、LCD_DMA_BURST_4 | LCD_DMA_BYTE_ORDER 0123);

 

               LCDRasterFrameBufferSet (LCD0_BASE、0、(uint32_t *)&lcdMemory、sizeof (lcdMemory));

               LCDRasterPaletteSet (LCD0_BASE、LCD_PAGE_TYPE_8bpp、(uint32_t *) lcdMemory.palette、(uint32_t *) paletteData、0、 sizearray (paletteData));

 

               LCDRasterEnable (LCD0_BASE);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Keith、
    感谢您的反馈。 当定时器1和2的 A 和 B 部分都被使用时、它们只是16位定时器、所以尝试将它们配置为一个大于65535个节拍的周期将导致它们不被触发。

    TivaWare 的当前版本为2.1.4.178
    http://www.ti.com/tool/SW-TM4C
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我使用的是8位预分频器、该预分频器应将范围扩展到24位。 正如我说过的、这在连续 PWM 模式下可以正常工作、但在单次 PWM 模式下不能正常工作。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    为了澄清、您是否将匹配值的低16位加载到匹配寄存器中、将匹配值的高8位加载到预分频匹配寄存器中?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的。 我通过以下公式设置四个阶段的周期:

    TimerConfigure (Timer1_base、timer_CFG_SPLIT_PAIR | timer_CFG_A_ONE_SHOT_PWM | timer_CFG_B_ONE_SHOT_PWM);

    TimerConfigure (TIMER2_base、TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_ONE_SHOT_PWM | TIMER_CFG_B_ONE_SHOT_PWM);


    负载= PHASE_PERIOD;
    // A 相和 B 相 PWM 控制。
    TimerLoadSet (Timer1_base、timer_both、load 和0xFFFF);
    TimerPrescaleSet (Timer1_base、timer_both、load >> 16);

    //相位 C 和 D PWM 控制。
    TimerLoadSet (TIMER2_base、timer_both、load & 0xFFFF);
    TimerPrescaleSet (TIMER2_base、timer_both、load >> 16);

    // B 相-D 等待前一个计时器超时后再启动。
    TimerControlWaitOnTrigger (Timer1_base、timer_B、true);
    TimerControlWaitOnTrigger (TIMER2_base、timer_both、true);


    然后、我通过调用以下函数来设置4个相位的占空比:
    静态空保温器_SetPhaseDuty (uint32_t Duty)

    TimerMatchSet (Timer1_base、timer_both、Duty & 0xFFFF);
    TimerPrescaleMatchSet (Timer1_base、timer_both、Duty >> 16);
    TimerMatchSet (TIMER2_base、timer_both、Duty & 0xFFFF);
    TimerPrescaleMatchSet (TIMER2_base、timer_both、Duty >> 16);


    如果 PHASE_PERIOD 大于65535、则仅运行第一个计时器。

    由于我不支持单次触发 PWM 功能的库、我已将 TIMER_CFG_A_ONE_SHOT_PWM 和 TIMER_CFG_B_ONE_SHOT_PWM 重新添加为0x9和0x900、但器件文档指出应该这样做。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Keith Cliffed99"] 分别将 TIMER_CFG_A_ONE_SHOT_PWM 和 TIMER_CFG_B_ONE_SHOT_PWM 添加为0x9和0x900 [/引用]

    也许 Yoda (著名的)引用“ 不是那么快的年轻 padawan (草本)!”   -同样适用-在这里?  

    驱动程序库的 Timer.h 显示:

    TIMER_CFG_A_ONE_SHOT - 半宽单次触发定时器
    Timer_CFG_A_PWM -        半宽 PWM 输出

    Timer_CFG_A_ONE_SHOT      #define TIMER_CFG_A_ONE_SHOT  0x00000021
    Timer_CFG_A_PWM            #define TIMER_CFG_A_PWM         0x0000000A   总和为0x0000.002B -不 是0x9 -但是"B"是非法的。  

    Timer_CFG_B_ONE_SHOT     #define TIMER_CFG_B_ONE_SHOT  0x00002100
    Timer_CFG_B_PWM           #define TIMER_CFG_B_PWM         0x00000A00   总和为0x0000.2B00 -不 是0x900 -再次为"B"非法。

    虽然您的方法是"创新/资源丰富"的-两个代码位都不是"0x9或0x900" 在 寄存器"GPTMTnMR"中设置"SET BIT 5"(TAMIE)-这两个寄存器负责(可能) "生成(丢失)中断!"

    虽然未实现(我们不使用'129系列)-但我们相信 0x0000.002A 和 0x0000.2A00 -作为替代-防止非法"B"值-同时(可能)"启用您的(所需)中断"。

    [引用 user="Keith Cliffold99"]设备文档指出应该这样做。

    您是否可以"说明"(理想的报价)发生在/位于何处(确认文档)?   我们能找到的最接近的是:

    这在某种程度上证明了"不够完整/令人信服..."   总的来说-高度资源丰富-和"可能成功"-应该(未寻址)位'TAMIE'(由驱动程序库正确处理)由您的'Just med发明、多模式定义!'进行良好管理!    (可能)

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

    除非 INT 处理程序重新加载匹配的计数值、否则不必为一次性 PWM 要求中断。 匹配设置值更有可能大于加载设置值、这将锁定计数器。 通过 PWM OneShot CCP 边缘事件的 INT 处理程序内的匹配计数更改来更新 GPTM 的占空比效果不好、过去曾向此论坛报告过。

    一个可能的解决方法是通过另一个 GPTM 的较慢计时器间隔来更新匹配计数、这很好!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    请注意、我们的海报:

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

    我本来应该在我原来的帖子中清楚说明这一点。 抱歉。 我有一个一次性的 PWM 工作令我满意、尽管不像他们在文档中所描述的那样优雅。 单次触发 PWM 模式的工作方式与通告的不同、除非预分频寄存器是非零、 链中的下一个定时器从不启动、如果预分频寄存器为零、那么它们将按预期工作、并且使用 ALTCLK 作为定时器的时钟源、我能够获得足够长的脉冲周期。

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

    感谢您-这里有几个问题变得"解决"-当问题(影响海报)被调查时- 然后放弃-(仅)沉默...

    您是否可以确认在"Register 'GPTMTnMR'中找到的位'TAMIE'未被您的代码设置-因此(看起来)不是必需的?

    会与供应商的 API 冲突、后者会(非常)做出特殊努力设置该位!   (通过编码为"2"的供应商的"引线半字节"实现-毫无疑问 地设置了"TAMIE"位  (并且只有那个位!) 和( 该值 2)  "唯一"的生活目的!)

    当"打破"供应商的考虑-和长期存在/测试的代码-以及(然后)报告 "异常"-(部分)对此类"代码中断"的描述和/或理由-最常证明您对高/关键兴趣...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我既不需要也不需要用于处理 PWM 的中断。 实际上、中断会与其他设计要求相冲突。 硬件存在异常。 硬件的运行方式是否与数据表中描述的一样? 否 我报告了。 我以前曾报告过异常情况、并浪费了大量宝贵的时间、试图让制造商承认和公布异常情况。 最后、他们确实承认了这一点、但考虑到制造商只是报告了异常情况和我已经解决的解决方法、我或我的公司在几周的时间内没有时间让制造商达到这一点、这是不值得的。 我在上一个帖子中试图阐明、我的问题得到了我满意的解决。 如果您想调查问题、我将尝试向正确的方向指示。 另一方面,你只想告诉我我应该怎么做。 别浪费我的时间。