Thread 中讨论的其他器件: EK-TM4C1294XL
大家好、
我正在尝试使用 TM4C1294NCPDT 微控制器修改定制板、以创建触发源/扇出。 电路板的目标是接收触发信号、从而导致多个计时器(理想情况下全部为6个)开始计数、然后在超时时(计数器值通过 HTTP POST 请求更新、因此在后台运行以太网例程)时输出信号。
软件使用:
- Code Composer Studio 7.1.10
- LM 闪存编程器
硬件使用:
- EK-TM4C1294XL (调试部分作为调试器/编程器)
- Tektronix TDS 2024C 示波器(认为需要提及)
如上所述、当用户触发(上升沿输入)电路板时、计时器开始计数、计时器的目的是在触发各自器件之前产生延迟。 现在、我正在尝试在计时器4和计时器5中使用 PIOSC 作为我的外设时钟、但没有成功(成功意味着我以 10us 的延迟触发器件、并且尽可能减少错误)。 具有最新代码的电路板输出如下所示:
- 上图是电路板的输出、其中黄色是触发迹线
- 在清除中断标志之前、用户触发 LED (上升沿)并且定时器5 (紫色跟踪)中断服务例程将其关闭(下降沿)。
- 蓝色和紫色迹线分别是定时器4和定时器5 ISR。
- 触发线迹的宽度为13.40us (从触发信号到紫色 ISR 例程)、蓝色线迹在触发器下降沿之后600ns (比预期晚4us 开启)、 紫色在超过触发器下降沿的1.8us (比预期的晚5.2us 开启)。
- 上图中的光标(黄色虚线)宽度为10us、用于显示进入 ISR 所需时间的差异。
定时器配置代码如下:
void initTimer (void){ //启用所有计时器模块外设 MAP_SysCtlPeripheralEnable (SYSCTL_Periph_TIMER0); MAP_initCtlPeripheralEnable (SYSCTL_Periph_TIMER4); MAP_SysCtlPeripheralEnable (SYSCTL_Periph_TIMER5); //启用 PIOSC MAP_SysCtlAltClkConfig (SYSCTL_ALTCLK_PIOSC); //校准 PIOSC 以确保最佳/最接近16 MHz 定时器值 MAP_SysCtlPIOSCCalibrate (SYSCTL_PIOSC_CAL_FACTOR); //将计时器外设配置为使用 PIOSC 而不是默认的(系统时钟) MAP_TimerClockSourceSet (TIMER4_base、TIMER_CLOCK _PIOSC); MAP_TimerClockSourceSet (TIMER5_base、TIMER_CLOCK _PIOSC); //将计时器配置为两个16位计时器(边沿计时器加载模式);IMER_TIME_MAP_TIMER 4 (TIMER_COUNT_TIMER);配置 TIMERCH_TIMER TOP_LEASE (TIMER_TIMER) //确保在启用定时器中断 MAP_TIMERIntClear (TIMER4_base、INT_TIMER4A); MAP_TIMERIntClear (TIMER5_base、INT_TIMER5A); //启用计时器中断在超时 发生 MAP_IntEnable (INT_TIMER4A); MAP_TIMER4 (TIMER_INT_TOMER5A);启用 TIMER_INT_INT_INTIMER 中断 Timer_TINA_TIMEOUT); }
触发代码如下:
void PortBIntHandler (void){ if (MAP_GPIOIntStatus (GPIO_PORTB_BASE、false)& GPIO_INT_PIN_5){ MAP_GPIOIntClear (GPIO_PORTB_BASE、GPIO_INT_PIN_5); //UINT32_t TIMERLoadLoad = DELAY[0]* 120 *- TIMER32_DELAY[120] *= UTTLAY32_1*、UINT32_DELAY32];/TIMER32_TRY32_DELAYST_TRY32_TREM_TRY32_TRY32_TRY32_TREM_TRY32_TRY32_TREM_TRY32_TRY32_TREM_TRY32_TRY32_TRY32_TRY32_TREM_TRY32_TRY32_TREM_TRY32_TREM //MAP_TimerLoadSet (TIMER5_base、TIMER_A、DELAY[1]* 120 - 308); MAP_TimerLoadSet (TIMER4_base、TIMER_A、timerDelayLoad1); MAP_TimerLoadSet (TIMER5_base、 Timer_A、timerDelayLoad2); //HWREG (TIMER4_base + TIMER_O_TAILR)= DELAY[0]* 120; //HWREG (TIMER5_base + TIMER_O_TAILR)= DELAY[0]* 120; MAP_TIMER4_BASE、TIMER_MAIL); TIMER_MAIL (TIMER_BASE) MAP_TimerSynchronize (TIMER0_BASE、(TIMER_4A_SYNC | TIMER_5A_SYNC)); }
计时器 处理程序如下所示:
void Timer4IntHandler (void){ //仅用于调试目的 MAP_GPIOPPinWrite (GPIO_PORTP_BASE、GPIO_PIN_1、0 << 1); //将中断标志首先清除为 MAP_TimerIntClear (TIMER4_base、TIMER_TIMA_TIMEOUT); if (MAP_GPIOPINRE1_BASE、 GPIO_1)、GPIORT_PIN1 (GPIO_PER_1)、GPIO_PER_TO_1、GPIO_PER1 (GPIO_PER_1) 1200000); } 否则(如果(MAP_GPIOPORTN_BASE、GPIO_PIN_1)=GPIO_PIN_1){ MAP_GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_1、0 << 1); MAP_TimerDisable (TIMER4_BASE、TIMER_A); }} } void Timer5IntHandler (void){ MAP_GPIOPORTP_BASE、GPIO_PIN_0、0); MAP_TimerIntClear (TIMER5_base、TIMER_TINA_TIMEOUT); if (MAP_GPIOPINREAD (GPIO_PORTN_BASE、GPIO_PIN_2)!= GPIO_PIN_2){ MAP_GPIOPINWrite (GPIO_PORTN_BASE、GPIO_PIN_2、1 << 2); MAP_TimerLoadSet (TIMER5_base、TIMER_A、 1200000); } 否则为(MAP_GPIOPinRead (GPIO_PORTN_BASE、GPIO_PIN_2)=GPIO_PIN_2){ MAP_GPIOPinWrite (GPIO_PORTN_BASE、GPIO_PIN_2、0 << 2); MAP_TimerDisable (TIMER5_base、timer_A); } }
系统时钟配置如下:
G_ui32SysClock = MAP_SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_INT | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、120000000);
最初、我使用系统时钟作为计时器源时钟、该时钟确实接近预期的延迟值、与上述 PIOSC 方法相反。 但是、它至少关闭了1.2us 和 2.4us (分别为计时器4和计时器5)、可轻松转换为120MHz 时钟上的200个时钟周期。 我认为我运行的以太网代码(基于 enet_io)可能会导致延迟、因此我想、由于延迟具有一致的误差、我可以减去这一数量的周期。 不幸的是,这没有我预期的理想结果,而是使产出接近10 us,这是不一致的。
正如我刚才注释过的那样、您可以看到我尝试了其他方法来解决这个问题(例如、通过直接寄存器编程来减少时钟周期)。
我想我的问题是-在后台运行以太网例程的计时器上是否可以实现5us 的延迟?
此致、
Stephen B.
如果图片有用、我可以发布更多图片-我避免使图片过长。
