我正在尝试配置宽定时器0、以使用边沿定时器功能计算脉冲序列的频率(~1kHz)。
配置代码:
// //将 PLL 的时钟设置为以50MHz 运行。 // ROM_SysCtlClockSet (SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL | SYSCTL_XTAL_16MHz | SYSCTL_OSC_MAIN); /* *将输入引脚(PC4)配置为使用 CCP * SysCtlPeripheralEnable (SYSCTL_Periph_GPIOC); while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOC)){} GPIOPinConfigure (GPIO_PC4_WT0CCP0); GPIOPadConfigSet (GPIO_PORTC_BASE、GPIO_PIN_4、GPIO_Strength _2mA、GPIO_PIN_TYPE_STD_WPD); GPIODirModeSet (GPIO_PORTC_BASE、GPIO_PORTC_BASE、GPIO_DIR_MODE_IN); GPIOPinTypeTimer (GPIO_PORTC_BASE、GPIO_PIN_4); /* *在上升沿计时器模式中配置宽计时器0的计时器 A 模块、在周期模式中配置计时器 B * SysCtlPeripheralEnable (SYSCTL_Periph_WTIME0); while (!SysCtlPeripheralReady (SYSCTL_Periph_WTIME0)){} TimerConfigure (WTIMER 0_BASE、TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_CAP_TIME | TIMER_CFG_B_PERIODICRACRACASE); TimerControlEvent (WTIMER0_BASE、TIMER_A、TIMER_EVENT_POS_EDGE); /* *设置定时器预分频和加载值 * TimerLoadSet (WTIMER 0_BASE、TIMER_Both、250000); /* *设置定时器 CCP 和定时器超时的中断 * TimerIntRegister (WTIMER 0_BASE、TIMER_A、TimerW0AInt); TimerIntEnable (WTIMER 0_BASE、TIMER_CAP_EVENT); IntEnable (INT_WTIME0A); /* *启用主中断 * IntMasterEnable(); /* *启用计时器 * TimerEnable (WTIMER 0_BASE、TIMER_Both);
ISR:
/* *获取发生的计时器中断类型、然后将其清除 * TimerIntClear (WTIMER 0_BASE、TIMER_CAP_EVENT); /* *发生了 CCP 边沿捕获、计算另一个边沿的信号周期 *在这之前已被捕获 * uint32_t ui32_snapshot = TimerValueGet (WTIMER 0_BASE、TIMER_A); if (gui8_edge_flag){ int32_t i32_delta; //计算时间增量 i32_delta = gui32_last_timer_val - ui32_snapshot; /* *检查计时器溢出:由于计时器处于递减计数模式、因此新快照 如果发生溢出、*值将大于最后一个值(因此时间增量将为 *为负。 如果发生溢出、则将计时器加载值添加到的差值 *计算真实时间差。 * if (i32_delta < 0){ i32_delta +=定时器周期+ 1; } /* *将时间增量存储到缓冲区中 * xSemaphoreTakeFromISR (gp_time_delta_semaphore、NULL); circbuf_write (&g_freq_buffer、(uint32_t) i32_delta); xSemaphoreGiveFromISR (gp_time_delta_semaphore、NULL); } 否则{ //设置标志 gui8_EDGE_FLAG = 1; } //更新计时器边沿的最后一个值 gui32_last_timer_val = ui32_snapshot;
我使用的计时器加载值为250000、根据计算结果、最小输入频率应为50MHz/250000 = 200Hz。 circbuf_write 只会向用作循环缓冲区的数组中添加一个值、并更新正在运行的缓冲区内容总和(我已使用其他代码)。 我使用测试方波输入信号(50%直流、500Hz、0-3.5V)来引起中断。 我正在使用调试器读取 i32_delta 的值、它的波动非常大:我不确定这是由于 Tiva 丢失了边沿还是其他我缺失的东西。