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

100us counter

OS in development environment :Windows7
HARD :(Taiyo Yuden)EBSHSN Series Evaluation Board : Central / Peripherals
CPU :(Nordic) nRF52832 / ARMR Cortex?-M4F 32 bit processor 28-pin Land Grid Array / 15GPIOs / SWD
Soft Ver:nRF5_SDK_15.2.0_9412b96

Please tell me the processing method to count variables by 100us without generating interrupt.

Please let me know if there is a sample program

Thank you very much.

  • The presence or absence of an interrupt was confirmed by port output.
    I use soft devices.
    You need a timer that counts in less than 100 microseconds.

    Counting less than 100us in 1ms divisor


    I want to use a timer that is controlled by hardware, but I do not know how to use it.

  • Ok. so you have the timer set up, which fires every 100ms, and then you increment a counter in the interrupt, right?

    So if you have the timer events,  you can use PPI to connect your timer events to a counter. You need to use another timer, e.g. TIMER3 in counter mode, and have the PPI task to increment this counter. 

    So using PPI, you want to have the PPI.EEP (event end point) to be the timer 4 event, and the PPI.TEP (task end point) to be incrementing the timer.

    Did you examine the PPI example that I sent?

  • Is there a problem with the attached program?
    /**
    
    **/
    #include <stdint.h>
    
    #include "nrf_delay.h"
    #include "app_error.h"
    
    #include "nrf_drv_ppi.h"
    #include "nrf_drv_timer.h"
    
    #include "nrf_log.h"
    #include "nrf_log_ctrl.h"
    #include "nrf_log_default_backends.h"
    
    #define PPI_EXAMPLE_TIMER0_INTERVAL			(100)	/* Timer interval in 100us */
    
    static const nrf_drv_timer_t m_timer0 = NRF_DRV_TIMER_INSTANCE(0);
    
    static nrf_ppi_channel_t m_ppi_channel1;
    
    static volatile uint32_t m_counter;
    
    
    static void timer0_event_handler(nrf_timer_event_t event_type, void * p_context)
    {
        ++m_counter;
    }
    
    /** @brief Function for initializing the PPI peripheral.	*/
    static void ppi_init(void)
    {
        uint32_t err_code = NRF_SUCCESS;
    
        err_code = nrf_drv_ppi_init();
        APP_ERROR_CHECK(err_code);
    
        err_code = nrf_drv_ppi_channel_alloc(&m_ppi_channel1);
        APP_ERROR_CHECK(err_code);
        err_code = nrf_drv_ppi_channel_assign(m_ppi_channel1,
                                              nrf_drv_timer_event_address_get(&m_timer0,
                                                                              NRF_TIMER_EVENT_COMPARE0),
                                              nrf_drv_timer_task_address_get(&m_timer0,
                                                                             NRF_TIMER_TASK_START));
        APP_ERROR_CHECK(err_code);
    
        err_code = nrf_drv_ppi_channel_enable(m_ppi_channel1);
        APP_ERROR_CHECK(err_code);
    }
    
    /** @brief Function for Timer 0 initialization.	*/
    static void timer0_init(void)
    {
        nrf_drv_timer_config_t timer_cfg = NRF_DRV_TIMER_DEFAULT_CONFIG;
        timer_cfg.frequency = NRF_TIMER_FREQ_31250Hz;
        ret_code_t err_code = nrf_drv_timer_init(&m_timer0, &timer_cfg, timer0_event_handler);
        APP_ERROR_CHECK(err_code);
    
        nrf_drv_timer_extended_compare(&m_timer0,
                                       NRF_TIMER_CC_CHANNEL0,
                                       nrf_drv_timer_us_to_ticks(&m_timer0,
                                                                 PPI_EXAMPLE_TIMER0_INTERVAL),
                                       NRF_TIMER_SHORT_COMPARE0_CLEAR_MASK,
                                       true);
    }
    
    
    /**
     * @brief Function for application main entry.
     */
    int main(void)
    {
        uint32_t old_val = 0;
        uint32_t err_code;
    
        ppi_init();
        timer0_init(); 
    
         /* Start */
        nrf_drv_timer_enable(&m_timer0);
    	
        while (true)
        {
    		/**/
        }
    }
    
    /** @} */
    

  • You tell me. Does it work?

    It doesn't look like it does what you want it to. You don't need the ppi to use the timeout event handler, timer0_event_handler. The issue is that this is called very frequently, but if the CPU doesn't have time to handle every timer interrupt, then your m_counter will not be incremented correctly. This may happen if you e.g. use the softdevice, which will some times use the CPU, and it has a higher interrupt priority than the timer. But as far as I can tell you are not using the softdevice?

    If you want to use the PPI, to increment a counter without the CPU, let me know, and I can try to explain.

  • Please check the contents of the program.
    If you count timers correctly in 100 μs, is there any problem with the following process?
    1) Create 100 us with "timer0".
    2) Set "timer1" to "count mode".
    3) Execute "timer1" "COUNT task" at "timer 0" timing with PPI.

Related