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

NRF52832 As to the usage of timer in Advertising mode

Hello, 

please help to grasp the problem, 

when using the timer to control gpio pin with constant period as shown below, if trying to do advertising for BLE communication, 

the gpio can't be stable, when checking the behavior of gpio pins in oscilloscope, can see shaking, 

if turning off the advertising, the problem is not happened, 

if you know the solution, please help to let me know it with detailed information or example code, 

I already considered the usage of PPI or GPIOTE, but in my opinion , the cases is not matched with what I want to do (in order to control gpio pin in diverse period).

thankful for your support in advance,

ref) my email is, [email protected]

Timer Handler ex :

void tcs_waveform_timer_event_handler_us(nrf_timer_event_t event_type, void* p_context)//love_1212 1 khz(1ms) t1/t2/t3 : 25 us
{
switch(event_type)
{
case NRF_TIMER_EVENT_COMPARE0:

if(tcs_on_count == 3333)
tcs_on_count = 1;
else
tcs_on_count++;

if(tcs_on_count == 1)
NRF_P0->OUTSET = (1 << TCS_ON2); ==> GPIO 1 PIN SET
else if(tcs_on_count == 51)
NRF_P0->OUTCLR = (1 << TCS_ON2); ==> GPIO 1  PIN RESET 
else if(tcs_on_count == 52)
NRF_P0->OUTSET = (1 << TCS_ON1); ==> GPIO 2 PIN SET
else if(tcs_on_count == 102)
NRF_P0->OUTCLR = (1 << TCS_ON1); ==> GPIO 2  PIN RESET 
break;
default:
//Do nothing.
break;
}
}

I set the timer as below,


void Hal_Tcs_1Khz_Timer_Init(void)
{
uint32_t time_in_us = 5;//love_1212 for 1 khz 25;//16666; //Time(in miliseconds) between consecutive compare events.
uint32_t time_ticks;
uint32_t err_code = NRF_SUCCESS;

nrf_gpio_cfg_output(TCS_ON1);
nrf_gpio_cfg_output(TCS_ON2);

tcs_on_count = 0;//love_1120
//Configure all leds on board.
err_code = nrf_drv_timer_init(&TIMER_1, NULL, tcs_waveform_timer_event_handler_us);
APP_ERROR_CHECK(err_code);

time_ticks = nrf_drv_timer_us_to_ticks(&TIMER_1, time_in_us);//love_1115

nrf_drv_timer_extended_compare(
&TIMER_1, NRF_TIMER_CC_CHANNEL0, time_ticks, NRF_TIMER_SHORT_COMPARE0_CLEAR_MASK, true);
NVIC_SetPriority(TIMER2_IRQn, 2);
}

thanks.

