Hello,
I would like to measure the frequency of a signal and I use PPI, a timer and input capture to achieve this.
Here's the configuration :
/** @brief Function for initializing the PPI peripheral.
*/
static void ppi_init(void)
{
NRF_PPI->CH[0].EEP = (uint32_t)&NRF_GPIOTE->EVENTS_IN[0]; // Put add of the event to EEP register
NRF_PPI->CH[0].TEP = (uint32_t)&NRF_TIMER1->TASKS_CAPTURE[0]; // Put add of the task to TEP register
NRF_PPI->FORK[0].TEP = (uint32_t)&NRF_TIMER1-> TASKS_CLEAR;// Put add of the task to TEP fork register
NRF_PPI->CHENSET = (uint32_t)(1<<0); //Enable PPI channel0
}
/** @brief Function for initializing the timer1 peripheral.
*/
static void timer1_init (void){
NRF_TIMER1->MODE = (uint32_t)TIMER_MODE_MODE_Timer<<TIMER_MODE_MODE_Pos; // Timer mode
NRF_TIMER1->BITMODE = (uint32_t)TIMER_BITMODE_BITMODE_24Bit<<TIMER_BITMODE_BITMODE_Pos; // 32 bits resolution
NRF_TIMER1->PRESCALER = (uint32_t)0; // Prescaler = 0
}
/**
* @brief Function for configuring: input PIN, output PIN.
*/
static void gpio_init(void)
{
/********************************** Configure input for capture **********************************/
NRF_GPIOTE->CONFIG[0] = GPIOTE_CONFIG_MODE_Event << GPIOTE_CONFIG_MODE_Pos |
GPIOTE_CONFIG_POLARITY_LoToHi << GPIOTE_CONFIG_POLARITY_Pos |
29 << GPIOTE_CONFIG_PSEL_Pos |
GPIOTE_CONFIG_OUTINIT_Low << GPIOTE_CONFIG_OUTINIT_Pos;
/*************************************************************************************************/
}
The frequency of my signal is stable but the return captured value varies a bit.
<info> app: 176
<info> app: 176
<info> app: 177
<info> app: 175
<info> app: 176
<info> app: 176
<info> app: 176
Is due to the nRF52 timer precision ?
I use the external Xtal so I don't think it his precision
Development conditions
- Segger Embbeded Studio
- SDK 14.2 no softdevice
- Windows 10
- nRF52840-PDK PCA10056 V0.9.3