/**@brief Initialize application. */ static void application_initialize() { uint32_t err_code; err_code = sd_ant_cw_test_mode_init(); APP_ERROR_CHECK(err_code); // sd_ant_cw_test_mode assumes that the hfclck is enabled. // Request and wait for it to be ready. err_code = sd_clock_hfclk_request(); APP_ERROR_CHECK(err_code); uint32_t hfclk_is_running = 0; while (!hfclk_is_running) { APP_ERROR_CHECK(sd_clock_hfclk_is_running(&hfclk_is_running) ); } // CW Mode at +4dBm, 2410 MHz with Modulated Transmission err_code = sd_ant_cw_test_mode(RADIO_FREQ_OFFSET, RADIO_TX_POWER_LVL_CUSTOM, RADIO_TXPOWER_TXPOWER_Pos4dBm, MODULATED_TRANSMISSION_TEST_MODE); APP_ERROR_CHECK(err_code); }
void protocol_init(struct ir_protocol *protocol, uint8_t led_pin, struct rtc_ctx *c) { ctx = c; context.protocol = protocol; context.led_pin = led_pin; // low freq clock NRF_CLOCK->LFCLKSRC = (CLOCK_LFCLKSRC_SRC_Xtal << CLOCK_LFCLKSRC_SRC_Pos); NRF_CLOCK->EVENTS_LFCLKSTARTED = 0; NRF_CLOCK->TASKS_LFCLKSTART = 1; while (NRF_CLOCK->EVENTS_LFCLKSTARTED == 0) /* NOTHING */; NRF_CLOCK->EVENTS_LFCLKSTARTED = 0; // rtc1 interrupt sd_nvic_ClearPendingIRQ(RTC1_IRQn); sd_nvic_SetPriority(RTC1_IRQn, NRF_APP_PRIORITY_LOW); sd_nvic_EnableIRQ(RTC1_IRQn); NRF_RTC1->EVTENSET = RTC_EVTENSET_COMPARE0_Msk; NRF_RTC1->INTENSET = RTC_INTENSET_COMPARE0_Msk; // high freq clock sd_clock_hfclk_request(); // timer1 NRF_TIMER1->TASKS_STOP = 1; NRF_TIMER1->TASKS_CLEAR = 1; NRF_TIMER1->PRESCALER = 4; NRF_TIMER1->MODE = TIMER_MODE_MODE_Timer; NRF_TIMER1->BITMODE = TIMER_BITMODE_BITMODE_16Bit; NRF_TIMER1->SHORTS = TIMER_SHORTS_COMPARE2_CLEAR_Msk; NRF_TIMER1->CC[0] = 1; NRF_TIMER1->CC[1] = ROUNDED_DIV(context.protocol->pulse_width, 3); NRF_TIMER1->CC[2] = context.protocol->pulse_width; // timer2 (counter) NRF_TIMER2->TASKS_STOP = 1; NRF_TIMER2->TASKS_CLEAR = 1; NRF_TIMER2->MODE = TIMER_MODE_MODE_Counter; NRF_TIMER2->BITMODE = TIMER_BITMODE_BITMODE_16Bit; NRF_TIMER2->TASKS_START = 1; NRF_TIMER2->SHORTS = TIMER_SHORTS_COMPARE0_CLEAR_Msk; // gpio (led) nrf_gpio_cfg_output(led_pin); // ppi's sd_ppi_channel_assign(0, &NRF_TIMER1->EVENTS_COMPARE[0], &NRF_GPIOTE->TASKS_OUT[0]); // toggle led sd_ppi_channel_assign(1, &NRF_TIMER1->EVENTS_COMPARE[1], &NRF_GPIOTE->TASKS_OUT[0]); // toggle led sd_ppi_channel_assign(2, &NRF_TIMER1->EVENTS_COMPARE[2], &NRF_TIMER2->TASKS_COUNT); // inc timer2 sd_ppi_channel_assign(3, &NRF_TIMER2->EVENTS_COMPARE[0], &NRF_TIMER1->TASKS_STOP); // stops timer1 after timer2 reaches N sd_ppi_channel_enable_set(PPI_CHEN_CH0_Msk | PPI_CHEN_CH1_Msk | PPI_CHEN_CH2_Msk | PPI_CHEN_CH3_Msk); }
static void hfclk_start(void) { #ifndef SOFTDEVICE_PRESENT nrf_clock_event_clear(NRF_CLOCK_EVENT_HFCLKSTARTED); nrf_clock_int_enable(NRF_CLOCK_INT_HF_STARTED_MASK); nrf_clock_task_trigger(NRF_CLOCK_TASK_HFCLKSTART); #else UNUSED_VARIABLE(sd_clock_hfclk_request()); #endif }
static void hfclk_start(void) { #ifdef SOFTDEVICE_PRESENT if (softdevice_handler_is_enabled()) { (void)sd_clock_hfclk_request(); return; } #endif // SOFTDEVICE_PRESENT nrf_clock_event_clear(NRF_CLOCK_EVENT_HFCLKSTARTED); nrf_clock_int_enable(NRF_CLOCK_INT_HF_STARTED_MASK); nrf_clock_task_trigger(NRF_CLOCK_TASK_HFCLKSTART); }
void OpenAdc(uint32_t uAdcNumber) { uint32_t p_is_running = 0; sd_clock_hfclk_request(); while(! p_is_running) { //wait for the hfclk to be available sd_clock_hfclk_is_running((&p_is_running)); } while (ADC_BUSY == NRF_ADC->EVENTS_END); NRF_ADC->CONFIG = (ADC_CONFIG_RES_10bit << ADC_CONFIG_RES_Pos) | (ADC_CONFIG_INPSEL_AnalogInputOneThirdPrescaling << ADC_CONFIG_INPSEL_Pos) | (ADC_CONFIG_REFSEL_VBG << ADC_CONFIG_REFSEL_Pos) | (uAdcNumber << ADC_CONFIG_PSEL_Pos); NRF_ADC->TASKS_START = 1; }
/** * @brief Function to trigger ADC sampling */ void adc_sample(void) { ret_code_t ret_code; uint32_t p_is_running = 0; ret_code = nrf_drv_adc_buffer_convert(adc_buffer, ADC_BUFFER_SIZE); // Allocate buffer for ADC APP_ERROR_CHECK(ret_code); //Request the external high frequency crystal for best ADC accuracy. For lowest current consumption, don't request the crystal. sd_clock_hfclk_request(); while(! p_is_running) { //wait for the hfclk to be available sd_clock_hfclk_is_running((&p_is_running)); } for (uint32_t i = 0; i < ADC_BUFFER_SIZE; i++) { while((NRF_ADC->BUSY & ADC_BUSY_BUSY_Msk) == ADC_BUSY_BUSY_Busy) {} //Wait until the ADC is finished sampling NRF_LOG_INFO("Start sampling ... \r\n"); nrf_drv_adc_sample(); // Trigger ADC conversion } }