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.

[参考译文] MSP432P401R:TI-RTOS 使用 SysTick over TimerA

Guru**** 2527550 points
Other Parts Discussed in Thread: SYSBIOS, SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/882279/msp432p401r-ti-rtos-use-systick-over-timera

器件型号:MSP432P401R
Thread 中讨论的其他器件: SysBIOSSysConfig

您好!

我们对在 MSP432P401R 中使用 TI-RTOS 感兴趣、并想知道为什么使用 TimerA 来驱动内核而不是 SysTick。 是否有具体原因无法做到这一点、或者在实施中是否仅仅不支持这一点? 如果可以使用、是否有简单的方法来实现它? 需要做什么工作?

https://processors.wiki.ti.com/index.php/TI-RTOS_SimpleLink_Timers#Low-Level_TI-RTOS_Kernel_Peripheral_Timer_Implementations

内核模块 说明 器件
TI.SYSBIOS.family.ARM.m3/Timer SimpleLink 器件的 SysTick CC13xx、CC26xx、CC32xx、MSP432E4和 MSP432P4
TI.SYSBIOS.family.ARM.lm3.计时 器 通用(GP)定时器 CC13xx、CC26xx、CC32xx
TI.SYSBIOS.family.arm.lm4.Timer 通用(GP)定时器 MSP432E4
TI.SYSBIOS.family.arm.msp432.Timer TimerA (与 MSP430一样) MSP432P4
TI.SYSBIOS.family.ARM.cc26xx.Timer RTC 计时器 CC13xx 和 CC26xx
TI.SYSBIOS.family.arm.cc32xx.Timer RTC 计时器 CC32xx
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Derrick、

    根据我的理解、MSP432P401R 同时支持这两者。 表的第一行中也提到了 MSP432P4的 SysTick。
    默认情况下、通用计时器的使用如您在低电平部分发布的页面中所述。 这是因为省电。 您还可以选择 SysTick、但如果您不想使用 LPM3、则 LPM3中不会使用 SysTick。 链接页面的"配置"部分介绍了如何更改它。

    MSP432P4

    低功耗是 MSP432P4器件的关键领域。 SysTick 计时器不会在低功耗模式下继续计数。 因此、GP 定时器(ti.sysbios.family.arm.msp432)被用作缺省时钟定时器。 在 MSP432P401x 器件上、功率限制用于防止进入 LPM3和 LPM4电平、因为 TimerA 在这些电平中冻结。 对于 MSP432P4x1x 器件、TimerA 继续在 LPM3中运行。 有关 MSP432P4限制的更多详细信息、请参阅 SimpleLink SDK 和 http://processors.wiki.ti.com/index.php/TI-RTOS_MSP432_中的 docs/tidrivers/Power_Management.pdf 文件

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

    感谢 Dietmar 的回应。 我在发布后不久就意识到、其中一些答案位于引用的文章的其余部分。 我们在应用中不需要低功耗模式、而是需要 TimerA 的功能来实现另一个目的。 我们仍然不清楚的是如何将 SysTick 用于 RTOS。 我们正在寻找一些有关如何执行此操作的明确指令/方向、我们在前一篇文章中找不到任何指令。 我们使用 SysConfig 来设置我们的 RTOS 环境、SysTick 不是一个选项。 如果这需要我们修改源文件、我们在哪里查找、我们要修改什么?

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

    你好 Derrick

    应在 SYSCFG 的 RTOS 选项中选择此选项、但不可避免地选择 TimerA、因为电源策略仅包含睡眠和深度睡眠策略。 SysTick 将不起作用。

    我将与我们的专家核实是否存在使 SysTick 发挥作用和有意义的不同政策。

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

    Derrick、

    获得反馈、认为以这种方式实现它与传统 MSP430器件"兼容"。 不过、很快将提供一个如何使用 SysTick 的代码示例。

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

    [引用用户="Dietmar Walther (Dietmar Walther)"]

    Derrick、

    获得反馈、认为以这种方式实现它与传统 MSP430器件"兼容"。 不过、很快将提供一个如何使用 SysTick 的代码示例。

    [/报价]

    谢谢、Dietmar。 我们还将在最后继续进行实验。 如果我们能够解决这个问题、我们的团队可以避免重新设计并坚持使用 MSP432和 TI-RTOS 组合。

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

    您好 Derrick、

    遗憾的是、我找不到一个即用型示例;但是、我得到了一些使用 RTC 作为时钟源的代码。

    将其替换为 SysTick 的方法如下所示:

    1.创建一个 Hwi 并配置 SysTick、类似于下面针对 RTC 的示例:

    void demo_rtc_Init (void)
    {
    RTC_C_Calendar 日历日历时间;
    Hwip_Params hwiParams;
    
    /*启用 BCLK 并将 REFCLK 配置为32KHz */
    MAP_CS_setReferenceOscillatorFrequency (CS_REFO_128KHZ);
    MAP_CS_initClockSignal (CS_BCLK、CS_REFOCLK_SELECT、CS_CLOCK _divider _4);
    
    /*将 RTC 配置为1ms 间隔计时器*/
    MAP_RTC_C_initCalendar (&calendarTime、RTC_C_FORMAT_BCD);
    MAP_RTC_C_definePrescaleEvent (RTC_C_PRESALE_0、RTC_C_PSEVENTDIVIDER_32);
    
    /*启用 RTC 中断*/
    MAP_RTC_C_enableInterrupt (RTC_C_PRESALE_TIMER0_INTERRUPT);
    MAP_Interrupt_enableInterrupt (INT_RTC_C);
    
    /*创建 RTOS hwi */
    Hwip_Params_init (&hwiParams);
    hwiParams.priority = 0x20;
    Hwip_create (INT_RTC_C、DEMO_RTC_C_IRQHandler、&hwiParams);/*<-使用 SysTick INT #(15)/*系统节拍*/
    
    /*启动 RTC */
    MAP_RTC_C_startClock();
    }
    

    2.在 BIOS_start()之前调用_init API

    /*初始化和配置 RTC。 RTC 将用作 Clock_tick、
    这也需要在.cfg 文件中启用*
    DEMO_RTC_C_Init();
    
    /*启用中断并启动 SYS/BIOS */
    BIOS_start();
    

    3.在.cfg 文件(TI-RTOS 配置文件)中添加以下行以覆盖 timerA

    /*========================= 时钟配置======================== //
    var Clock = xdc.useModule('ti.sysbios.knl.Clock');
    //
    *默认值取决于系列。 例如、Linux 系统通常仅
    *支持最短时间为10000us、是10000 us 的倍数。
    * TI 平台的默认值为1000us。
    */
    Clock.tickPeriod = 1000;
    
    //告知时钟模块您正在提供周期性中断*/
    Clock.tickSource = Clock.TickSource_user;
    ClockFreqs = xdc.useModule('ti.sysbios.family.arm.msp432.ClockFreqs');
    

    请告诉我这是否有帮助、或者您是否一直有问题。

    此致、

    Luis R

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

    尊敬的 Derick:

    Luis 发布的建议是否适合您?

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

    [引用用户="Luis RC"]

    您好 Derrick、

    遗憾的是、我找不到一个即用型示例;但是、我得到了一些使用 RTC 作为时钟源的代码。

    将其替换为 SysTick 的方法如下所示:

    1.创建一个 Hwi 并配置 SysTick、类似于下面针对 RTC 的示例:

    void demo_rtc_Init (void)
    {
    RTC_C_Calendar 日历日历时间;
    Hwip_Params hwiParams;
    
    /*启用 BCLK 并将 REFCLK 配置为32KHz */
    MAP_CS_setReferenceOscillatorFrequency (CS_REFO_128KHZ);
    MAP_CS_initClockSignal (CS_BCLK、CS_REFOCLK_SELECT、CS_CLOCK _divider _4);
    
    /*将 RTC 配置为1ms 间隔计时器*/
    MAP_RTC_C_initCalendar (&calendarTime、RTC_C_FORMAT_BCD);
    MAP_RTC_C_definePrescaleEvent (RTC_C_PRESALE_0、RTC_C_PSEVENTDIVIDER_32);
    
    /*启用 RTC 中断*/
    MAP_RTC_C_enableInterrupt (RTC_C_PRESALE_TIMER0_INTERRUPT);
    MAP_Interrupt_enableInterrupt (INT_RTC_C);
    
    /*创建 RTOS hwi */
    Hwip_Params_init (&hwiParams);
    hwiParams.priority = 0x20;
    Hwip_create (INT_RTC_C、DEMO_RTC_C_IRQHandler、&hwiParams);/*<-使用 SysTick INT #(15)/*系统节拍*/
    
    /*启动 RTC */
    MAP_RTC_C_startClock();
    }
    

    2.在 BIOS_start()之前调用_init API

    /*初始化和配置 RTC。 RTC 将用作 Clock_tick、
    这也需要在.cfg 文件中启用*
    DEMO_RTC_C_Init();
    
    /*启用中断并启动 SYS/BIOS */
    BIOS_start();
    

    3.在.cfg 文件(TI-RTOS 配置文件)中添加以下行以覆盖 timerA

    /*========================= 时钟配置======================== //
    var Clock = xdc.useModule('ti.sysbios.knl.Clock');
    //
    *默认值取决于系列。 例如、Linux 系统通常仅
    *支持最短时间为10000us、是10000 us 的倍数。
    * TI 平台的默认值为1000us。
    */
    Clock.tickPeriod = 1000;
    
    //告知时钟模块您正在提供周期性中断*/
    Clock.tickSource = Clock.TickSource_user;
    ClockFreqs = xdc.useModule('ti.sysbios.family.arm.msp432.ClockFreqs');
    

    请告诉我这是否有帮助、或者您是否一直有问题。

    此致、

    Luis R

    [/报价]

    感谢您的介绍、Luis。 我们来看看这一点、并将其与我们在 SysTick 中尝试交换的尝试进行比较。 如果您有任何疑问、我们将告诉您情况如何。

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

    尊敬的 Derek:

    Luis 的评论是否有助于解决您的问题?

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

    尊敬的 Derek:

    由于没有进一步的响应或反馈、我将关闭此主题。 如果弹出任何内容、请打开一个新线程。