60 #include "hal_saadc.h" 61 #include "hal_clocks.h" 62 #include "hal_nop_delay.h" 64 #include "nrf_assert.h" 65 #include "hal_nop_delay.h" 67 #include "common_util.h" 73 #define LOGGER_INTERVAL_MS 50 76 #define SAADC_NUMBER_OF_CHANNELS 1 82 #define SAADC_RC_CHANNEL_CONFIG \ 84 .resistor_p = NRF_SAADC_RESISTOR_DISABLED, \ 85 .resistor_n = NRF_SAADC_RESISTOR_DISABLED, \ 86 .gain = NRF_SAADC_GAIN4, \ 87 .reference = NRF_SAADC_REFERENCE_INTERNAL, \ 88 .acq_time = NRF_SAADC_ACQTIME_10US, \ 89 .mode = NRF_SAADC_MODE_DIFFERENTIAL, \ 90 .burst = NRF_SAADC_BURST_ENABLED, \ 91 .pin_p = PIN_TO_ANALOG_INPUT(PIR_RC_SIGNAL_PIN), \ 92 .pin_n = PIN_TO_ANALOG_INPUT(PIR_RC_OFFSET_PIN) \ 95 #define SAADC_AMP_CHANNEL_CONFIG \ 97 .resistor_p = NRF_SAADC_RESISTOR_DISABLED, \ 98 .resistor_n = NRF_SAADC_RESISTOR_DISABLED, \ 99 .gain = NRF_SAADC_GAIN1, \ 100 .reference = NRF_SAADC_REFERENCE_INTERNAL, \ 101 .acq_time = NRF_SAADC_ACQTIME_10US, \ 102 .mode = NRF_SAADC_MODE_DIFFERENTIAL, \ 103 .burst = NRF_SAADC_BURST_DISABLED, \ 104 .pin_p = PIN_TO_ANALOG_INPUT(PIR_AMP_SIGNAL_PIN), \ 105 .pin_n = PIN_TO_ANALOG_INPUT(PIR_AMP_OFFSET_PIN) \ 113 #define PIR_RC_CHANNEL_UPPER_LIMIT (32767) 114 #define PIR_RC_CHANNEL_LOWER_LIMIT (-32768) 116 #define PIR_AMP_CHANNEL_UPPER_LIMIT (100) 117 #define PIR_AMP_CHANNEL_LOWER_LIMIT (-100) 121 #define APPLN_SAADC_RESOLUTION NRF_SAADC_RESOLUTION_12BIT 123 #define APPLN_SAADC_OVERSAMPLING NRF_SAADC_OVERSAMPLE_DISABLED 125 #define APPLN_SAADC_IRQ_PRIORITY APP_IRQ_PRIORITY_LOW 140 { PIR_AMP_CHANNEL_UPPER_LIMIT, PIR_AMP_CHANNEL_LOWER_LIMIT }
147 SAADC_AMP_CHANNEL_CONFIG
152 static int16_t saadc_result[1];
158 static void saadc_init(
void);
161 void trigger_handler(
void)
163 log_printf(
"RTC handlers\n");
164 hal_gpio_pin_toggle(LED_RED);
173 if(nrf_saadc_event_check(NRF_SAADC_EVENT_STARTED))
175 nrf_saadc_event_clear(NRF_SAADC_EVENT_STARTED);
176 SEGGER_RTT_printf(0,
"STARTED: %d\n", saadc_result);
181 if (nrf_saadc_event_check(NRF_SAADC_EVENT_END))
183 nrf_saadc_event_clear(NRF_SAADC_EVENT_END);
185 log_printf(
"END: %d [%d%d]\n", saadc_result[0], NRF_SAADC->EVENTS_CH[0].LIMITH, NRF_SAADC->EVENTS_CH[0].LIMITL
194 NRF_SAADC->EVENTS_CH[0].LIMITH = NRF_SAADC->EVENTS_CH[0].LIMITL = 0;
195 NRF_SAADC->EVENTS_CH[1].LIMITH = NRF_SAADC->EVENTS_CH[1].LIMITL = 0;
200 if(nrf_saadc_event_check(NRF_SAADC_EVENT_DONE))
202 nrf_saadc_event_clear(NRF_SAADC_EVENT_DONE);
203 SEGGER_RTT_printf(0,
"DONE: %d\n", saadc_result);
206 if(nrf_saadc_event_check(NRF_SAADC_EVENT_RESULTDONE))
208 nrf_saadc_event_clear(NRF_SAADC_EVENT_RESULTDONE);
209 SEGGER_RTT_printf(0,
"RESULTDONE: %d\n", saadc_result);
212 if(nrf_saadc_event_check(NRF_SAADC_EVENT_STOPPED))
214 nrf_saadc_event_clear(NRF_SAADC_EVENT_STOPPED);
215 SEGGER_RTT_printf(0,
"STOPPED: %d %d\n", saadc_result[0], saadc_result[1]);
220 if(nrf_saadc_event_check(NRF_SAADC_EVENT_CH0_LIMITH))
222 nrf_saadc_event_clear(NRF_SAADC_EVENT_CH0_LIMITH);
223 log_printf(
"CH0_LIMITH: %d\n", saadc_result[0]);
228 if(nrf_saadc_event_check(NRF_SAADC_EVENT_CH0_LIMITL))
230 nrf_saadc_event_clear(NRF_SAADC_EVENT_CH0_LIMITL);
231 log_printf(
"CH0_LIMITL: %d\n", saadc_result[0]);
238 if(nrf_saadc_event_check(NRF_SAADC_EVENT_CH1_LIMITH))
240 nrf_saadc_event_clear(NRF_SAADC_EVENT_CH1_LIMITH);
241 SEGGER_RTT_printf(0,
"CH1_LIMITH: %d %d\n", saadc_result[0], saadc_result[1]);
244 if(nrf_saadc_event_check(NRF_SAADC_EVENT_CH1_LIMITL))
246 nrf_saadc_event_clear(NRF_SAADC_EVENT_CH1_LIMITL);
247 SEGGER_RTT_printf(0,
"CH1_LIMITL: %d %d\n", saadc_result[0], saadc_result[1]);
253 static void saadc_init(
void)
256 "The number of SAADC channels is between 1 and 8");
257 static_assert((PIR_AMP_CHANNEL_LOWER_LIMIT >= -32768) && (PIR_AMP_CHANNEL_LOWER_LIMIT <= 32767),
258 "The channel limit of SAADC is between -32768 and 32767");
259 static_assert((PIR_AMP_CHANNEL_UPPER_LIMIT >= -32768) && (PIR_AMP_CHANNEL_UPPER_LIMIT <= 32767),
260 "The channel limit of SAADC is between -32768 and 32767");
261 static_assert((PIR_RC_CHANNEL_LOWER_LIMIT >= -32768) && (PIR_RC_CHANNEL_LOWER_LIMIT <= 32767),
262 "The channel limit of SAADC is between -32768 and 32767");
263 static_assert((PIR_RC_CHANNEL_UPPER_LIMIT >= -32768) && (PIR_RC_CHANNEL_UPPER_LIMIT <= 32767),
264 "The channel limit of SAADC is between -32768 and 32767");
268 nrf_saadc_buffer_init(saadc_result,
ARRAY_SIZE(saadc_result));
270 NVIC_EnableIRQ(SAADC_IRQn);
271 NVIC_ClearPendingIRQ(SAADC_IRQn);
277 nrf_saadc_channel_limits_set(i,
278 saadc_limit_config[i].lower_limit,
279 saadc_limit_config[i].upper_limit);
282 nrf_saadc_int_enable(
284 NRF_SAADC_INT_CH0LIMITH |
285 NRF_SAADC_INT_CH0LIMITL
290 NRF_PPI->CH[PPI_CHEN_CH0_Pos].EEP = (uint32_t) &(NRF_SAADC->EVENTS_STARTED);
291 NRF_PPI->CH[PPI_CHEN_CH0_Pos].TEP = (uint32_t) &(NRF_SAADC->TASKS_SAMPLE);
292 NRF_PPI->CHENSET = PPI_CHENSET_CH0_Set << PPI_CHEN_CH0_Pos;
299 NRF_PPI->CH[PPI_CHEN_CH1_Pos].EEP = (uint32_t) &(NRF_RTC0->EVENTS_COMPARE[0]);
300 NRF_PPI->CH[PPI_CHEN_CH1_Pos].TEP = (uint32_t) &(NRF_SAADC->TASKS_START);
301 NRF_PPI->FORK[PPI_CHEN_CH1_Pos].TEP = (uint32_t) &(NRF_RTC0->TASKS_CLEAR);
302 NRF_PPI->CHENSET = PPI_CHENSET_CH1_Set << PPI_CHEN_CH1_Pos;
311 NRF_PPI->CH[PPI_CHEN_CH2_Pos].EEP = (uint32_t) &(NRF_SAADC->EVENTS_END);
312 NRF_PPI->CH[PPI_CHEN_CH2_Pos].TEP = (uint32_t) &(NRF_SAADC->TASKS_STOP);
313 NRF_PPI->CHENSET = PPI_CHENSET_CH2_Set << PPI_CHEN_CH2_Pos;
320 NRF_RTC0->TASKS_STOP = 1;
321 NRF_RTC0->PRESCALER = 0;
323 NRF_RTC0->EVTENSET = (RTC_EVTENSET_COMPARE0_Enabled << RTC_EVTENSET_COMPARE0_Pos);
324 NRF_RTC0->EVENTS_COMPARE[0] = 0;
325 NRF_RTC0->TASKS_START = 1;
337 log_printf(
"\n\nHello World!\n");
#define SAADC_NUMBER_OF_CHANNELS
Macro that defines the number of channels of ADC to sample.
#define APPLN_SAADC_RESOLUTION
The ADC converstion resolution used in this application.
Configuration structure of the SAADC limit for a channel.
#define APPLN_SAADC_OVERSAMPLING
The number of samples used to average to get the result.
void lfclk_init(lfclk_src_t lfclk_src)
Function to initialize the LF clock.
#define APPLN_SAADC_IRQ_PRIORITY
The interrupt priority of the SAADC peripheral.
#define LOGGER_INTERVAL_MS
Macro that defines the data sampling frequency.
#define saadc_channel_init
To be consistent with the saadc naming for the function here. The function definition is in the SDK H...
__STATIC_INLINE void saadc_sampling_task_mode_set(void)
Function that sets the sampling to be started with SAMPLING task.
int main(void)
Function for application main entry.
void SAADC_IRQHandler(void)
Implementation of the SAADC interrupt handler.