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.

[参考译文] RTOS/TM4C1292NCPDT:定时器周期

Guru**** 2391005 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/667518/rtos-tm4c1292ncpdt-timer-period

器件型号:TM4C1292NCPDT

工具/软件:TI-RTOS

您好!

我使用的是 TIRTOS 2.16.0.14。

在我的项目中、我使用的是在.cfg 文件中创建的 timer3、如下所示。 我正在从我的函数启动计时器。

现在、它使用的周期为1。  我需要 周期为1us 的计时器。 要实现这一点、必须如何设置周期? 如果周期以计数形式表示、我可以设置的最大计数是多少?

此致

Sandra

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

    使用计时器-实例设置时、可以以微秒为单位设置周期。 您是否尝试使用"1"作为设置?

    如果这不能产生适合您需求的1us 周期、您可能需要避免使用 TI-RTOS Hwi 调度程序、如下所述: e2e.ti.com/.../2105916
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    感谢你的答复。
    我不想转到任何超时 ISR。 我只想运行一个计时器并将其递增1us。 要使计时器递增1us、应如何设置周期?

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

    我想我当时对您的应用不清楚。 每1us 运行一次的计时器是否只是一个计数器? 如果不使用 ISR、您打算如何利用它? "以1us 递增"是什么意思? 如果您可以清楚地说明您的计时器目标以及如何使用计时器、那么我将有更好的机会为您提供有用的建议。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    选择您的时钟和预分频器组合、让计时器在我们的帮助下前进。

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

    您好!

    我想从程序中的某个函数启动计时器。 发生超时时、我不想执行任何操作。 我需要一个周期为1us 的计时器、我 需要读取计时器计数。 我只想 在  计时器启动后获得以微秒为单位的时间。

    谢谢

    Sandra

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

    您是要采用时钟模块而不是计时器模块吗?

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

    您好、Sandra、

    我相信在您所展示的配置中、将周期设置为"1"而不是"1000000"会起作用。 但请记住、计数器的大小是有限的、如果使用32位计时器、您仍会在3天内耗尽计数。 不确定是否打算在计数器发生前重置计数器。

    您需要为计时器 ISR 函数列出'null'、而不是您当前列出的'timer3ISRFxn'。

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

    谢谢你 Ralph。

    此致

    Sandra

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

    您好 Ralph Jacobi、

    我认为将周期设置为"1"不会使计时器寄存器计数以1微秒的间隔递增。 我想启动计时器、计时器寄存器后的值应以1微秒的间隔递增。 这样我就可以使用 Timer_getCount()来读取定时器寄存器、从而获得增量为1微秒的值。 请建议实现此目的所需的典型配置是什么?

    此致

    巴拉

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

    您是否考虑使用 Timestamp_get64 (),然后使用 Timestamp_getFreq ()将结果转换为微秒,以确定 Timestamp_get64 ()中返回的值的单位?

    Types_FreqHz freq;
    Types_Timestamp64时间;
    uint64频率;//*以 MHz 为单位*/
    uint64 timeInu;//*以微秒为单位的时间*/
    
    //*执行以下操作一次*/
    Timestamp_getFreq (&freq);//* freq 以 Hz 为单位*//
    *将 freq 转换为 MHz */
    频率=(hi)(<.0000)(&freq)
    
    /*
    从那时起,只需执行以下操作即可获得系统启动后经过的时间
    */
    Timestamp_get64 (&time);/*获取当前时间戳*/
    timeInU =((uint64)(time.hi << 32)|(time.lo)))/频率;/*转换为微秒*/ 

    Alan

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    对于 OP 要执行的操作而言、这是否有点过于复杂? 如果他/她想要的是一次将定时器递增1us、那么他/她必须做的就是设置预分频器、以便定时器前进1us/tick。

    另一方面、Op 确实提出了一些相互冲突的诉求、因此我们可能根本不知道他/她想要做什么。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    我需要 timeInU 作为32位值。 我将 timeInU 除以2。
    我最初获取的 timMU 在3961126959 (EC1A 002F)范围内。 timeInU 应该从0递增、对吧? 调用函数 Timestamp_getFreq()时,它是否采用系统频率?

    谢谢
    Sandra
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    只需使用64位 timeInU 的下半部分。 除以2将得到以2微秒为单位的时间。

    uint32 timeInUs32;
    timeInUs32 =(uint32) timeInU;

    Timestamp API 使用的定时器在系统启动时启动。 因此,从 Timestamp_get64()检索的值将自系统启动以来。 如果要知道代码中某个特定点的已用时间、请在该点捕获 timeInU 的快照、然后从所有后续 timeInU 值中减去该值:

    uint32 t0;
    uint32 elapsedTime;

    T0 =(UINT32) timeInU;/*在 T = 0时的快照*/

    (笑声) 收集 timeInUs32的更新、然后:

    elapsedTime = timeInUs32-t0;

    /* elapsedTime 是 T = 0时的微秒数*/

    对于该器件、时间戳计时器的时钟频率与 CPU 相同。 因此,Timestamp_getFreq()返回的频率将是 CPU 频率。

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

    尊敬的 Alan:

    感谢您的回复。

    我也在应用程序中运行秒计数器。 因此、在读取微秒值时、我将得到3232892 us、持续11秒。 13秒后、它给出了3063887 us。 微秒值应对应于秒值、对吧? 溢出将需要多长时间?

    我尝试使用

    ui32Time0 = Timestamp_get32 ();     //找到经过的时间的初始值

    /*获取当前时间戳*/

    ui32TimeInU = Timestamp_get32 ();

    ui32TimeInus =(ui32TimeInus - ui32Time0)/频率;     // Timestamp_getFreq ()获得的频率(如建议)

    然后、我得到的是、

    34秒、35740198us 和35秒、38538855 us 已获得。

    此实现是否正确? 溢出需要多长时间?

    此致

    Sandra

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

    在我的 Tiva Launchpad 上、时间戳频率为120MHz。 在该速率下、32位时间戳每35.79秒回滚一次。

    我在电路板上尝试过此代码、它的运行方式符合预期:

    uint32 ui32TimeInU;
    uint32 ui32Time0;
    uint32频率;
    Types_FreqHz freq;
    
    ui32Time0 = Timestamp_get32 ();
    TIMESTAMP_getFreq (&freq);
    frequency = freq.lo;//频率(Hz)*/
    
    ui32TimeInU = Timestamp_get32 ();
    ui32TimeInU =(ui32TimeInU - ui32Time0)/ FREQUENCY;
    

    使用上述代码、ui32TimeInU 每秒先进1次、因为频率以 Hz 为单位

    如果您希望 ui32TimeInU 真正以微秒为单位、则需要将频率预除以1、000、000:

    频率=频率/1000000;/*频率、单位为 MHz */ 

    然后、ui32TimeInU 的所有后续计算将以微秒为单位、每1秒将前进1、000、000。

    全部

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

    尊敬的 Alan:

    感谢你的答复。

    当我尝试相同的代码时、 时间戳 回滚 35秒。 但是 ui32TimeInU 每  秒就会有近13、000、000次的进步。 这种变化的原因可能是什么?

    谢谢

    Sandra

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我不确定您是在转换为微秒之前还是之后引用 Timestamp_get32()的返回值。 我也不理解"13、000、000"的值。 我不知道您是指13、000、000还是1、300、000、或者可能是130、000、000。

    使用120MHz CPU 时钟时、从 Timestamp_get32 ()返回的值应每1秒增加120,000,000。 转换为微秒(除以120)后、ui32TimeInU 的结果值应每1秒提前1、000、000。

    您使用什么作为参考时基来测量1秒间隔? 使用 CCS 并在大约每1秒后停止以检查 ui32TimeInU 的当前值可能会产生差异很大的结果。 让程序在暂停之间运行20-30秒可以更好地指示 ui32TimeInU 的前进速度。

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

    Alan、

    非常感谢您的支持。 我明白了。

    谢谢

    Sandra