Hi all,
I using nrf52832 and segger IDE
I am trying disable softdevice and enable it while chip running. In my project, I use RTC1 for app timer.
When I disable SD, I will stop app_timer relate to SD follow example ble_app_gzll.
This my code :
static void disable_GATT_table(void) { NRF_LOG_INFO("Disable GATT Table"); // Stop functions using SoftDevice before disabling Soft Device ble_services_stop(); //wdt_stop(); // Disable the softdevice stack. ble_stack_stop(); NRF_LOG_INFO("Disable SD"); //check_source_clock(); // Request Low frequency clock for RTC2 nrf_drv_clock_lfclk_request(NULL); NRF_LOG_INFO("Request Low frequency clock"); //check_source_clock(); }
static void ble_services_stop(void) { uint32_t err_code; // Stop any impending connection parameters update. err_code = ble_conn_params_stop(); APP_ERROR_CHECK(err_code); //app_timer_stop_all(); // Stop application timers. err_code = app_timer_stop(m_bonding_timeout); APP_ERROR_CHECK(err_code); err_code = app_timer_stop(m_update_service_id); APP_ERROR_CHECK(err_code); }
void uart_start(uart_data_handle_t p_data_handler) { uint32_t err_code; app_uart_comm_params_t const comm_params = { .rx_pin_no = RX_PIN_NUMBER, .tx_pin_no = TX_PIN_NUMBER, .rts_pin_no = RTS_PIN_NUMBER, .cts_pin_no = CTS_PIN_NUMBER, .flow_control = APP_UART_FLOW_CONTROL_DISABLED, .use_parity = false, #if defined (UART_PRESENT) .baud_rate = NRF_UART_BAUDRATE_115200 #else .baud_rate = NRF_UARTE_BAUDRATE_115200 #endif }; NVIC_ClearPendingIRQ(UART_RX_HANDLE_IRQn); NVIC_SetPriority(UART_RX_HANDLE_IRQn, UART_RX_HANDLE_IRQPriority); NVIC_EnableIRQ(UART_RX_HANDLE_IRQn); p_uart_data_handler = p_data_handler; fifo_init(&m_transmit_fifo); fifo_init(&m_receive_fifo); // Create timers. err_code = app_timer_create(&m_wakeup_ecu_timeout, APP_TIMER_MODE_SINGLE_SHOT, wakeup_ecu_timeout); APP_ERROR_CHECK(err_code); err_code = app_timer_create(&m_send_msg_timeout, APP_TIMER_MODE_SINGLE_SHOT, send_msg_timeout); APP_ERROR_CHECK(err_code); #if (defined BONDING_WHEN_START_UP) && (BONDING_WHEN_START_UP == true) // Create timers. err_code = app_timer_create(&m_uart_bonding_timeout, APP_TIMER_MODE_SINGLE_SHOT, uart_bonding_timeout); APP_ERROR_CHECK(err_code); #endif app_uart_buffers_t buffers; buffers.rx_buf = rx_buf; buffers.rx_buf_size = sizeof (rx_buf); buffers.tx_buf = tx_buf; buffers.tx_buf_size = sizeof (tx_buf); err_code = app_uart_init(&comm_params, &buffers, uart_event_handle, APP_IRQ_PRIORITY_LOWEST); APP_ERROR_CHECK(err_code); wakeup_gpio_int_init(); uart_initialized = true; }
In uart_start, I created 2 app_timer. If I comment this app_timer. My process dis SD and en SD run normal.
If I don't comment 2 app_timer. I wil have troubles with function
expired_timers_handler in app_timer.c and program will run forever in loop while (mp_timer_id_head != NULL)
If in function ble_services_stop(), I add line : app_timer_stop_all();
I will not encounter this problem with app timer. But I don't want disable all app_timer because I will have app_timer repeat. So I only want disable app_timer relate with SD, after reinit it.
I need 2 app_timer in uart.c . So how I resolve problem with expired_timers_handler
Thank very much!!!