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.

[参考译文] TMS570LS1224:定时器中断

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1359497/tms570ls1224-timer-interrupt

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

大家好!

我必须使用 TMS570LS1224每隔1秒生成计时器中断  

实际上、我已经尝试过写入 ISR 的地方、但我不明白。

以下是我的代码


int main (空)
{
/*用户代码开始(3)*/

//初始化 TMS570LS1224
systemInit();
gioInit ();
sciInit();
rtiInit();
sciSetBudrate (sciREG、1000000);
vimInit;
//_enable_IRQ ();
gioSetDirection (hetPORT1、0x00000000);

rtiSetPeriod (rtiCOUNTER_BLOCK0100000);
rtiEnableNotification (rtiNOTIFICATION_COMPARE0);
rtiStopCounter (rtiCOUNTER_BLOCK0);
rtiResetCounter (rtiCOUNTER_BLOCK0);
rtiStartCounter (rtiCOUNTER_BLOCK0);
/*启用 IRQ -清除 CPS 寄存器中的 I 标志*/
/*注意:这通常由操作系统或在 Svc 调度程序中完成*/
_enable_interrupt_();

while (1);

/*用户代码结束*/

返回0;


/*用户代码开始(4)*/
void rtiNotification (rtiNOTIFICATION_COMPARE0)

{

(1) ISR 是否将写入  void rtiNotification (rtiNOTIFICATION_COMPARE0) I

如果愿意、我们如何在 ISR 中清除中断标志、以便可以生成新的中断

当我尝试在 void rtiNotification (rtiNOTIFICATION_COMPARE0)函数中编写 ISR 时收到错误信息  

".../source/sys_main.c "、第192行:错误#80:需要一个类型说明符
".../source/sys_main.c ",第192行:错误#142-D:存在实体时不允许未命名的原型参数
编译"../source/sys_main.c 时检测到2个错误。

 

谢谢

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

    尊敬的 Sudhir:

    您可以参考 HALCoGen 帮助主题部分中的 rtiBlinky 示例。

    在此示例中、我们仅每1秒切换一次 LED。 因此、只需遵循此示例中的代码和配置。

    另外需要说明的是、您无需清除 RTI 中断。

    实际上、在 RTI 驱动程序文件中、仅在清除当前 RTI 中断后才会调用通知功能。 通知函数将每隔1秒重复调用一次。

    另请参阅以下常见问题解答以查找 Hercules 器件的所有可用示例:

    (+)[常见问题解答] TMS570LC4357:适用于 Hercules 控制器的示例和演示(例如 TMS570x、RM57x 和 RM46x 等)-基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛

    --
    谢谢。此致、
    Jagadish。

    --
    谢谢。此致、
    Jagadish。

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

    Jagadish、您好!

    感谢您的回复  

    请告诉我一点、假设我希望每500毫秒发生一次中断、那么如何更改生成中断的周期、比我更改此值的地方还要好。

    谢谢

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

    尊敬的 Sudhir:

    如果您使用的是 HALCoGen、则需要更改下面的框:

    --
    谢谢。此致、
    Jagadish。

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

    您好 Jagadish:

    感谢您的回复  

    我目前不使用 HALCoGen、您是否知道如何通过代码进行更改(计时器周期)。

    我试图从这里改变、但它不起作用


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

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

    谢谢

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

    尊敬的 Sudhir:

    您仅更改正确的寄存器。

    以下是500ms 和1000ms 的驱动程序文件差异:

    可以使用以下公式推导出该值

    例如、在本例中、CPUC 的值为7。

    我需要1秒的时间、这意味着 tCOMP =1

    tRTICLK 为1/75MHz

    现在、将公式中的上述值代入

    1sec = (1/75MHz)*(7 + 1)* RTIUDC

    RTIUDC = 1*75M/8

    RTIUDC = 937500

    同样、对于0.5Sec 或500ms、它将变成4687500。

    因此、对 COMPx 和 UCPx 寄存器使用相同的值。

    同样、计算您所需时间的值。

    --
    谢谢。此致、
    Jagadish。

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

    Jagadish、您好!

    感谢您的回复  

    我复制你建议的任何内容、但它在我的项目中不起作用。

    我不知道自己做错了什么。

    以下是我的配置。

    int main (空)
    {
    /*用户代码开始(3)*/

    //初始化 TMS570LS1224
    systemInit();
    gioInit ();
    sciInit();
    rtiInit ()

    rtiEnableNotification (rtiNOTIFICATION_COMPARE0);

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

    /*启动 RTI 计数器块0 */
    rtiStartCounter (rtiCOUNTER_BLOCK0);

    void rtiNotification (UINT32通知)
    {
    printConsole ("第二个设备 OTUT 故障--\n");

    下面是配置为 RTI.c

    空 rtiInit (空)
    {
    /*用户代码开始(3)*/
    /*用户代码结束*/
    /**@b 初始化@b RTI1:*/

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

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

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

    /**-设置输入源比较0-3 */
    rtiREG1->COMPCTRL = 0x00001000U | 0x00000100U | 0x0000U | 0x00000000U;

    /**-复位上数计数器0 */
    rtiREG1->CNT[0U].ucx = 0x00000000U;

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

    /**-设置递增计数器0比较值
    *- 0x00000000:除以2^32
    *- 0x00000001-0xFFFFFFFF:除以(CPUC0 + 1)
    */
    rtiREG1->CNT[0U].CPUCx=7u;

    /**-复位递增计数器1 */
    rtiREG1->CNT[1U].ucx = 0x00000000U;

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

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

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

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

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

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

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

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

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

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

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

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

    /**@请注意,在使用驱动程序之前,必须调用此函数。\n
    *此函数必须在特权模式下执行。\n
    *这个函数不会启动计数器。
    */

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

    谢谢。

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

    int main (空)
    {
    /*用户代码开始(3)*/

    //初始化 TMS570LS1224
    systemInit();
    gioInit ();
    sciInit();
    rtiInit ()

    rtiEnableNotification (rtiNOTIFICATION_COMPARE0);

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

    /*启动 RTI 计数器块0 */
    rtiStartCounter (rtiCOUNTER_BLOCK0);

    [/报价]

    我在你的主函数中看不到无穷循环、即 while (1);缺失。

    您可以尝试以下代码吗:

    int main(void)
    {
    /* USER CODE BEGIN (3) */
    
    //INITIALIZE TMS570LS1224
    systemInit();
    gioInit();
    sciInit();
    rtiInit()
    
    rtiEnableNotification(rtiNOTIFICATION_COMPARE0);
    
    /* Enable IRQ - Clear I flag in CPS register */
    /* Note: This is usually done by the OS or in an svc dispatcher */
    _enable_IRQ();
    
    /* Start RTI Counter Block 0 */
    rtiStartCounter(rtiCOUNTER_BLOCK0);
    
    while(1);
    
    }

    --
    谢谢。此致、
    Jagadish。

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

    Jagadish、您好!

    感谢您的回复我尝试您的代码,但不起作用。  

    下面是我根据您的建议尝试过的代码、但我们每次都遇到中断、但我配置了中断1秒钟。

    int main (空)
    {
    /*用户代码开始(3)*/

    //初始化 TMS570LS1224
    systemInit();
    gioInit ();
    sciInit();
    rtiInit ()

    rtiEnableNotification (rtiNOTIFICATION_COMPARE0);

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

    /*启动 RTI 计数器块0 */
    rtiStartCounter (rtiCOUNTER_BLOCK0);

    while (1);

    void rtiNotification (UINT32通知)
    {
    printConsole ("第二个设备 OTUT 故障--\n");

     

    谢谢。

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

    尊敬的 Sudhir:

    我创建了一个示例工程、以每1秒获取 RTI Compare0中断。

    下面是完整的项目:

    e2e.ti.com/.../RTI_5F00_Interrupt_5F00_TEST_5F00_LS1224.zip

    由于缺少 LS1224板、我最终没有测试此项目、但此代码可以正常运行。 请尝试在最后测试此项目。

    --
    谢谢。此致、
    Jagadish。

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

    Jagadish、您好!

    我尝试了您的代码、但您的代码不起作用  

    Flag Status 的值 始终保持0。

    我在调试中进行了检查。

    谢谢

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

    我们可以设置一个实时调试会话吗?

    您能否共享您的屏幕并向我展示问题、以便我提供建议。

    如果您可以、请分享会议链接。