nrf52832, keil with startups from sdk13
Initialization:
/* Start 32 MHz crystal oscillator */
NRF_CLOCK->EVENTS_HFCLKSTARTED = 0;
NRF_CLOCK->TASKS_HFCLKSTART = 1;
/* Wait for the external oscillator to start up */
while (NRF_CLOCK->EVENTS_HFCLKSTARTED == 0)
{
// Do nothing.
}
/****************************************************************************************/
/* Configure Timer0 */
NRF_TIMER0->PRESCALER = 0;
NRF_TIMER0->BITMODE = TIMER_BITMODE_BITMODE_32Bit;
NRF_TIMER0->MODE = TIMER_MODE_MODE_Timer;
/* Configure GPIO PIN_NUM */
NRF_GPIO->PIN_CNF[PIN_NUM1] = (GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos) |
(GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) |
(GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) |
(GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos) |
(GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos);
/* Configure GPIOTE 0*/
NRF_GPIOTE->CONFIG[0] |= (GPIOTE_CONFIG_MODE_Event << GPIOTE_CONFIG_MODE_Pos) |
(PIN_NUM1 << GPIOTE_CONFIG_PSEL_Pos) |
(GPIOTE_CONFIG_POLARITY_HiToLo << GPIOTE_CONFIG_POLARITY_Pos);
NRF_GPIOTE->INTENSET |= GPIOTE_INTENSET_IN0_Enabled << GPIOTE_INTENSET_IN0_Pos;
/* Configure PPI 0*/
NRF_PPI->CH[0].EEP = (uint32_t)&NRF_GPIOTE->EVENTS_IN[0];
NRF_PPI->CH[0].TEP = (uint32_t)&NRF_TIMER0->TASKS_CAPTURE[0];
NRF_PPI->FORK[0].TEP = (uint32_t)&NRF_TIMER0->TASKS_CLEAR;
NRF_PPI->CHENSET |= PPI_CHENSET_CH0_Enabled << PPI_CHENSET_CH0_Pos;
/****************************************************************************************/
NRF_TIMER0->TASKS_START = 1;
NVIC_EnableIRQ(GPIOTE_IRQn);
IntHandler:
void GPIOTE_IRQHandler(void)
{
if (1 == NRF_GPIOTE->EVENTS_IN[0])
{
time1 = NRF_TIMER0->CC[0];
switch (state1)
{
...
}
NRF_GPIOTE->EVENTS_IN[0] = 0;
}
}
With one event everything working well. Then I add another:
/* Start 32 MHz crystal oscillator */
NRF_CLOCK->EVENTS_HFCLKSTARTED = 0;
NRF_CLOCK->TASKS_HFCLKSTART = 1;
/* Wait for the external oscillator to start up */
while (NRF_CLOCK->EVENTS_HFCLKSTARTED == 0)
{
// Do nothing.
}
/****************************************************************************************/
/* Configure Timer0 */
NRF_TIMER0->PRESCALER = 0;
NRF_TIMER0->BITMODE = TIMER_BITMODE_BITMODE_32Bit;
NRF_TIMER0->MODE = TIMER_MODE_MODE_Timer;
/* Configure GPIO PIN_NUM */
NRF_GPIO->PIN_CNF[PIN_NUM1] = (GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos) |
(GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) |
(GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) |
(GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos) |
(GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos);
/* Configure GPIOTE 0*/
NRF_GPIOTE->CONFIG[0] |= (GPIOTE_CONFIG_MODE_Event << GPIOTE_CONFIG_MODE_Pos) |
(PIN_NUM1 << GPIOTE_CONFIG_PSEL_Pos) |
(GPIOTE_CONFIG_POLARITY_HiToLo << GPIOTE_CONFIG_POLARITY_Pos);
NRF_GPIOTE->INTENSET |= GPIOTE_INTENSET_IN0_Enabled << GPIOTE_INTENSET_IN0_Pos;
/* Configure PPI 0*/
NRF_PPI->CH[0].EEP = (uint32_t)&NRF_GPIOTE->EVENTS_IN[0];
NRF_PPI->CH[0].TEP = (uint32_t)&NRF_TIMER0->TASKS_CAPTURE[0];
NRF_PPI->FORK[0].TEP = (uint32_t)&NRF_TIMER0->TASKS_CLEAR;
NRF_PPI->CHENSET |= PPI_CHENSET_CH0_Enabled << PPI_CHENSET_CH0_Pos;
/****************************************************************************************/
/****************************************************************************************/
/* Configure Timer1 */
NRF_TIMER1->PRESCALER = 0;
NRF_TIMER1->BITMODE = TIMER_BITMODE_BITMODE_32Bit;
NRF_TIMER1->MODE = TIMER_MODE_MODE_Timer;
/* Configure GPIO PIN_NUM */
NRF_GPIO->PIN_CNF[PIN_NUM2] = (GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos) |
(GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos) |
(GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos) |
(GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos) |
(GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos);
/* Configure GPIOTE 1*/
NRF_GPIOTE->CONFIG[1] |= (GPIOTE_CONFIG_MODE_Event << GPIOTE_CONFIG_MODE_Pos) |
(PIN_NUM2 << GPIOTE_CONFIG_PSEL_Pos) |
(GPIOTE_CONFIG_POLARITY_HiToLo << GPIOTE_CONFIG_POLARITY_Pos);
NRF_GPIOTE->INTENSET |= GPIOTE_INTENSET_IN1_Enabled << GPIOTE_INTENSET_IN1_Pos;
/* Configure PPI 1*/
NRF_PPI->CH[1].EEP = (uint32_t)&NRF_GPIOTE->EVENTS_IN[1];
NRF_PPI->CH[1].TEP = (uint32_t)&NRF_TIMER1->TASKS_CAPTURE[0];
NRF_PPI->FORK[1].TEP = (uint32_t)&NRF_TIMER1->TASKS_CLEAR;
NRF_PPI->CHENSET |= PPI_CHENSET_CH1_Enabled << PPI_CHENSET_CH1_Pos;
/****************************************************************************************/
NRF_TIMER0->TASKS_START = 1;
NRF_TIMER1->TASKS_START = 1;
NVIC_EnableIRQ(GPIOTE_IRQn);
void GPIOTE_IRQHandler(void)
{
if (1 == NRF_GPIOTE->EVENTS_IN[0])
{
time1 = NRF_TIMER0->CC[0];
switch (state1)
{
...
}
NRF_GPIOTE->EVENTS_IN[0] = 0;
}
if (1 == NRF_GPIOTE->EVENTS_IN[1])
{
time2 = NRF_TIMER0->CC[1];
switch (state2)
{
...
}
NRF_GPIOTE->EVENTS_IN[1] = 0;
}
}
I need to measure SENT signal from two channels, minimal signal lenght is 36 uSec, and with two channels sometimes I have 0 in time1/time2 (they are global) vars. I think this because when I for example handled first channel, EVENT_IN[0] didn't be cleared (I didn't see clearing in System Viewer, after NRF_GPIOTE->EVENTS_IN[0] = 0; it is still 1 in System Viewer). And when second channel generate EVENT_IN[1] I came into if (1 == NRF_GPIOTE->EVENTS_IN[0]), but I shouldn't.
Is it real? How to clear event correctly?