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.

[参考译文] TM4C1294NCPDT:我需要##39;20'eK-TM4C1294XL 板上 PLINK LED 的纳秒计时器延迟

Guru**** 2535150 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1314779/tm4c1294ncpdt-i-want-20-nanoseconds-timer-delay-for-plink-the-led-on-ek-tm4c1294xl-board

器件型号:TM4C1294NCPDT

您好!

如何在计时器中实现"20"纳秒延迟?

在示例时间代码中进行20纳秒的转换以用于我们的测试。 下面给出了代码。

#包含
#包含
#include "inc/hw_ints.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/debug.h"
#include "driverlib/fpu.h"
#include "driverlib/gpio.h"
#include "driverlib/interrupt.h"
#include "driverlib/pin_map.h"
#include "driverlib/rom.h"
#include "driverlib/rom_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/timer.h"
#include "driverlib/uart.h"
#include "utils/uartstdio.h"


//以 Hz 为单位的系统时钟速率。
uint32_t g_ui32SysClock;

//包含 UART 上显示的中断指示器的当前值的标志。
uint32_t g_ui32Flags;

//配置 UART 及其引脚。 这必须在 UARTprintf()之前调用。
空 ConfigureUART (void)
{
MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
MAP_SysCtlPeripheralEnable (SYSCTL_Periph_UART0);

MAP_GPIOPinConfigure (GPIO_PA0_U0RX);
MAP_GPIOPinConfigure (GPIO_PA1_U0TX);
MAP_GPIOPinTypeUART (GPIO_PORTA_BASE、GPIO_PIN_0 | GPIO_PIN_1);

UARTStdioConfig (0115200、g_ui32SysClock);


//第一个定时器中断的中断处理程序。
空 Timer0IntHandler (void)
{
字符圆锥;
uint32_t Load_Value = 0U、Match_Value = 0U、TimConfi Clock_Value = 0U;

MAP_TimerIntClear (TIMER0_BASE、TIMER_TIMA_TIMEOUT);
Tim惊 悚 Clock_Value = MAP_TimerClockSourceGet (TIMER0_BASE);
Load_Value = MAP_TimerLoadGet (TIMER0_BASE、TIMER_A)
Match_Value = MAP_TimerMatchGet (TIMER0_BASE、TIMER_A);
HWREGBITW (&g_ui32Flags、0)^= 1;
GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_0、g_ui32Flags);
Map_IntMasterDisable ();

Cone = HWREGBITW (&g_ui32Flags、0)? '1':'0';
UARTprintf("\r ");
UARTprintf ("\RT1:%c"、cone);
UARTprintf ("\rSysClock:%d"、g_ui32SysClock);
UARTprintf ("\rTimerClock:%d"、Tim52 Clock_Value);
UARTprintf ("\rLoadValue:%d"、Load_Value);
UARTprintf ("\rMatchValue:%d"、Match_Value);

Map_IntMasterEnable ();


//第二个定时器中断的中断处理程序。
空 Timer1IntHandler (void)
{}

//该示例应用演示了如何使用计时器来生成周期性中断。
int main (空)
{
g_ui32SysClock = MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
SYSCTL_OSC_MAIN |
SYSCTL_USE_PLL |
SYSCTL_CFG_VCO_240)、120000000);

ConfigureUART();
UARTprintf ("\n 定时器示例\n");


MAP_SysCtlPeripheralEnable (SYSCTL_Periph_GPION);
MAP_GPIOPinTypeGPIOOutput (GPIO_PORTN_BASE、GPIO_PIN_0);


MAP_SysCtlPeripheralEnable (SYSCTL_Periph_TIMER0);
MAP_TimerConfigure (TIMER0_BASE、TIMER_CFG_PERIOD_UP);
MAP_TimerLoadSet (TIMER0_BASE、TIMER_A、(g_ui32SysClock / 60000000));

Map_IntMasterEnable ();
MAP_IntEnable (INT_TIMER0A);
MAP_TimerIntEnable (TIMER0_BASE、TIMER_TIMA_TIMEOUT);
MAP_TimerEnable (TIMER0_BASE、TIMER_A);

