Tool/software:
Hello,
I am using the GPT timer to capture a pulse width. Two timers are being involved I set up both GPTTImers to capture both edges of the pulse and then I calculated the delta of the first edge and second edge. I have a TX line that will be enabled after both timers are set up. The Tx line is going to two identical capacitors, with the ends of each capacitor going to different rx gpios. Since the signal of the RX is the same, the generated interrupts should happen simultaneously, but it seems like only one interrupt is actually being generated, not both.
Thanks,
Kenneth T.
Hello Kenneth,
Would you be able to provide a basic code file which demonstrates your GPTimer setup and could help us replicate the issue you're describing? Is the same GPTimer interrupt called, or can it vary between the two? If one is disabled then will the other interrupt always be serviced? Does the same behavior occur if using 3.3V power supply levels?
Are you using the TI Driver, driverlib, or direct hardware register access? What can you gather by debugging the register interrupt status of your timers? Also, what version of the F2 SDK are you evaluating?
Regards,
Ryan
vector<GPTimerCC26XX_Handle> gptimer_handles(2); for (size_t t = 0; t < 2; t++) { // Configure GPTimer for edge time capture GPTimerCC26XX_Params gptimer_params; GPTimerCC26XX_Params_init(&gptimer_params); gptimer_params.width = GPT_CONFIG_16BIT; gptimer_params.mode = GPT_MODE_EDGE_TIME; gptimer_params.matchTiming = GPTimerCC26XX_SET_MATCH_NEXT_CLOCK; gptimer_params.direction = GPTimerCC26XX_DIRECTION_UP; gptimer_params.debugStallMode = GPTimerCC26XX_DEBUG_STALL_OFF; // Open GPTimer and set argument to "this" object for callback to use GPTimerCC26XX_Handle gptimer_handle = GPTimerCC26XX_open(t, &gptimer_params); gptimer_handles[t] = gptimer_handle; GPTimerCC26XX_setArg(gptimer_handle, this); // Configure Gpio for edge interrupt if (t == 0) { gpio.configure(Gpio::PinId::DIO_16, Gpio::Direction::INPUT, Gpio::Pull::NONE, Gpio::State::NONE, Gpio::Strength::NONE, GPTimerCC26XX_getPinMux(gptimer_handle)); } else if (t == 1) { gpio.configure(Gpio::PinId::DIO_1, Gpio::Direction::INPUT, Gpio::Pull::NONE, Gpio::State::NONE, Gpio::Strength::NONE, GPTimerCC26XX_getPinMux(gptimer_handle)); } // Set load value in order to support full/max 24-bit capability, configure edge mode and register callback GPTimerCC26XX_setLoadValue(gptimer_handle, MAX_GPTIMER_COUNT); GPTimerCC26XX_setCaptureEdge(gptimer_handle, both_edges ? GPTimerCC26XX_BOTH_EDGES : (rising_edge ? GPTimerCC26XX_POS_EDGE : GPTimerCC26XX_NEG_EDGE)); GPTimerCC26XX_registerInterrupt(gptimer_handle, gptimerCallback, GPT_INT_CAPTURE); GPTimerCC26XX_start(gptimer_handle); } tx_gpio.writeHigh(); for (size_t t = 0; t < 2; t++) { first_edge_sem.wait(); } for (size_t t = 0; t < 2; t++) { _second_edge_sem.wait(); } tx_gpio.writeLow(); for (size_t t = 0; t < 2; t++) { // Stop and close GPTimer GPTimerCC26XX_unregisterInterrupt(gptimer_handles[t]); GPTimerCC26XX_stop(gptimer_handles[t]); GPTimerCC26XX_close(gptimer_handles[t]); }
void Timer::gptimerCallback(GPTimerCC26XX_Handle gptimer_handle, GPTimerCC26XX_IntMask interruptMask) { // Capture edge value Timer* timer = reinterpret_cast<Timer*>(GPTimerCC26XX_getArg(gptimer_handle)); if (timer->_edge_count == 0) { timer->_first_edge_gpt = GPTimerCC26XX_getValue(gptimer_handle); timer->_first_edge_sem.post(); } else if (timer->_edge_count == 1) { timer->_second_edge_gpt = GPTimerCC26XX_getValue(gptimer_handle); timer->_second_edge_sem.post(); } timer->_edge_count++; }