nrfx_err_t nrfx_rtc_cc_disable(nrfx_rtc_t const * const p_instance, uint32_t channel) { NRFX_ASSERT(m_cb[p_instance->instance_id].state != NRFX_DRV_STATE_UNINITIALIZED); NRFX_ASSERT(channel<p_instance->cc_channel_count); nrfx_err_t err_code; uint32_t int_mask = RTC_CHANNEL_INT_MASK(channel); nrf_rtc_event_t event = RTC_CHANNEL_EVENT_ADDR(channel); nrf_rtc_event_disable(p_instance->p_reg,int_mask); if (nrf_rtc_int_is_enabled(p_instance->p_reg,int_mask)) { nrf_rtc_int_disable(p_instance->p_reg,int_mask); if (nrf_rtc_event_pending(p_instance->p_reg,event)) { nrf_rtc_event_clear(p_instance->p_reg,event); err_code = NRFX_ERROR_TIMEOUT; NRFX_LOG_WARNING("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); return err_code; } } NRFX_LOG_INFO("RTC id: %d, channel disabled: %lu.", p_instance->instance_id, channel); err_code = NRFX_SUCCESS; NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); return err_code; }
static void rtc1_handler(nrf_drv_rtc_int_type_t int_type) { // uint32_t err_code; if (int_type == NRF_DRV_RTC_INT_COMPARE0) { // Interrupt from COMPARE0 event. nrf_gpio_pin_set(led_pin1); nrf_drv_rtc_int_enable(&rtc1, RTC_CHANNEL_INT_MASK(0)); } else if (int_type == NRF_DRV_RTC_INT_COMPARE1) { // Interrupt from COMPARE1 event. nrf_gpio_pin_clear(led_pin1); nrf_drv_rtc_int_enable(&rtc1, RTC_CHANNEL_INT_MASK(1)); } else if (int_type == NRF_DRV_RTC_INT_COMPARE2) { // Interrupt from COMPARE2 event. nrf_drv_rtc_counter_clear(&rtc1); nrf_drv_rtc_int_enable(&rtc1, RTC_CHANNEL_INT_MASK(2)); } else if (int_type == NRF_DRV_RTC_INT_TICK) { // Tick off nrf_gpio_pin_toggle(led_pin1); } }
nrfx_err_t nrfx_rtc_cc_set(nrfx_rtc_t const * const p_instance, uint32_t channel, uint32_t val, bool enable_irq) { NRFX_ASSERT(m_cb[p_instance->instance_id].state != NRFX_DRV_STATE_UNINITIALIZED); NRFX_ASSERT(channel<p_instance->cc_channel_count); nrfx_err_t err_code; uint32_t int_mask = RTC_CHANNEL_INT_MASK(channel); nrf_rtc_event_t event = RTC_CHANNEL_EVENT_ADDR(channel); nrf_rtc_event_disable(p_instance->p_reg, int_mask); nrf_rtc_int_disable(p_instance->p_reg, int_mask); val = RTC_WRAP(val); if (m_cb[p_instance->instance_id].reliable) { nrf_rtc_cc_set(p_instance->p_reg,channel,val); uint32_t cnt = nrf_rtc_counter_get(p_instance->p_reg); int32_t diff = cnt - val; if (cnt < val) { diff += RTC_COUNTER_COUNTER_Msk; } if (diff < m_cb[p_instance->instance_id].tick_latency) { err_code = NRFX_ERROR_TIMEOUT; NRFX_LOG_WARNING("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); return err_code; } } else { nrf_rtc_cc_set(p_instance->p_reg,channel,val); } if (enable_irq) { nrf_rtc_event_clear(p_instance->p_reg,event); nrf_rtc_int_enable(p_instance->p_reg, int_mask); } nrf_rtc_event_enable(p_instance->p_reg,int_mask); NRFX_LOG_INFO("RTC id: %d, channel enabled: %lu, compare value: %lu.", p_instance->instance_id, channel, val); err_code = NRFX_SUCCESS; NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code)); return err_code; }
static void rtc1_handler(nrf_drv_rtc_int_type_t int_type) { // uint32_t err_code; NRF_LOG_DEBUG("rtc1_handler %d %u\n\r",int_type,pos); if (int_type == NRF_DRV_RTC_INT_COMPARE0) { // Interrupt from COMPARE0 event. uint16_t temp; nrf_gpio_pin_toggle(led_pin1); if (pos%2==0) { max6675_prepare(&max6675_config); } else { temp=max6675_readcelsius(&max6675_config); NRF_LOG_INFO("rtc1_handler temp \x1B[1;32m%u\x1B[0m,\x1B[1;31m%d\x1B[0m \r",temp>>2,(temp&0x0003)*25); } nrf_drv_rtc_int_enable(&rtc1, RTC_CHANNEL_INT_MASK(0)); nrf_drv_rtc_counter_clear(&rtc1); }
ret_code_t nrf_drv_rtc_cc_set(nrf_drv_rtc_t const * const p_instance, uint32_t channel, uint32_t val, bool enable_irq) { ASSERT(m_cb[p_instance->instance_id].state != NRF_DRV_STATE_UNINITIALIZED); ASSERT(channel<p_instance->cc_channel_count); uint32_t int_mask = RTC_CHANNEL_INT_MASK(channel); nrf_rtc_event_t event = RTC_CHANNEL_EVENT_ADDR(channel); nrf_rtc_event_disable(p_instance->p_reg, int_mask); nrf_rtc_int_disable(p_instance->p_reg, int_mask); val = RTC_WRAP(val); if (m_cb[p_instance->instance_id].reliable) { nrf_rtc_cc_set(p_instance->p_reg,channel,val); uint32_t cnt = nrf_rtc_counter_get(p_instance->p_reg); int32_t diff = cnt - val; if (cnt < val) { diff += RTC_COUNTER_COUNTER_Msk; } if (diff < m_cb[p_instance->instance_id].tick_latency) { return NRF_ERROR_TIMEOUT; } } else { nrf_rtc_cc_set(p_instance->p_reg,channel,val); } if (enable_irq) { nrf_rtc_event_clear(p_instance->p_reg,event); nrf_rtc_int_enable(p_instance->p_reg, int_mask); } nrf_rtc_event_enable(p_instance->p_reg,int_mask); return NRF_SUCCESS; }
ret_code_t nrf_drv_rtc_cc_disable(nrf_drv_rtc_t const * const p_instance, uint32_t channel) { ASSERT(m_cb[p_instance->instance_id].state != NRF_DRV_STATE_UNINITIALIZED); ASSERT(channel<p_instance->cc_channel_count); uint32_t int_mask = RTC_CHANNEL_INT_MASK(channel); nrf_rtc_event_t event = RTC_CHANNEL_EVENT_ADDR(channel); nrf_rtc_event_disable(p_instance->p_reg,int_mask); if (nrf_rtc_int_is_enabled(p_instance->p_reg,int_mask)) { nrf_rtc_int_disable(p_instance->p_reg,int_mask); if (nrf_rtc_event_pending(p_instance->p_reg,event)) { nrf_rtc_event_clear(p_instance->p_reg,event); return NRF_ERROR_TIMEOUT; } } return NRF_SUCCESS; }