Parents
  • Hello, Edvin,

    I tried to make the example by using the example of gpiote of SDK 14.0.1 ....as follows,

    but the waveform is not perfect for my case, I need your help,

    if possible, Could you please kindly help to implement the following waveform with my code ?

    thankful for your kindness in advance,

    thanks....

    #define TCS_ON1 24//love_1116 BSP_LED_2
    #define TCS_ON2 25//love_1116 BSP_LED_2

    static nrf_drv_timer_t timer = NRF_DRV_TIMER_INSTANCE(2);

    void timer_dummy_handler(nrf_timer_event_t event_type, void * p_context){}

    static void led_blinking_setup()
    {
    uint32_t compare_evt_addr, compare_evt_addr_1, compare_evt_addr_2, compare_evt_addr_3;
    uint32_t gpiote_task_addr, gpiote_task_addr_1, gpiote_task_addr_2, gpiote_task_addr_3;
    nrf_ppi_channel_t ppi_channel, ppi_channel_1, ppi_channel_2, ppi_channel_3;
    ret_code_t err_code;
    nrf_drv_gpiote_out_config_t config = GPIOTE_CONFIG_OUT_TASK_TOGGLE(false);

    err_code = nrf_drv_gpiote_out_init(TCS_ON1, &config);
    APP_ERROR_CHECK(err_code);

    err_code = nrf_drv_gpiote_out_init(TCS_ON2, &config);
    APP_ERROR_CHECK(err_code);

    //love_0625 250-5-250, 60hz based on 500 resistance.
    nrf_drv_timer_extended_compare(&timer, (nrf_timer_cc_channel_t)0, nrf_drv_timer_us_to_ticks(&timer, 250), NRF_TIMER_SHORT_COMPARE0_CLEAR_MASK, false);//1 us,
    nrf_drv_timer_extended_compare(&timer, (nrf_timer_cc_channel_t)1, nrf_drv_timer_us_to_ticks(&timer, 255), NRF_TIMER_SHORT_COMPARE1_CLEAR_MASK, false);//1 us,
    nrf_drv_timer_extended_compare(&timer, (nrf_timer_cc_channel_t)2, nrf_drv_timer_us_to_ticks(&timer, 505), NRF_TIMER_SHORT_COMPARE2_CLEAR_MASK, false);//1 us,
    nrf_drv_timer_extended_compare(&timer, (nrf_timer_cc_channel_t)3, nrf_drv_timer_us_to_ticks(&timer, 16665), NRF_TIMER_SHORT_COMPARE3_CLEAR_MASK, false);//1 us,

    err_code = nrf_drv_ppi_channel_alloc(&ppi_channel);
    APP_ERROR_CHECK(err_code);

    err_code = nrf_drv_ppi_channel_alloc(&ppi_channel_1);
    APP_ERROR_CHECK(err_code);

    err_code = nrf_drv_ppi_channel_alloc(&ppi_channel_2);
    APP_ERROR_CHECK(err_code);

    err_code = nrf_drv_ppi_channel_alloc(&ppi_channel_3);
    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(TCS_ON1);

    compare_evt_addr_1 = nrf_drv_timer_event_address_get(&timer, NRF_TIMER_EVENT_COMPARE1);
    gpiote_task_addr_1 = nrf_drv_gpiote_out_task_addr_get(TCS_ON1);

    compare_evt_addr_2 = nrf_drv_timer_event_address_get(&timer, NRF_TIMER_EVENT_COMPARE2);
    gpiote_task_addr_2 = nrf_drv_gpiote_out_task_addr_get(TCS_ON2);

    compare_evt_addr_3 = nrf_drv_timer_event_address_get(&timer, NRF_TIMER_EVENT_COMPARE3);
    gpiote_task_addr_3 = nrf_drv_gpiote_out_task_addr_get(TCS_ON2);

    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_assign(ppi_channel_1, compare_evt_addr_1, gpiote_task_addr_1);
    APP_ERROR_CHECK(err_code);

    err_code = nrf_drv_ppi_channel_assign(ppi_channel_2, compare_evt_addr_2, gpiote_task_addr_2);
    APP_ERROR_CHECK(err_code);

    err_code = nrf_drv_ppi_channel_assign(ppi_channel_3, compare_evt_addr_3, gpiote_task_addr_3);
    APP_ERROR_CHECK(err_code);

    err_code = nrf_drv_ppi_channel_enable(ppi_channel);
    APP_ERROR_CHECK(err_code);

    err_code = nrf_drv_ppi_channel_enable(ppi_channel_1);
    APP_ERROR_CHECK(err_code);

    err_code = nrf_drv_ppi_channel_enable(ppi_channel_2);
    APP_ERROR_CHECK(err_code);

    err_code = nrf_drv_ppi_channel_enable(ppi_channel_3);
    APP_ERROR_CHECK(err_code);

    nrf_drv_gpiote_out_task_enable(TCS_ON1);
    nrf_drv_gpiote_out_task_enable(TCS_ON2);
    }

    void Hal_Tcs_PPI_Timer_Start(void)//love_0625
    {
    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 = NRF_DRV_TIMER_DEFAULT_CONFIG;
    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.
    led_blinking_setup();

    // Enable timer
    nrf_drv_timer_enable(&timer);
    }

