您好!
我想测量方波信号的频率(大约25Hz)。
硬件设置由我提供、而不是由我完成。 我之前在不同的微控制器上执行此操作、方法是对16位计数器的溢出进行计数、并考虑从2个连续正边沿捕获的2个值。
因此、我在 SPLIT / 16位/递增计数"输入边沿计时模式"中设置 TIMER5 A
我的初始化代码如下所示(实际的 GPIO 配置由其他地方的 pinmux 工具完成、我检测捕获中断、以便 GPIO 设置正常)
空 TimerCCPInit (空) { //定时器外设使能 SysCtlPeripheralEnable (SYSCTL_Periph_TIMER5); //等待外设为编程做好准备 while (!SysCtlPeripheralReady (SYSCTL_Periph_TIMER5)); //禁用计时器 TimerDisable (TIMER5_base、timer_both); //计时器时钟源=系统时钟(高精度120MHz) TimerClockSourceSet (TIMER5_base、timer_clock_system); //拆分模式中的定时器(2x 16位、递增计数、捕捉模式) TimerConfigure (TIMER5_base、TIMER_CFG_SPLIT_PAIR | TIMER_CFG_A_CAP_TIME_UP); //将 Timer A 的 Timer 事件类型设置为正边沿计数 TimerControlEvent (TIMER5_base、TIMER_A、TIMER_EVENT_POS_EDGE); //将计时器预分频器设置为4,得到120MHz:4=> 30Mhz 计时器时钟 //在递增计数模式中,预分频器提供计数值的 MSB (伪24位模式) TimerPrescaleSet (TIMER5_base、TIMER_A、4); //递增计数模式中超时中断的上限 TimerLoadSet (TIMER5_base、TIMER_A、0xFFFF); //寄存器 Timer5A 处理程序 TimerIntRegister (TIMER5_base、TIMER_A、Timer5AIntHandler); //启用捕捉中断 TimerIntEnable (TIMER5_base、TIMER_CAP_EVENT | TIMER_TINA_TIMEOUT); //启用计时器 TimerEnable (TIMER5_base、timer_A); }
我希望在捕获事件(正常工作)和计数器从0xFFFF 溢出到0x0000 (数据表在最后一句的第13.4.4段中的"在输入边沿定时模式中、定时器在检测到边沿事件后继续运行、
但定时器间隔可以随时通过写 GPTMTnILR 寄存器和清零来改变
GPTMTnMR 寄存器中的 TnILD 位。 更改在写入后的下一个周期生效。"
因此、我假设它也会回滚并生成超时中断。
我的处理程序代码如下所示:
void Timer5AIntHandler (void) { //获取屏蔽的中断状态,因为我们需要检查它是否是捕获 //或溢出中断 uint32_t InterruptFlags = TimerIntStatus (TIMER5_base、true); //检查捕捉中断 if (InterruptFlags & TIMER_CAP_EVENT) { //读取捕捉值 uiTimer5CaptureValue = TimerValueGet (TIMER5_base、timer_A); //如果它是捕捉中断,清除中断标志 TimerIntClear (TIMER5_base、TIMER_CAP_EVENT); uiTimer5溢出= 0; //在每次捕获时将 D73切换为绿色 bLEDToggleFlag++; if (bLEDToggleFlag & 0x01) GPIOPinWrite (LED_D73_GREEN _N_PORT、LED_D73_GREEN _N_PIN、0); 其他 GPIOPinWrite (LED_D73_GREEN _N_PORT、LED_D73_GREEN N_PIN、LED_D73_GREEN N_PIN); } if (InterruptFlags & TIMER_TINA_TIMEOUT) { TimerIntClear (TIMER5_base、TIMER_TINA_TIMEOUT); uiTimer5溢出++; } }
前面板上的 LED 以预期的25Hz 频率闪烁、如果我设置断点、我会看到 uTimer5CaptureValue (上面未显示的一些全局变量)每次都设置为当前的捕获值。
如果我在下分支中设置了一个用于检查 TIMER_TINA_TIMEOUT 的断点、它将永远不会被触发、我也会看到变量停留在零。
我在这里错过了什么?
Markus