This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

Start and stop RTC with PORT events on a single pin

Hi, i'm wondering if it's possible to make a GPIO pin trigger different tasks when it is externally driven from low to high, and high to low.

I'm trying to stop an RTC timer when a pin goes high and start it again when it goes low, using PPI. Do i need to allocate two GPIOTE channels? And how do i get the different event adresses?

I'm on the nRF52, and i'm not using SD, I also don't want the high frequency clock running.

  • Yes, you can do this no problem. and you need to use GPIOTE. I guess you are capturing pulse width using RTC?

  • Sorry, I didn't see nRF52 in your message. I haven't used 52 a lot. But I think it is the same concept: Are you having problem using single pin for two tasks? I solved this issue by some tricks in nRF51 SDK: You need to use a "unused/fake" pin as a channel placeholder to hold the other channel for the "real" pin. and then change the "fake" pin back to the "real" pin by using nrf_gpiote_event_configure.

  • Probably in the next SDK release Nordic can remove this limitation? :-)

  • I'm trying to halt the execution of code which is periodically called with the RTC, using an external interrupt.

    Do i use the placeholder pin when i run nrf_drv_gpiote_in_event_addr_get(placeholder) when assigning EEP and TEP to a ppi channel?

    exp: APP_ERROR_CHECK(nrf_drv_ppi_channel_assign(ppi_channel_rtc_start, nrf_drv_gpiote_in_event_addr_get(ADXL362_INT_PIN), nrf_drv_rtc_task_address_get(&rtc, NRF_RTC_TASK_STOP)));

    edit: It seems that nrf_gpiote_event_configure is only valid when GPIOTE is in high accuracy mode (using hfclk), otherwise it is using: m_cb.port_handlers_pins[channel-NUMBER_OF_GPIO_TE] |= (p_config->sense)<< SENSE_FIELD_POS;

    The control block is locked static in the driver, so i don't have access to it.

  • You technically can't do this the obvious way, by assigning two GPIOTE channels, one up, one down, to the same pin .. from the manual

    "Only one GPIOTE channel can be assigned to one physical pin. Failing to do so may result in unpredictable behavior."

    In the nrf51 series this limitation only actually applied to output to the pin, which makes sense, and although never documented as safe, you could attach two input GPIOTE channels to the same pin and it worked.

    So you could try that - see if it works or not, but be aware you're not really following the spec if you do.

    Another option would be to use one toggle GPIOTE, then two groups of 3 PPIs each, one group containing a PPI to start the timer, one a PPI to stop it and the other two PPIs to enable/disable the other group each time. In that way you flip-flop between two states automatically.

    The best way to do this however is to attach your input signal to two GPIOs and configure one GPIOTE each on them.

Related