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.

[参考译文] RM57L843:RTI 4MHz 中断问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/781244/rm57l843-rti-4mhz-interrupt-issue

器件型号:RM57L843
主题中讨论的其他器件:HALCOGEN

您好!

我已将 RTI 模块配置为1MHz、并且能够每1微秒获得一次中断。 当我将 RTI 配置为4MHz 时、在250nsec 的每1微秒仍会触发一次中断。RTI 驱动器是否支持最大1MHz 频率? 不可能再有更多的问题了?

谢谢、

Venkat

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    如果您的 ISR 所用时间超过250ns、则下一个中断将挂起、直到 ISR 继续。


    此致、
    米罗
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好、Miro
    我的 ISR 大约需要950 nsec。 ISR 代码只切换 GPIO 引脚。RTI 驱动程序触发中断的时间大约为900nsec。
    这是我的 ISR 代码
    空 rtiCompare0中断(空)

    /*用户代码开始(43)*/
    /*用户代码结束*/

    rtiREG1->INTFLAG = 1U;
    gioToggleBit (gioPORTA、7);//PI 引脚

    /*用户代码开始(44)*/
    /*用户代码结束*/

    主应用程序代码会无限循环
    while (1);
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你(们)好、Miro
    我的 ISR 大约需要950 nsec。 ISR 代码只切换 GPIO 引脚。RTI 驱动程序触发中断的时间大约为900nsec。
    这是我的 ISR 代码

    空 rtiCompare0中断(空)

    /*用户代码开始(43)*/
    /*用户代码结束*/

    rtiREG1->INTFLAG = 1U;
    gioToggleBit (gioPORTA、7);//PI 引脚

    /*用户代码开始(44)*/
    /*用户代码结束*/


    主应用程序代码如下所示

    int main (空)

    /*用户代码开始(3)*/


    /*初始化 GPIO */
    gioInit();

    /*初始化 RTI 驱动程序*/
    rtiInit();


    /*将高端计时器 GIO 端口 A 的引脚方向设置为所有输出1 -输出:0输入*/


    gioSetDirection (gioPORTA、0xFFFFFFFC);



    gioEnableNotification (gioPORTA、0);




    rtiEnableNotification (rtiREG1、rtiNOTIFICATION_COMPARE0);


    /*启用 IRQ -清除 CPS 寄存器中的 I 标志
    注:这通常由操作系统或 SVC 调度程序来完成*/
    _enable_IRQ_interrupt_();

    rtiResetCounter (rtiREG1、rtiCOUNTER_BLOCK0);
    rtiResetCounter (rtiREG1、rtiCOUNTER_Block1);


    rtiStartCounter (rtiREG1、rtiCOUNTER_BLOCK0);

    /*启动 RTI 计数器块0以生成系统节拍*/
    rtiStartCounter (rtiREG1、rtiCOUNTER_Block1);



    while (1);



    RTI 初始化代码:


    void rtiInit (void)

    /*用户代码开始(2)*/
    /*用户代码结束*/
    /**@b 初始化@b RTI1:*/



    /**-为自由运行计数器0设置时基*/
    rtiREG1->TBCTRL = 0x000000000000U;

    /**-启用/禁用两个计数器块的捕获事件源*/
    rtiREG1->CAPCTRL = 0U | 0U;

    /**-设置输入源比较0-3 */
    rtiREG1->COMPCTRL = 0x000000000000U | 0x000000000000 | 0x0000000000000000;

    /**-重置计数器0 */
    rtiREG1->CNT[0U].ucx = 0x00000000U;

    /**-重置自由运行计数器0 */
    rtiREG1->CNT[0U].FRCx = 0x000000000000U;

    /**-设置计数器0比较值
    * - 0x00000000:2^32分频
    * -0x00000001-0xFFFFFFFF:除以(CPU0 + 1)
    *
    rtiREG1->CNT[0U].CPUx = 1U;

    /**-重置计数器1 */
    rtiREG1->CNT[1U].ucx = 0x00000000U;

    /**-重置自由运行计数器1 */
    rtiREG1->CNT[1U].FRCx = 0x00000000U;

    /**-设置计数器1比较值
    * - 0x00000000:2^32分频
    * -0x00000001-0xFFFFFFFF:除以(CPUC1 + 1)
    *
    rtiREG1->CNT[1U].CPUx = 1U;

    /**-设置比较0值。 此值与选定的自由运行计数器进行比较。 *
    rtiREG1->CMP[0U].Compx = 1U;

    /**-安装程序更新比较0值。 该值将添加到每个比较匹配的比较0值中。 *
    rtiREG1->CMP[0U].UCPx = 1U;

    /**-设置比较1值。 此值与选定的自由运行计数器进行比较。 *
    rtiREG1->CMP[1U].Compx = 1U;

    /**-设置更新比较1值。 该值将添加到每个比较匹配的比较1值中。 *
    rtiREG1->CMP[1U].UDCPx = 1U;

    /**-设置比较2值。 此值与选定的自由运行计数器进行比较。 *
    rtiREG1->CMP[2U].Compx = 1U;

    /**-安装程序更新比较2值。 该值将添加到每个比较匹配的比较2值中。 *
    rtiREG1->CMP[2U].UCPx = 1U;

    /**-设置比较3值。 此值与选定的自由运行计数器进行比较。 *
    rtiREG1->CMP[3U].Compx = 1U;

    /**-安装程序更新比较3值。 该值将添加到每个比较匹配的比较3值中。 *
    rtiREG1->CMP[3U].UCPx = 1U;

    /**-清除所有挂起的中断*/
    rtiREG1->INTFLAG = 0x0007000FU;

    /**-禁用所有中断*/
    rtiREG1->CLEARINTENA= 0x00070F0FU;

    /**-设置 NTU 源、调试选项和禁用两个计数器块*/
    rtiREG1->GCTRL =(UINT32)((UINT32) 0x5U <<16U)| 0x00000000U;

    /**@注意,必须先调用此函数,然后才能使用驱动程序。\n
    * 此函数必须在特权模式下执行。\n
    * 此函数不会启动计数器。
    *

    /*用户代码开始(3)*/
    /*用户代码结束*/
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    当 IRQ 被生成时、所有其它中断被挂起(IRQ 只能由 FIQ 中断)。 如果 ISR 执行需要950nsek、则会在超过950nsek 的时间内生成下一个 IRQ。

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

    您好!

    如何将 ISR 执行时间从950nsec 减少到250nsec。 简单的 GPIO 引脚切换不应花费950 nsec。

    请提出您的想法。

    谢谢

    Venkat

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

    您好!

    您是否有任何支持4MHz 及更高频率的示例 RTI 驱动程序代码/HALCOGEN 项目。

    谢谢、

    Venkat。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    如果您将 RTI 工作在其110MHz 的最大频率上、那么当 RTICPUn 寄存器设定为1和 RTCUDCPn 设定为1时、RTI 模块可在大约9.1ns 内生成中断(请见器件 TRM 中的第17.2.2章中断/ DMA 请求)。 对于75MHz、t_RTICLK 将大约为13.33ns。
    生成中断后、您应考虑中断延迟(从生成中断到为中断源提供服务所经过的时间)。 请参阅以下主题: e2e.ti.com/.../1032876 、其中 Sunil 在随附的 pdf 文件中解释了此过程。 根据上述线程的设置和测量值、您可以计算为中断提供服务的大约时间。 请考虑 Sunil 在上一篇文章中提到的内容:"中断延迟也不是固定的数字、并且取决于发生中断时 CPU 的状态。 这可能是高度可变的、因此未指定。"

    此致、
    米罗
x 出现错误。请重试或与管理员联系。