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.

[参考译文] RM44L520:使用 RTI 创建硬件计时器后出现异常行为

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1110552/rm44l520-strange-behaviour-after-using-rti-to-create-a-hardware-timer

器件型号:RM44L520

我在处理某个项目时遇到了一些问题、我认为这里的人可能能够提供一些见解。 我正在处理的项目是使用 TI RM44L520、目前我正在尝试通过 SPI 配置4-20mA 芯片。 由于我在该项目中使用 FreeRTOS、我需要实施硬件计时器以促进通过 SPI 进行通信。 下面我发布了 FreeRTOS 用于配置用于系统时钟的 RTI 的函数以及用于配置通道1上第二个 RTI 比较的代码:

接下来、我使用新的 RTI 比较创建了以下硬件延迟函数:

运行此程序后、我没有获得预期的行为、因此我放置了一个打开一些板载 LED 进行故障排除的功能。 我发现、如果我将 LED 打开功能置于硬件延迟功能的末尾、所有 LED 都将按预期亮起。 如果我将 LED ON 函数置于 hpTimer_DelayInMicroSeconds ()函数下,则调用 LED 不会亮起。 我认为这可能是由于新的 RTI 通道出现了一些错误导致了连续中断,因此我尝试在 hpiTimer_DelayInMicroSeconds ()结束时禁用通道1上的中断,但仍然存在相同的错误。 如果任何人有任何想法、这将是巨大的帮助。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="511679" URL"~/support/microriors/arm-based microset-group/arm -based microriors/f/arm based micro-forum/1110552/rm44l520-hirge-behavial-after 使用后-RTI--to-create-a-hardware-timer"]所有开启 LED/报价的硬件延迟功能。]

    硬件延迟功能是否使用 RTI 比较0或比较1?

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

    它使用 RTI 比较1。  

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

    当我运行程序时、我一直在监视 RTI 寄存器、并且所有带有定时器的东西看起来都按预期工作。 我已经尝试在硬件延迟功能结束时禁用 RTI 通道1、并在顶部重新启用它、FRC1寄存器确实会按预期停止向上计数。 当我这么做时、在 delay 函数返回后调用 LED on 函数时、它仍然不会运行、但在放置在 delay 函数的最后一行时、它会运行。  

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

    RTI 在 prvSetupTimerInterrupt()中配置, 并且只有 在执行 vTaskStartScheduler()后才调用 prvSetupTimerInterrupt()。

    您是否已将  hpTimer_DelayInMicroSeconds ()的地址编程到 VIM 表中? 您可以使用以下方法来执行此操作:

    1.更改 HL_SYS_vim.c 中定义的 VIM 表

    静态常量 t_isrFuncptr s_vim_init[128U]=

      phantomInterrupt (&P)、
      等高中断(&E),/*通道0 */
      PhantomInterrupt、/*通道1 */
      &vPortPreemptiveTick、/*通道2 */
      hpiTimer_DelayInMicroSeconds、//通道3 */

    2.更改 main()中的 VIM 表

       vimRAM->ISR[3]= &hpTimer_DelayInMicroSeconds

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

     在  prvSetupTimerInterrupt()中的 RTI 设置中未启用比较1中断:

    是否在其他地方启用了它?

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

    感谢您的重播。 现在、我将通道3设置为"&rtiCompare1Interrupt"。 如果我在  RTOS 开始时由 prvSetupTimerInterrupt ()初始配置中断、并且在 HpTimer_DelayInMicroSeconds ()函数的运行期间修改寄存器、为什么该函数需要进入 VIM 表? 是否  不会仅使用 hpTimer_DelayInMicroSeconds ()函数来设置已注册的中断、而是在后台使用 rtiCompare1中断来创建中断。 很抱歉,我在这里有误解  

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

    比较1中断在硬件延迟功能开始时启用  

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

    我这样做是为了在使用延迟功能时启用通道1上的中断、并在不再需要时禁用它  

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

    我可能会误解您的问题。  

    rtiCompare1Interrupt()是 RTI 比较1的 ISR。  hpTimer_DelayInMicroSeconds ()不是 ISR,在任务或 rtiCompare1Interrupt ()中调用,对吧?  

    [~ userid="511679" URL" URL"μ C/support/microronics/arm-based microrims-group/arm -basic-microset/f/arm -basic-micro-forum/1110552/rm44l520-hirge-behavial-after 使用后-RTI-create-a-hardware-timer"]如果我将 LED 置于函数下、请勿调用 Microtimers[引用"delaydimes]。

    我是否可以假定没有调用 hpTimer_DelayInMicroSeconds ()?

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

    很抱歉、我会尝试让我的解释更清晰一点。  hpTimer_DelayInMicroSeconds ()是在任务中调用的函数。 当我在 hpTimer_DelayInMicroSeconds ()函数的末尾将 LED 置于函数调用中时,所有 LED 都按预期亮起,因此 会正确调用 hpTimer_DelayInMicroSeconds ()函数。 如果我从  hpTimer_DelayInMicroSeconds ()函数中删除了函数调用上的 LED,并将 LED on 函 数调用放在任务本身的 hpTimer_DelayInMicroSeconds ()函数下面的一行中,则 LED 不会亮起。 出于某种原因, 在 hpTimer_DelayInMicroSeconds ()函数 完全执行后,它永远不会返回到任务主函数。  

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

    比较0和比较1都使用计数器0、比较2使用计数器1。  

    但您的代码读取计数器1自由运行寄存器、并比较使用计数器0和计数器1自由运行寄存器的比较1寄存器。  

    您能否更改 portRTI_COMPCTRL_REG = 0x00000010U | 0x000000000000; -->让比较1使用计数器1?

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

    我修改了行、但仍然存在与以前相同的问题。  

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

    您的 rtiCompare1Interrupt()有什么作用? 当自由运行计数器达到比较寄存器中的值时、代码执行跳转到 RTI ISR。

    如果  hpTimer_DelayInMicroSeconds ()仅用于插入延迟、则无需为比较1启用中断。

    如何将此行更改为:

    PORTTI_SETINIENA_REG &= 0xFFFFFFFD;//禁用比较1的中断

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

    这似乎可以解决该问题。 我对问题有点困惑。