/* API to configure direction function */ void XMC_CCU4_SLICE_DirectionConfig(XMC_CCU4_SLICE_t *const slice, const XMC_CCU4_SLICE_EVENT_t event) { uint32_t cmc; XMC_ASSERT("XMC_CCU4_SLICE_DirectionConfig:Invalid Slice Pointer", XMC_CCU4_CHECK_SLICE_PTR(slice)); XMC_ASSERT("XMC_CCU4_SLICE_DirectionConfig:Invalid Event ID", XMC_CCU4_SLICE_CHECK_EVENT_ID(event)); /* Bind the event with the direction function */ cmc = slice->CMC; cmc &= ~((uint32_t) CCU4_CC4_CMC_UDS_Msk); cmc |= ((uint32_t) event) << CCU4_CC4_CMC_UDS_Pos; slice->CMC = cmc; }
/* API to configure a slice trigger event */ void XMC_CCU4_SLICE_ConfigureEvent(XMC_CCU4_SLICE_t *const slice, const XMC_CCU4_SLICE_EVENT_t event, const XMC_CCU4_SLICE_EVENT_CONFIG_t *const config) { uint32_t ins; uint8_t pos; uint8_t offset; XMC_ASSERT("XMC_CCU4_SLICE_ConfigureEvent:Invalid Slice Pointer", XMC_CCU4_CHECK_SLICE_PTR(slice)); XMC_ASSERT("XMC_CCU4_SLICE_ConfigureEvent:Invalid Event ID", XMC_CCU4_SLICE_CHECK_EVENT_ID(event)); XMC_ASSERT("XMC_CCU4_SLICE_ConfigureEvent:Invalid Input", XMC_CCU4_SLICE_CHECK_INPUT(config->mapped_input)); XMC_ASSERT("XMC_CCU4_SLICE_ConfigureEvent:Invalid Edge Sensitivity", XMC_CCU4_SLICE_CHECK_EDGE_SENSITIVITY(config->edge)); XMC_ASSERT("XMC_CCU4_SLICE_ConfigureEvent:Invalid Level Sensitivity", ((config->level == XMC_CCU4_SLICE_EVENT_LEVEL_SENSITIVITY_ACTIVE_HIGH) ||\ (config->level == XMC_CCU4_SLICE_EVENT_LEVEL_SENSITIVITY_ACTIVE_LOW))); XMC_ASSERT("XMC_CCU4_SLICE_ConfigureEvent:Invalid Debounce Period", XMC_CCU4_SLICE_CHECK_EVENT_FILTER(config->duration)); ins = slice->INS; /* Calculate offset with reference to event */ offset = ((uint8_t) event) - 1U; /* First, configure the edge sensitivity */ pos = ((uint8_t) CCU4_CC4_INS_EV0EM_Pos) + (uint8_t)(offset << 1U); ins &= ~(((uint32_t) XMC_CCU4_SLICE_EVENT_EDGE_CONFIG_MASK) << pos); ins |= ((uint32_t) config->edge) << pos; /* Next, the level */ pos = ((uint8_t) CCU4_CC4_INS_EV0LM_Pos) + offset; ins &= ~(((uint32_t) XMC_CCU4_SLICE_EVENT_LEVEL_CONFIG_MASK) << pos); ins |= ((uint32_t) config->level) << pos; /* Next, the debounce filter */ pos = ((uint8_t) CCU4_CC4_INS_LPF0M_Pos) + (uint8_t)(offset << 1U); ins &= ~(((uint32_t) XMC_CCU4_SLICE_EVENT_FILTER_CONFIG_MASK) << pos); ins |= ((uint32_t) config->duration) << pos; /* Finally the input */ pos = ((uint8_t) CCU4_CC4_INS_EV0IS_Pos) + (uint8_t)(offset << 2U); ins &= ~(((uint32_t) XMC_CCU4_SLICE_EVENT_INPUT_CONFIG_MASK) << pos); ins |= ((uint32_t) config->mapped_input) << pos; slice->INS = ins; }
/* API to configure the slice modulation function */ void XMC_CCU4_SLICE_ModulationConfig(XMC_CCU4_SLICE_t *const slice, const XMC_CCU4_SLICE_EVENT_t event, const XMC_CCU4_SLICE_MODULATION_MODE_t mod_mode, const bool synch_with_pwm) { uint32_t cmc; uint32_t tc; XMC_ASSERT("XMC_CCU4_SLICE_ModulationConfig:Invalid Slice Pointer", XMC_CCU4_IsValidSlice(slice)); XMC_ASSERT("XMC_CCU4_SLICE_ModulationConfig:Invalid Event ID", XMC_CCU4_SLICE_CHECK_EVENT_ID(event)); XMC_ASSERT("XMC_CCU4_SLICE_ModulationConfig:Invalid Modulation Mode", ((mod_mode == XMC_CCU4_SLICE_MODULATION_MODE_CLEAR_OUT) ||\ (mod_mode == XMC_CCU4_SLICE_MODULATION_MODE_CLEAR_ST_OUT))); tc = slice->TC; cmc = slice->CMC; /* First, Bind the event with the modulation function */ cmc &= ~((uint32_t) CCU4_CC4_CMC_MOS_Msk); cmc |= ((uint32_t) event) << CCU4_CC4_CMC_MOS_Pos; slice->CMC = cmc; /* Next, Modulation mode */ if (mod_mode == XMC_CCU4_SLICE_MODULATION_MODE_CLEAR_OUT) { tc |= (uint32_t) CCU4_CC4_TC_EMT_Msk; } else { tc &= ~((uint32_t) CCU4_CC4_TC_EMT_Msk); } /* Synchronization of modulation effect with PWM cycle */ if (synch_with_pwm == (bool) true) { tc |= (uint32_t) CCU4_CC4_TC_EMS_Msk; } else { tc &= ~((uint32_t) CCU4_CC4_TC_EMS_Msk); } slice->TC = tc; }
/* API to bind an input to a slice trigger event */ void XMC_CCU4_SLICE_SetInput(XMC_CCU4_SLICE_t *const slice, const XMC_CCU4_SLICE_EVENT_t event, const XMC_CCU4_SLICE_INPUT_t input) { uint32_t ins; uint8_t pos; uint8_t offset; XMC_ASSERT("XMC_CCU4_SLICE_SetInput:Invalid Slice Pointer", XMC_CCU4_CHECK_SLICE_PTR(slice)); XMC_ASSERT("XMC_CCU4_SLICE_SetInput:Invalid Event ID", XMC_CCU4_SLICE_CHECK_EVENT_ID(event)); XMC_ASSERT("XMC_CCU4_SLICE_SetInput:Invalid Input", XMC_CCU4_SLICE_CHECK_INPUT(input)); /* Calculate offset with reference to event */ offset = ((uint8_t) event) - 1U; pos = ((uint8_t) CCU4_CC4_INS_EV0IS_Pos) + (uint8_t) (offset << 2U); ins = slice->INS; ins &= ~(((uint32_t) XMC_CCU4_SLICE_EVENT_INPUT_CONFIG_MASK) << pos); ins |= ((uint32_t) input) << pos; slice->INS = ins; }