Reply
  • Hello, Edvin,

    I tried to make the example by using the example of gpiote of SDK 14.0.1 ....as follows,

    but the waveform is not perfect for my case, I need your help,

    if possible, Could you please kindly help to implement the following waveform with my code ?

    thankful for your kindness in advance,

    thanks....

    #define TCS_ON1 24//love_1116 BSP_LED_2
    #define TCS_ON2 25//love_1116 BSP_LED_2

    static nrf_drv_timer_t timer = NRF_DRV_TIMER_INSTANCE(2);

    void timer_dummy_handler(nrf_timer_event_t event_type, void * p_context){}

    static void led_blinking_setup()
    {
    uint32_t compare_evt_addr, compare_evt_addr_1, compare_evt_addr_2, compare_evt_addr_3;
    uint32_t gpiote_task_addr, gpiote_task_addr_1, gpiote_task_addr_2, gpiote_task_addr_3;
    nrf_ppi_channel_t ppi_channel, ppi_channel_1, ppi_channel_2, ppi_channel_3;
    ret_code_t err_code;
    nrf_drv_gpiote_out_config_t config = GPIOTE_CONFIG_OUT_TASK_TOGGLE(false);

    err_code = nrf_drv_gpiote_out_init(TCS_ON1, &config);
    APP_ERROR_CHECK(err_code);

    err_code = nrf_drv_gpiote_out_init(TCS_ON2, &config);
    APP_ERROR_CHECK(err_code);

    //love_0625 250-5-250, 60hz based on 500 resistance.
    nrf_drv_timer_extended_compare(&timer, (nrf_timer_cc_channel_t)0, nrf_drv_timer_us_to_ticks(&timer, 250), NRF_TIMER_SHORT_COMPARE0_CLEAR_MASK, false);//1 us,
    nrf_drv_timer_extended_compare(&timer, (nrf_timer_cc_channel_t)1, nrf_drv_timer_us_to_ticks(&timer, 255), NRF_TIMER_SHORT_COMPARE1_CLEAR_MASK, false);//1 us,
    nrf_drv_timer_extended_compare(&timer, (nrf_timer_cc_channel_t)2, nrf_drv_timer_us_to_ticks(&timer, 505), NRF_TIMER_SHORT_COMPARE2_CLEAR_MASK, false);//1 us,
    nrf_drv_timer_extended_compare(&timer, (nrf_timer_cc_channel_t)3, nrf_drv_timer_us_to_ticks(&timer, 16665), NRF_TIMER_SHORT_COMPARE3_CLEAR_MASK, false);//1 us,

    err_code = nrf_drv_ppi_channel_alloc(&ppi_channel);
    APP_ERROR_CHECK(err_code);

    err_code = nrf_drv_ppi_channel_alloc(&ppi_channel_1);
    APP_ERROR_CHECK(err_code);

    err_code = nrf_drv_ppi_channel_alloc(&ppi_channel_2);
    APP_ERROR_CHECK(err_code);

    err_code = nrf_drv_ppi_channel_alloc(&ppi_channel_3);
    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(TCS_ON1);

    compare_evt_addr_1 = nrf_drv_timer_event_address_get(&timer, NRF_TIMER_EVENT_COMPARE1);
    gpiote_task_addr_1 = nrf_drv_gpiote_out_task_addr_get(TCS_ON1);

    compare_evt_addr_2 = nrf_drv_timer_event_address_get(&timer, NRF_TIMER_EVENT_COMPARE2);
    gpiote_task_addr_2 = nrf_drv_gpiote_out_task_addr_get(TCS_ON2);

    compare_evt_addr_3 = nrf_drv_timer_event_address_get(&timer, NRF_TIMER_EVENT_COMPARE3);
    gpiote_task_addr_3 = nrf_drv_gpiote_out_task_addr_get(TCS_ON2);

    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_assign(ppi_channel_1, compare_evt_addr_1, gpiote_task_addr_1);
    APP_ERROR_CHECK(err_code);

    err_code = nrf_drv_ppi_channel_assign(ppi_channel_2, compare_evt_addr_2, gpiote_task_addr_2);
    APP_ERROR_CHECK(err_code);

    err_code = nrf_drv_ppi_channel_assign(ppi_channel_3, compare_evt_addr_3, gpiote_task_addr_3);
    APP_ERROR_CHECK(err_code);

    err_code = nrf_drv_ppi_channel_enable(ppi_channel);
    APP_ERROR_CHECK(err_code);

    err_code = nrf_drv_ppi_channel_enable(ppi_channel_1);
    APP_ERROR_CHECK(err_code);

    err_code = nrf_drv_ppi_channel_enable(ppi_channel_2);
    APP_ERROR_CHECK(err_code);

    err_code = nrf_drv_ppi_channel_enable(ppi_channel_3);
    APP_ERROR_CHECK(err_code);

    nrf_drv_gpiote_out_task_enable(TCS_ON1);
    nrf_drv_gpiote_out_task_enable(TCS_ON2);
    }

    void Hal_Tcs_PPI_Timer_Start(void)//love_0625
    {
    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 = NRF_DRV_TIMER_DEFAULT_CONFIG;
    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.
    led_blinking_setup();

    // Enable timer
    nrf_drv_timer_enable(&timer);
    }

Children
No Data
Related