board: nRF52 DK
[update - fixed this - see #2]
When I use the following (shortened) code, the LED blinks when I press button 2 but I see no logs. NRF_LOG_INFO() is working in other areas of the code.
#define BMA_TAP_INTERRUPT_PIN BUTTON_2 bool foo = false; void bma_tap_interrupt_handler(nrf_drv_gpiote_pin_t pin, nrf_gpiote_polarity_t action) { nrf_drv_gpiote_out_toggle(LED1); foo = true; } void bma_enable_tap_interrupt(uint32_t pin, nrf_drv_gpiote_evt_handler_t evt_handler) { ret_code_t ret_code; if (!nrf_drv_gpiote_is_init()) { ret_code = nrf_drv_gpiote_init(); APP_ERROR_CHECK(ret_code); } nrf_drv_gpiote_in_config_t gpiote_config = GPIOTE_CONFIG_IN_SENSE_TOGGLE(true); gpiote_config.pull = NRF_GPIO_PIN_PULLUP; ret_code = nrf_drv_gpiote_in_init(pin, &gpiote_config, evt_handler); APP_ERROR_CHECK(ret_code); nrf_drv_gpiote_in_event_enable(pin, true); NRF_LOG_INFO("initialised pin %d for tap intr", pin); /** for debug **/ nrf_drv_gpiote_out_config_t out_config = GPIOTE_CONFIG_OUT_SIMPLE(false); ret_code = nrf_drv_gpiote_out_init(LED1, &out_config); APP_ERROR_CHECK(ret_code); /** for debug **/ } int main(void) { bma_enable_tap_interrupt(BMA_TAP_INTERRUPT_PIN, bma_tap_interrupt_handler); for (;;) { if (foo) { NRF_LOG_INFO("bar"); foo = false; } idle_state_handle(); } }
It doesn't make sense to me that nrf_drv_gpiote_out_toggle(LED1) gets called but foo does not get set to true.
[#2]
For an extra challenge, when I add the following function call to main (setup pins: sck=2, dout=26), LED1 turns on but pressing button 2 does not actuate the led anymore.
void hx711_init(enum hx711_mode mode, struct hx711_setup *setup, hx711_evt_handler_t callback) { ret_code_t ret_code; hx711_callback = callback; m_setup = setup; m_mode = mode; if (m_setup != NULL) { nrf_gpio_cfg_output(m_setup->pd_sck); nrf_gpio_pin_set(m_setup->pd_sck); if (!nrf_drv_gpiote_is_init()) { ret_code = nrf_drv_gpiote_init(); APP_ERROR_CHECK(ret_code); } nrf_drv_gpiote_in_config_t gpiote_config = GPIOTE_CONFIG_IN_SENSE_HITOLO(true); nrf_gpio_cfg_input(m_setup->dout, NRF_GPIO_PIN_NOPULL); ret_code = nrf_drv_gpiote_in_init(m_setup->dout, &gpiote_config, gpiote_evt_handler); APP_ERROR_CHECK(ret_code); /* Set up timers, gpiote, and ppi for clock signal generation*/ NRF_TIMER1->CC[0] = 1; NRF_TIMER1->CC[1] = HX711_DEFAULT_TIMER_COMPARE; NRF_TIMER1->CC[2] = HX711_DEFAULT_TIMER_COUNTERTOP; NRF_TIMER1->SHORTS = (uint32_t) (1 << 2); //COMPARE2_CLEAR NRF_TIMER1->PRESCALER = 0; NRF_TIMER2->CC[0] = m_mode; NRF_TIMER2->MODE = 2; NRF_GPIOTE->CONFIG[1] = (uint32_t) (3 | (m_setup->pd_sck << 8) | (1 << 16) | (1 << 20)); NRF_PPI->CH[0].EEP = (uint32_t) &NRF_TIMER1->EVENTS_COMPARE[0]; NRF_PPI->CH[0].TEP = (uint32_t) &NRF_GPIOTE->TASKS_SET[1]; NRF_PPI->CH[1].EEP = (uint32_t) &NRF_TIMER1->EVENTS_COMPARE[1]; NRF_PPI->CH[1].TEP = (uint32_t) &NRF_GPIOTE->TASKS_CLR[1]; NRF_PPI->FORK[1].TEP = (uint32_t) &NRF_TIMER2->TASKS_COUNT; // Increment on falling edge NRF_PPI->CH[2].EEP = (uint32_t) &NRF_TIMER2->EVENTS_COMPARE[0]; NRF_PPI->CH[2].TEP = (uint32_t) &NRF_TIMER1->TASKS_SHUTDOWN; NRF_PPI->CHEN = NRF_PPI->CHEN | 7; } else { NRF_LOG_WARNING("hx711 setup has not been assigned yet"); } }
For this problem, I suspect it has something to do with GPIOTE channels, but I can't watch the registers because my vscode cortex debugger is not working right now. I'm not overlapping any pins I believe.