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.

[参考译文] TMDX570LC43HDK:FreeRTOS 项目中的 RTI 触发时间为5ms 且节拍为1ms 的示例

Guru**** 2386610 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/648110/tmdx570lc43hdk-example-of-rti-trigger-5-ms-in-freertos-project-having-tick-1ms

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

您好!

我使用的是周期为1ms 的 FreeRTOS、我还需要周期为5ms 的 RTI 时钟触发器、

我不想使用软件计时器。

这种实施有一些例子吗?

谢谢
Antonio

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

    请启用第二个 RTI 比较、以每5ms 生成触发器。 您必须手动添加代码。 RTI 配置在 os_port.c 中的 prvSetupTimerInterrupt (void)函数中
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    HY、实际设置为:

    静态空 prvSetupTimerInterrupt (void)
    {
    //禁用计时器0。 //
    portRTI_GCTRL_REG &= 0xFFFFFFFEUL;
    
    //使用内部计数器。 //
    portRTI_TBCTRL_REG = 0x000000000000U;
    
    // COMPSEL0将使用 RTIFRC0计数器。 //
    portRTI_COMPCTRL_REG = 0x000000000000U;
    
    //初始化计数器和预分频计数器寄存器。 //
    portRTI_CNT0_UC0_REG = 0x000000000000;
    portRTI_CNT0_FRC0_REG = 0x00000000U;
    
    //设置 RTI 时钟的预分频器。 //
    portRTI_CNT0_CPU0_REG = 0x00000001U;
    portRTI_CNT0_COMP0_REG =(CONFIGCPU_CLOCK _Hz / 2)/ CONFIGTXK_RATE_Hz;
    portRTI_CNT0_UDCP0_REG =(CONFIGCPU_CLOCK _Hz / 2)/ CONFIGICK _RATE_Hz;port_RIT_CNT0_UDCP0_REG =(CONFIGCP0_CLK_RET_RECO_RECO_Hz
    
    /portRTI_INTFLAG_REG
    = 0x0007000FU;
    portRTI_CLEARINTENA_REG= 0x00070F0FU;
    
    //启用比较0中断。 //
    portRTI_SETINTENA_REG = 0x00000001U;
    portRTI_GCTRL_REG |= 0x00000001U;
    } 

    我必须启用1到5ms 的比较、以便该设置只需添加以下寄存器值即可?

           #define portRTI_CNT0_FRC1_REG  (*(volatile uint32_t *) 0xFFFFFF30) 
           #define portRTI_CNT0_UC1_REG   (*(volatile UINT32_t *) 0xFFFFFF34)
           #define portRTI_CNT0_CPUC1_REG (*(volatile UINT32_t *) 0xFFFFFF38)
           #define portRTI_CNT0_COMP1_REG (*(volatile uint32_t *) 0xFFFFFF58)
           #define portRTI_CNT0_UDCP1_REG (*(volatile UINT32_t *) 0xFFFFFF5C)

           /* COMPSEL0将使用 RTIFRC0计数器。 *
           PORTTI_COMPCTRL_REG = 0x000000000000U;

           PORTTI_CNT0_UC1_REG = 0x000000000000U;
           PORTTI_CNT0_FRC1_REG = 0x000000000000U;

           /*为 RTI 时钟设置预分频器。 *
           PORTTI_CNT0_CPUC1_REG = 0x00000001U;
           PORTTI_CNT0_COMP1_REG =(CONFIGCPU_CLOCK _Hz / 2)/ CONFIGTXK_RATE_Hz * 5;
           PORTTI_CNT0_UDCP0_REG =(CONFIGCPU_CLOCK _Hz / 2)/ CONFIGTXK_RATE_Hz * 5;

    很抱歉、但对我来说、实施起来并不简单、
    谢谢、
    Antonio
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Etantonio、

    RTI 比较1可以使用 counter0或 counter1。 如果它使用 counter0、则需要定义 COMP0和 UDCP0:

    #define portRTI_CNT0_COMP1_REG (*(volatile uint32_t *) 0xFFFFFF58)
    #define portRTI_CNT0_UDCP1_REG (*(volatile UINT32_t *) 0xFFFFFF5C)

    PORTTI_CNT0_COMP1_REG = PORTTI_CNT0_COMP1_REG * 5;//5ms
    PORTTI_CNT0_UDCP1_REG = PORTTI_CNT0_UDCP1_REG * 5;//5ms

    设置比较1和1中断:
    PORTTI_SETINTENA_REG = 0x03;
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢 QJ Wang、

    我已经执行了您的建议、现在假设中断可用-关于如何捕获中断的问题、

    事实上、RTI 驱动程序不是由 HalCoGen 生成的、所以我从另一个项目复制了文件 HL_reg_rti.h、并且我还添加了以下通知

    /*注-您需要从 notification.c 中删除 rtiNotification 以避免重新定义*/
    void rtiNotification (rtiBASE-t * rtiREG、uint32通知)
    {//
    在用户代码开始和用户代码结束之间输入用户代码。 *
    /*切换 HET 引脚0 */
    gioSetPort (hetPORT1、gioGetPort (hetPORT1)^ 0x00000001);
    } 

    但它没有被调用、

    随附示例项目、有关如何解决该项目的任何想法?

    感谢您的观看、

    Antonio

    e2e.ti.com/.../8688.freeRTOSBlinkyAndOtherRTI.zip

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

    现在、它几乎可以工作、

    完整的过程如下:

    1)在 HalCoGen 中、将"VIM RAM"重命名为"rtiCompare1Interrupt"中断0x00000010:03
    2) 2)在 HalCoGen 中"VIM 通道0-31"启用中断3 RTI 比较1
    3) 3)在 HalCoGen 中生成代码
    4) 4)添加了 HL_RTI.h
    5) 5)添加了 HL_reg_RTI.h
    6) 6)添加了 HL_RTI.c
    7)在 os_port.c 中
       在   /*用户代码开始(2)*/中添加了以下行
          #define portRTI_CNT0_COMP1_REG (*(volatile uint32_t *) 0xFFFFFF58)
          #define portRTI_CNT0_UDCP1_REG (*(volatile UINT32_t *) 0xFFFFFF5C)
          
       在方法 prvSetupTimerInterrupt 末尾添加了以下行
          /*启用5ms compare1计时器*/
          PORTTI_CNT0_COMP1_REG = PORTTI_CNT0_COMP0_REG * 5;//5ms
          PORTTI_CNT0_UDCP1_REG = PORTTI_CNT0_UDCP0_REG * 5;//5ms
          PORTTI_SETINTENA_REG = 0x03;
          
    8) 8)代码中需要的位置、添加:    
          #include "HL_REG_RTI.h"
          #include "HL_RTI.h"
          void rtiNotification (rtibase_t * rtiREG、uint32通知)
          {
             //gioSetBit (hetPORT1、0、gioGetBit (hetPORT1、0)^ 1);
          }

    几乎还可以,因为

          PORTTI_CNT0_COMP1_REG = PORTTI_CNT0_COMP0_REG * 5;//5ms
          PORTTI_CNT0_UDCP1_REG = PORTTI_CNT0_UDCP0_REG * 5;//5ms
          PORTTI_SETINTENA_REG = 0x03;

    每次我使用 HalCoGen 生成代码时被删除、并且函数 prvSetupTimerInterrupt 中没有可用的用户块

    在代码执行期间、我还尝试使用以下指令执行同样的操作

         rtiStopCounter (rtiREG1、rtiCOUNTER_BLOCK0);
         uint32 rtiCompare0Period = rtiGetPeriod (rtiREG1、rtiCOMPARE0);
         uint32 rtiCompare1Period = rtiCompare0Period * 5;
         rtiSetPeriod (rtiREG1、rtiCOMPARE1、rtiCompare1Period);
         rtiResetCounter (rtiREG1、rtiCOUNTER_BLOCK0);

    但是 rtiCompare0Period 似乎始终为0

    下面是工作示例

    e2e.ti.com/.../0407.freeRTOSBlinkyAndOtherRTI.zip

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

    干得不错。 感谢您与我们分享您的工作项目。