/* dac_init * * Initialize the DAC. This must be called once after reset. */ void COLD dac_init() { /* Turn on the PWM and timer peripherals. */ CLKPWR_ConfigPPWR(CLKPWR_PCONP_PCPWM1, ENABLE); CLKPWR_SetPCLKDiv(CLKPWR_PCLKSEL_PWM1, CLKPWR_PCLKSEL_CCLK_DIV_4); /* Set up the SSP to communicate with the DAC, and initialize to 0 */ hw_dac_init(); /* ... and LDAC on the PWM peripheral */ LPC_PINCON->PINSEL4 |= (1 << 8); /* Get the pin set up to produce a low LDAC puslse */ LPC_GPIO2->FIODIR |= (1 << 4); LPC_GPIO2->FIOCLR = (1 << 4); /* The PWM peripheral is used to generate LDAC pulses. Set it up, * but hold it in reset until go time. */ LPC_PWM1->TCR = PWM_TCR_COUNTER_RESET | PWM_TCR_COUNTER_ENABLE; /* Reset on match channel 0 */ LPC_PWM1->MCR = PWM_MCR_RESET_ON_MATCH(0) | PWM_MCR_INT_ON_MATCH(0); /* Enable single-edge PWM on channel 5 */ LPC_PWM1->PCR = PWM_PCR_PWMENAn(5); /* The match registers themselves will be set by dac_start(). */ /* Enable the write-to-DAC interrupt with the highest priority. */ NVIC_SetPriority(PWM1_IRQn, 0); NVIC_EnableIRQ(PWM1_IRQn); dac_control.state = DAC_IDLE; dac_control.irq_do = IRQ_DO_PANIC; dac_control.count = 0; dac_current_pps = 0; dac_control.color_control.word = 0; delay_line_reset(); dac_control.red_gain = COORD_MAX; dac_control.green_gain = COORD_MAX; dac_control.blue_gain = COORD_MAX; if (hw_dac_16bit) { memcpy(PWM1_IRQHandler, goto_dac16_handle_irq, goto_dac16_handle_irq_end - goto_dac16_handle_irq); } }
/*********************************************************************//** * @brief Configures match for PWM peripheral * @param[in] PWMx PWM peripheral selected, should be LPC_PWM1 * @param[in] PWM_MatchConfigStruct Pointer to a PWM_MATCHCFG_Type structure * that contains the configuration information for the * specified PWM match function. * @return None **********************************************************************/ void PWM_ConfigMatch(LPC_PWM_TypeDef *PWMx, PWM_MATCHCFG_Type *PWM_MatchConfigStruct) { CHECK_PARAM(PARAM_PWMx(PWMx)); CHECK_PARAM(PARAM_PWM1_MATCH_CHANNEL(PWM_MatchConfigStruct->MatchChannel)); CHECK_PARAM(PARAM_FUNCTIONALSTATE(PWM_MatchConfigStruct->IntOnMatch)); CHECK_PARAM(PARAM_FUNCTIONALSTATE(PWM_MatchConfigStruct->ResetOnMatch)); CHECK_PARAM(PARAM_FUNCTIONALSTATE(PWM_MatchConfigStruct->StopOnMatch)); //interrupt on MRn if (PWM_MatchConfigStruct->IntOnMatch == ENABLE) { PWMx->MCR |= PWM_MCR_INT_ON_MATCH(PWM_MatchConfigStruct->MatchChannel); } else { PWMx->MCR &= (~PWM_MCR_INT_ON_MATCH(PWM_MatchConfigStruct->MatchChannel)) \ & PWM_MCR_BITMASK; } //reset on MRn if (PWM_MatchConfigStruct->ResetOnMatch == ENABLE) { PWMx->MCR |= PWM_MCR_RESET_ON_MATCH(PWM_MatchConfigStruct->MatchChannel); } else { PWMx->MCR &= (~PWM_MCR_RESET_ON_MATCH(PWM_MatchConfigStruct->MatchChannel)) \ & PWM_MCR_BITMASK; } //stop on MRn if (PWM_MatchConfigStruct->StopOnMatch == ENABLE) { PWMx->MCR |= PWM_MCR_STOP_ON_MATCH(PWM_MatchConfigStruct->MatchChannel); } else { PWMx->MCR &= (~PWM_MCR_STOP_ON_MATCH(PWM_MatchConfigStruct->MatchChannel)) \ & PWM_MCR_BITMASK; } }
/*********************************************************************//** * @brief Configures match for PWM peripheral * @param[in] pwmId The Id of the expected PWM component * * @param[in] PWM_MatchConfigStruct Pointer to a PWM_MATCHCFG_Type structure * that contains the configuration information for the * specified PWM match function. * @return None **********************************************************************/ void PWM_ConfigMatch(uint8_t pwmId, PWM_MATCHCFG_Type *PWM_MatchConfigStruct) { LPC_PWM_TypeDef* pPwm = PWM_GetPointer(pwmId); //interrupt on MRn if (PWM_MatchConfigStruct->IntOnMatch == ENABLE) { pPwm->MCR |= PWM_MCR_INT_ON_MATCH(PWM_MatchConfigStruct->MatchChannel); } else { pPwm->MCR &= (~ PWM_MCR_INT_ON_MATCH(PWM_MatchConfigStruct->MatchChannel)) \ & PWM_MCR_BITMASK; } //reset on MRn if (PWM_MatchConfigStruct->ResetOnMatch == ENABLE) { pPwm->MCR |= PWM_MCR_RESET_ON_MATCH(PWM_MatchConfigStruct->MatchChannel); } else { pPwm->MCR &= (~ PWM_MCR_RESET_ON_MATCH(PWM_MatchConfigStruct->MatchChannel)) \ & PWM_MCR_BITMASK; } //stop on MRn if (PWM_MatchConfigStruct->StopOnMatch == ENABLE) { pPwm->MCR |= PWM_MCR_STOP_ON_MATCH(PWM_MatchConfigStruct->MatchChannel); } else { pPwm->MCR &= (~ PWM_MCR_STOP_ON_MATCH(PWM_MatchConfigStruct->MatchChannel)) \ & PWM_MCR_BITMASK; } }