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.

[参考译文] TMS320F28386S:计时器示例

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1175652/tms320f28386s-timer-examples

器件型号:TMS320F28386S

如果 F28386的计时器示例将其设置为单次触发并在计数结束时触发中断、我将不胜感激。

谢谢、

JH

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

    您好、John、

    没有 单次触发计时器的示例、但我已经编写了一个 main.c 文件、您可以根据 CPU 计时器的现有示例使用该文件。 您需要在计数结束时启用中断、并且在中断服务例程中禁用中断以防止其再次触发。 我希望这对您有所帮助:

    #include "driverlib.h"
    #include "device.h"
    
    uint16_t reached = 0;
    
    __interrupt void cpuTimer0ISR(void);
    void initCPUTimer(void);
    void configCPUTimer(uint32_t cpuTimer, uint32_t period);
    
    void main(void)
    {
        Device_init();
        Interrupt_initModule();
        Interrupt_initVectorTable();
        Interrupt_register(INT_TIMER0, &cpuTimer0ISR);
    
        initCPUTimer();
        configCPUTimer(CPUTIMER0_BASE, 100);
    
        CPUTimer_enableInterrupt(CPUTIMER0_BASE);
        Interrupt_enable(INT_TIMER0);
        CPUTimer_startTimer(CPUTIMER0_BASE);
    
        EINT;
        ERTM;
    
        while(1);
    }
    
    void initCPUTimer(void)
    {
        CPUTimer_setPeriod(CPUTIMER0_BASE, 0xFFFFFFFF);
        CPUTimer_setPreScaler(CPUTIMER0_BASE, 0);
        CPUTimer_stopTimer(CPUTIMER0_BASE);
        CPUTimer_reloadTimerCounter(CPUTIMER0_BASE);
    }
    
    void configCPUTimer(uint32_t cpuTimer, uint32_t period)
    {
        CPUTimer_setPeriod(cpuTimer, period);
        CPUTimer_setPreScaler(cpuTimer, 0);
    
        CPUTimer_stopTimer(cpuTimer);
        CPUTimer_reloadTimerCounter(cpuTimer);
        CPUTimer_setEmulationMode(cpuTimer, CPUTIMER_EMULATIONMODE_STOPAFTERNEXTDECREMENT);
        CPUTimer_enableInterrupt(cpuTimer);
    }
    
    __interrupt void cpuTimer0ISR(void)
    {
        reached = reached + 1;
        CPUTimer_disableInterrupt(CPUTIMER0_BASE);
        Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1);
    }
    

    此致、

    Omer Amir

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

    感谢您发帖。

    我修改了 while 循环、似乎调用了两次 ISR。

        while(1)
        {
            static uint16_t reachedCopy = 0;
            if (reached)
            {
                reachedCopy++;
            }
        }

    此外、我还会在 while 环路中进行哪些更改、以便再次设置计时器?

    谢谢、

    John

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

    您好、John、

    要在计时器结束时重新启用 ISR 以触发、可以使用"CPUTimer_enableInterrupt (CPUTIMER 0_BASE);"。 在技术上、计数器仍在后台运行、这是我忘了说明的问题。 我已经更新了我的代码、现在改为禁用中断中的计数器、并在 while 循环中重新启用它(在这两种情况下都需要重新启用中断)。

    我不确定如何调用 ISR 两次、当我运行代码时、"reached"变量只会设置为1 (每当它到达 ISR 时、它将递增"reached")。  修改后的 while 循环假定"已达到"会被重置、但情况并非如此、因此"高速缓存副本"将始终递增。  这可能是为什么您的 ISR 似乎多次被调用的原因。

    #include "driverlib.h"
    #include "device.h"
    
    uint16_t reached = 0;
    
    __interrupt void cpuTimer0ISR(void);
    void initCPUTimer(void);
    void configCPUTimer(uint32_t cpuTimer, uint32_t period);
    
    void main(void)
    {
        Device_init();
        Interrupt_initModule();
        Interrupt_initVectorTable();
        Interrupt_register(INT_TIMER0, &cpuTimer0ISR);
    
        initCPUTimer();
        configCPUTimer(CPUTIMER0_BASE, 100);
    
        CPUTimer_enableInterrupt(CPUTIMER0_BASE);
        Interrupt_enable(INT_TIMER0);
        CPUTimer_startTimer(CPUTIMER0_BASE);
    
        EINT;
        ERTM;
    
        while(1)
        {
            if(reached)
            {
                CPUTimer_enableInterrupt(CPUTIMER0_BASE);
                CPUTimer_startTimer(CPUTIMER0_BASE);
            }
        }
    }
    
    void initCPUTimer(void)
    {
        CPUTimer_setPeriod(CPUTIMER0_BASE, 0xFFFFFFFF);
        CPUTimer_setPreScaler(CPUTIMER0_BASE, 0);
        CPUTimer_stopTimer(CPUTIMER0_BASE);
        CPUTimer_reloadTimerCounter(CPUTIMER0_BASE);
    }
    
    void configCPUTimer(uint32_t cpuTimer, uint32_t period)
    {
        CPUTimer_setPeriod(cpuTimer, period);
        CPUTimer_setPreScaler(cpuTimer, 0);
    
        CPUTimer_stopTimer(cpuTimer);
        CPUTimer_reloadTimerCounter(cpuTimer);
        CPUTimer_setEmulationMode(cpuTimer, CPUTIMER_EMULATIONMODE_STOPAFTERNEXTDECREMENT);
        CPUTimer_enableInterrupt(cpuTimer);
    }
    
    __interrupt void cpuTimer0ISR(void)
    {
        reached = reached + 1;
        CPUTimer_stopTimer(CPUTIMER0_BASE);
        Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP1);
    }
    

    此致、

    Omer Amir

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

    感谢你的帮助。

    抱歉给了我们一个坏的 while 循环。 我只是误复制了一部分、然后下一个错误是添加了两个闭合花括号。 在 if (到达)条件的末尾、变量 REACH 被复位。 很棒的地方

    我在第31行设置了一个断点、在第一个停止时、达到的值为2。 我将第18行中的值从100更改为100000、然后再次运行。 达到的时间为1。 这样就可以将其清除。

    您能否告诉我为什么在 init 函数中调用的所有函数也会在 config 函数中调用? 此外,我还没有使用 CPUTimer_reloadTimerCounter(),因为 CPUTimer_setPeriod()似乎设置了该值。 文档有点少、因此该函数的实际作用是什么、何时需要?

    再次感谢、

    John

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

    您好、John、

    [引用 userid="152282" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1175652/tms320f28386s-timer-examples/4426143 #4426143)]您能告诉我为什么在 init 函数中调用的所有函数也会在 config 函数中调用? 此外,我还没有使用 CPUTimer_reloadTimerCounter(),因为 CPUTimer_setPeriod()似乎设置了该值。 文档内容比较少、因此该函数的实际作用是什么以及何时需要?

    我复制了 timer_ex1_cputimers 示例中的代码。 看一下、initCPUTimers 似乎会将所有 CPU 计时器初始化为基准/默认配置。 然后、通过 configCPUTimer 函数、您可以配置特定的 CPU 计时器(0、1或2)并设置其频率/周期(我对其进行了修改以仅配置 CPU 计时器周期)。

    我已经在您创建的另一个帖子中回答了您问题的下一部分、因此我将在下面添加我的回答:

    "使用 CPUTimer_setPeriod ()函数设置周期的值、但  CPUTimer_reloadTimerCounter ()函数设置 TCR 寄存器中的 TRB 位。 这会将周期加载到定时器计数器 TIMH:TIM 中、以便它基本上从开始(计数器递减加载的周期值)开始计数器。  该位还使用定时器分频 TDDRH:TDDR 值加载预分频计数器 PSCH:PSC。"

     有关详细信息、请参阅技术参考手册的"CPUTIME_REGS 寄存器"部分(第3.14.8节)。 如果您有任何其他问题、请告诉我。

    此致、

    Omer Amir

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

    感谢您的再说一遍。 我没有看到另一个线程的响应通知。 现在我们来看看。