while (1)
{

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

    您好!

     您可以为计时器提供以下预加载值。  G_ui32SysClock / 60000000等于2个系统时钟。 一个系统时钟在120MHz 时为8.3ns。 对于2个时钟、此值为16.6ns。  这意味着您的计时器将每 16.6ns 到期一次。 我不确定您要创建的应用程序类型。 您实际上是在创建一个持续时间为16.6ns 的计时器。 为什么要这样做? 这对我来说没有意义。 从产生中断到 ISR 得到服务存在延迟。 将是多个周期。 这意味着当处理器进入 ISR 时、计时器已经超时了多次。 此外、处理器需要在 ISR 中执行您的代码。 看看您的 ISR、您有很多代码可以通过 UARTPrintf 打印数据、也可以切换 GPIO。 这可能需要数百甚至数千个周期。 在此期间、您的计时器会超时数百次。  

    MAP_TimerLoadSet (TIMER0_BASE、TIMER_A、(g_ui32SysClock / 60000000));

    如果希望延迟某个值、可以使用 SysCtlDelay。 例如、SysCtlDelay (1)将创建等于3周期的延迟。 在120MHz 时、这大约为25ns。  

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

    尊敬的 Charles:

    感谢您提供此信息。

    我将处理一个项目、即计算两次操作之间的时间。

    工作原理是、我按下使输出通过另一个板的开关、然后另一个板提供一些输入。 这次、我将测量输出和输入之间的间隔时间。

    这就是我测试时间操作的原因。

    谢谢大家、

    维贾伊

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

    您好!

     我能想到的一个想法是、在 BOARD_A 上按下开关时获取时间戳、在 BOARD_B 将另一个输入置为 BOARD_A 时获取另一个时间戳。 取这两个时间戳之间的差值。 您将对计时器使用输入时间模式。  

    13.3.3.4输入边沿计时模式
    注意:对于上升沿检测、输入信号必须为高电平并持续至少两个系统时钟周期
    一个中断。 同样、对于下降沿检测、输入信号必须为低电平
    在下降沿后至少保持两个系统时钟周期。 基于该标准、
    边沿检测的最大输入频率为系统频率的1/4。
    在边沿定时模式中、定时器被配置为24位的递增或递减计数器、其中包括可选的
    带存储在 GPTMTnPR 寄存器中的定时器高值和低位的预分频器
    GPTMTnILR 寄存器。 在此模式中、定时器初始化为 GPTMTnILR 中加载的值
    和 GPTMTnPR 寄存器;在递增计数时为0x0。 计时器能够
    捕获三种类型的事件:上升沿、下降沿或上升/下降沿。 计时器放置在边沿计时
    通过将 GPTMTnMR 寄存器中的 TnCMR 位置位和定时器将要发送的事件类型
    捕获值由 GPTMCTL 寄存器的 TnEVENT 位域决定。 第964页的表13-8
    显示启用定时器时加载到定时器寄存器的值。

    在软件写 GPTMCTL 寄存器的 TnEN 位时、定时器使能并开始事件捕获。
    在检测到所选的输入事件时、将在
    GPTMTnR 和 GPTMTnPS 寄存器、可由微控制器读取。 该 GPTM
    然后让 GPTM 原始中断状态(GPTMRIS)寄存器中的 CnERIS 位有效并保持该值
    直到向 GPTM 中断清除(GPTMICR)寄存器执行写操作将其清零。 如果采集模式
    事件中断在 GPTM 中断屏蔽(GPTMIMR)寄存器中使能、GPTM 也会将其置位
    GPTM 屏蔽中断状态(GPTMMIS)寄存器的 CnEMIS 位。 在此模式下、
    GPTMTnR 和 GPTMTnPS 寄存器保持选定输入事件发生的时间、同时

    GPTMTnV 寄存器保存自由运行的定时器的值。 可以读取这些寄存器、以确定
    从发生中断到进入 ISR 之间经历的时间。
    除了产生中断、也可以产生 ADC 和/或 μ μDMA 触发。 该 ADC
    将 GPTMCTL 中的 TnOTE 位置位即可启用触发、而激活 ADC 的事件
    在 GPTM ADC 事件(GPTMADCEV)寄存器中配置。 μ μDMA 触发器的启用方式为:
    配置合适的 μ μDMA 通道以及在 GPTM DMA 中选择的触发类型
    事件(GPTMDMAEV)寄存器。 请见"通道配置"在683页。
    在捕获到事件之后、定时器不会停止计数。 它会继续计数、直至
    TnEN 位清零。 当定时器达到超时值时、在递增计数中重新载入0x0
    模式以及向下计数模式下 GPTMTnILR 和 GPTMTnPR 寄存器中的值。
    第965页的描绘出输入边沿定时模式的工作原理。 在此图中、假设是
    计时器的起始值为默认值0xFFFF、并且计时器配置为捕捉
    上升沿事件。
    每次检测到上升沿事件时、当前计数值加载到 GPTMTnR 中、并且
    GPTMTnPS 寄存器、并且一直保持在那里直到检测到另外一个上升沿(在此上升沿上、新的
    将计数值加载到 GPTMTnR 和 GPTMTnPS 寄存器中)。

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

    您好,Charles  

    我了解。 感谢您的帮助。

    谢谢。此致、

    维贾伊