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.

[参考译文] EK-TM4C1294XL:TM4C1294 Tiva C 系列每毫秒运行计时器

Guru**** 2477065 points
Other Parts Discussed in Thread: TM4C1294NCPDT

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/686112/ek-tm4c1294xl-tm4c1294-tiva-c-series-run-timer-every-ms

器件型号:EK-TM4C1294XL
主题中讨论的其他器件:TM4C1294NCPDT

大家好、

我不是 MCU 的新用户、我尝试每毫秒运行一次计时器、但我找不到设置或计算结果。 我在获取代码之前就附加了我现在用于测试的代码。

 

有什么关于如何将计时器设置为每毫秒运行的想法?

 

谢谢大家。 )

#include
#include
#include "inc/tm4c1294ncpdt.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/sysctl.h"
#include "driverlib/interrupt.h"
#include "driverlib/gpio.h"
#include "driverlib/timer.h"

uint32_t ui32Period、pom = 0;
uint32_t ui32SysClkFreq;

int main (空)

   ui32SysClkFreq = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、120000000);

   SysCtlPeripheralEnable (SYSCTL_Periph_GPION);
   SysCtlPeripheralEnable (SYSCTL_Periph_TIMER0);

   GPIOPinTypeGPIOOutput (GPIO_PORTN_BASE、GPIO_PIN_1);
   TimerConfigure (TIMER0_BASE、TIMER_CFG_PERIODICASE);

   ui32Period =(ui32SysClkFreq / 50);
   TimerLoadSet (TIMER0_BASE、TIMER_A、ui32Period);

   IntEnable (INT_TIMER0A);
   TimerIntEnable (TIMER0_BASE、TIMER_TINA_TIMEOUT);
   IntMasterEnable();

   TimerEnable (TIMER0_BASE、TIMER_A);

   while (1)
   {

       如果(pom = 1000){//if 1000ms = 1秒
           IF (GPIOPinRead (GPIO_PORTN_BASE、GPIO_PIN_1))
           {
               GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、0);
               POM = 0;
           }
           其他
           {
               GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、2);
               POM = 0;
           }
       }

   }


空 Timer0IntHandler (空)

   TimerIntClear (TIMER0_BASE、TIMER_TINA_TIMEOUT);
   POM++;



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

    Petr、您好!

    看起来您有一个很好的设置块。 有一个明显的缺陷、还有一个您可能没有解决的问题。

    这一缺陷涉及周期计算、您对此并不完全正确。

    您拥有的是什么

    ui32Period =(ui32SysClkFreq / 50); 

    要获得1ms 的时间、应改为:

    ui32Period =(ui32SysClkFreq / 1000); 

    另一个问题可能是 您没有将 Timer0IntHandler 正确添加到 startup_ccs.c 文件中。 如果您运行代码、然后在调试中暂停代码、如果您在 IntDefaultHandler 中、 则需要确保 Timer0IntHandler ISR 已正确添加到 startup_ccs.c 文件中的 ISR 表中。

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

    它提供了很多帮助。 我已正确设置 Timer0IntHandler ()。

    是否有机会与其他时间单位(如秒或微秒)类似使用?

    ui32Period =(ui32SysClkFreq / 1 000);->120 000 000 / 1000 = 1ms

    如果我使用1 000 000分频、它是1秒吗?


    如果您知道如何检查和验证计时器的时间、而不是秒表?

    我将不胜感激。 :-)

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

    1.不清楚"运行计时器"是什么意思

    你的 ISR 每20ms 调用一次。

    3. if 语句的两个分支都将重置 pom。

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

    1) 1)我想每毫秒使计时器中断一次、然后堆叠1000 (到1秒)

    2) 2)这是个问题... 请告诉我、我如何准确地将一个正确的周期数计算为1ms、5ms、100ms 等等...

    1000是1ms、我现在知道、但其他人知道吗?

    对期间进行计数
    ui32Period =(ui32SysClkFreq / 1000);

    3) 3)这是我现在重新构建的

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

    [引用 user="Petr Tichota">如果您知道如何检查和验证计时器的时间、而不是秒表? [/报价]

    如果证明是" 可接受的"- 您可以 在进入 "1ms"定时器 的 ISR 后"切换"(翻转/反向状态) GPIO。   然后、该 GPIO 通过示波器进行监控-设置为正确"帧"此类信号。

    事实证明、一旦您"掌握了计时器操作"、就可以使用(另一个) MCU 计时器(命令进入) "边沿计时模式"来实现相同的测量、但(减)示波器部署的负担...   在这种情况下、您会将"将 GPIO 输出馈入"(如上所述)到第二个计时器(GPIO)引脚、该引脚被编程为测量"边沿时间"。

    因此-此处提供-"两个解决方案" (仅限今天打折)、价格为1!   (NEAT 验证将降低价格-甚至进一步...)

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

    该公式基本上被下行至计时器计数=时钟频率/周期。 我想您在标记变量 ui32Period 时引起了一些困惑。 将其标记为 ui32TimerLoadValue 或类似的内容会更准确。

    TimerLoadSet API 需要计时器信息、然后将值加载到计时器中。 该值用于根据时钟周期进行计数。 MCU 的时钟周期速度由 SYSCLK 决定、这就是 ui32SysClkFreq 的用武之地、它为您提供系统频率以 Hz 为度量单位、单位为1/seconds。

    然后、您要做的是将频率与所需的周期(单位为秒)相乘、这样就可以取消单位、并保留加载到计时器中所需的原始数字。

    例如、要获得1毫秒、从数学角度计算的值为120、000 000 * 0.001秒。 但0.001秒也可以显示为1/1000秒。 正是您在代码中看到的这种显示方式、因为大多数人都更容易阅读/理解。

    因此、要获得一秒的周期、您需要加载时钟频率本身。 加载1000 000时所描述的实际上是一微秒、因为您输入的周期是1/1 000 000秒、即10^-6、即一微秒!

    我希望我的解释写得足够清楚。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    "我如何准确地将一个正确的周期数计为1ms、5ms、100ms 等..."

    这取决于您的技能和应用。

    通常、您需要将计时器设置为每1ms 中断一次。 在该 ISR 中、您需要递增计数器。

    在您的应用程序中、您将拍摄该计时器的快照、然后测试以查看自上次调用以来是否有足够的时间经过。 如果是、请更新它。

    以下是一个示例:

    volatile uint32_t Millies=0;//计数器的 ms。 它在定时器 ISR 中递增

    //test if enough has passed:returned 1 if 5ms has passed
    char passed_5ms (void){
    静态 uint32_t 毫秒_prev=0;//上次调用的时间戳
    如果(毫秒-毫秒_前> 5){毫秒_前 v+=5;返回1;}
    否则返回0;


    同样、如果不知道您要做什么、就很难更好地帮助您。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用 user="Danny F"]同样,如果不知道您要做什么,就很难更好地帮助您。

    即使 是一个(单个)电容器也会有所帮助...