I wrote this code to make a 1MHz signal clock with timer and GPIOTE.
#include "mclk.h"
static nrf_drv_timer_t timer = NRF_DRV_TIMER_INSTANCE(0);
void timer_dummy_handler(nrf_timer_event_t event_type, void * p_context){}
void mclk_init(void)
{
ret_code_t err_code;
err_code = nrf_drv_ppi_init();
APP_ERROR_CHECK(err_code);
err_code = nrf_drv_gpiote_init();
APP_ERROR_CHECK(err_code);
nrf_drv_timer_config_t timer_cfg =
{
.frequency = (nrf_timer_frequency_t)3,
.mode = (nrf_timer_mode_t)TIMER_DEFAULT_CONFIG_MODE,
.bit_width = (nrf_timer_bit_width_t)TIMER_DEFAULT_CONFIG_BIT_WIDTH,
.interrupt_priority = 0,
.p_context = NULL
};
err_code = nrf_drv_timer_init(&timer, &timer_cfg, timer_dummy_handler);
APP_ERROR_CHECK(err_code);
// Setup PPI channel with event from TIMER compare and task GPIOTE pin toggle.
uint32_t compare_evt_addr;
uint32_t gpiote_task_addr;
nrf_ppi_channel_t ppi_channel;
nrf_drv_gpiote_out_config_t config = GPIOTE_CONFIG_OUT_TASK_TOGGLE(false);
err_code = nrf_drv_gpiote_out_init(MCLK_PIN, &config);
APP_ERROR_CHECK(err_code);
nrf_drv_timer_extended_compare(&timer, (nrf_timer_cc_channel_t)0, 1, NRF_TIMER_SHORT_COMPARE0_CLEAR_MASK, false);
err_code = nrf_drv_ppi_channel_alloc(&ppi_channel);
APP_ERROR_CHECK(err_code);
compare_evt_addr = nrf_drv_timer_event_address_get(&timer, NRF_TIMER_EVENT_COMPARE0);
gpiote_task_addr = nrf_drv_gpiote_out_task_addr_get(MCLK_PIN);
err_code = nrf_drv_ppi_channel_assign(ppi_channel, compare_evt_addr, gpiote_task_addr);
APP_ERROR_CHECK(err_code);
err_code = nrf_drv_ppi_channel_enable(ppi_channel);
APP_ERROR_CHECK(err_code);
nrf_drv_gpiote_out_task_enable(MCLK_PIN);
// Enable timer
nrf_drv_timer_enable(&timer);
}
It works fine without softdevice, but when I modify my app to use BLE, gpiote doesn't work (I found the problem is GPIOTE when I commented out all lines with it)
My config is
// <e> GPIOTE_ENABLED - nrf_drv_gpiote - GPIOTE peripheral driver //========================================================== #ifndef GPIOTE_ENABLED #define GPIOTE_ENABLED 1 #endif #if GPIOTE_ENABLED // <o> GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS - Number of lower power input pins #ifndef GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS #define GPIOTE_CONFIG_NUM_OF_LOW_POWER_EVENTS 4 #endif // <o> GPIOTE_CONFIG_IRQ_PRIORITY - Interrupt priority // <i> Priorities 0,2 (nRF51) and 0,1,4,5 (nRF52) are reserved for SoftDevice // <0=> 0 (highest) // <1=> 1 // <2=> 2 // <3=> 3 #ifndef GPIOTE_CONFIG_IRQ_PRIORITY #define GPIOTE_CONFIG_IRQ_PRIORITY 3 #endif // <e> GPIOTE_CONFIG_LOG_ENABLED - Enables logging in the module. //========================================================== #ifndef GPIOTE_CONFIG_LOG_ENABLED #define GPIOTE_CONFIG_LOG_ENABLED 0 #endif #if GPIOTE_CONFIG_LOG_ENABLED // <o> GPIOTE_CONFIG_LOG_LEVEL - Default Severity level // <0=> Off // <1=> Error // <2=> Warning // <3=> Info // <4=> Debug #ifndef GPIOTE_CONFIG_LOG_LEVEL #define GPIOTE_CONFIG_LOG_LEVEL 3 #endif // <o> GPIOTE_CONFIG_INFO_COLOR - ANSI escape code prefix. // <0=> Default // <1=> Black // <2=> Red // <3=> Green // <4=> Yellow // <5=> Blue // <6=> Magenta // <7=> Cyan // <8=> White #ifndef GPIOTE_CONFIG_INFO_COLOR #define GPIOTE_CONFIG_INFO_COLOR 0 #endif // <o> GPIOTE_CONFIG_DEBUG_COLOR - ANSI escape code prefix. // <0=> Default // <1=> Black // <2=> Red // <3=> Green // <4=> Yellow // <5=> Blue // <6=> Magenta // <7=> Cyan // <8=> White #ifndef GPIOTE_CONFIG_DEBUG_COLOR #define GPIOTE_CONFIG_DEBUG_COLOR 0 #endif #endif //GPIOTE_CONFIG_LOG_ENABLED // </e> #endif //GPIOTE_ENABLED // </e>
But #define APP_GPIOTE_ENABLED 0
If I change APP_GPIOTE will it help?