/** * @brief Configures and activates the DAC peripheral. * * @param[in] dacp pointer to the @p DACDriver object * * @notapi */ void dac_lld_start(DACDriver *dacp) { /* If the driver is in DAC_STOP state then a full initialization is required.*/ if (dacp->state == DAC_STOP) { /* Enabling the clock source.*/ #if STM32_DAC_USE_DAC1_CH1 if (&DACD1 == dacp) { rccEnableDAC1(false); } #endif #if STM32_DAC_USE_DAC1_CH2 if (&DACD2 == dacp) { rccEnableDAC1(false); } #endif #if STM32_DAC_USE_DAC2_CH1 if (&DACD3 == dacp) { rccEnableDAC2(false); } #endif #if STM32_DAC_USE_DAC2_CH2 if (&DACD3 == dacp) { rccEnableDAC2(false); } #endif /* Enabling DAC in SW triggering mode initially, initializing data to zero.*/ #if STM32_DAC_DUAL_MODE == FALSE dacp->params->dac->CR &= dacp->params->regmask; dacp->params->dac->CR |= DAC_CR_EN1 << dacp->params->regshift; dac_lld_put_channel(dacp, 0U, dacp->config->init); #else if ((dacp->config->datamode == DAC_DHRM_12BIT_RIGHT_DUAL) || (dacp->config->datamode == DAC_DHRM_12BIT_LEFT_DUAL) || (dacp->config->datamode == DAC_DHRM_8BIT_RIGHT_DUAL)) { dacp->params->dac->CR = DAC_CR_EN2 | DAC_CR_EN1; dac_lld_put_channel(dacp, 1U, dacp->config->init); } else { dacp->params->dac->CR = DAC_CR_EN1; } dac_lld_put_channel(dacp, 0U, dacp->config->init); #endif } }
/** * @brief Outputs a value directly on a DAC channel. * * @param[in] dacp pointer to the @p DACDriver object * @param[in] channel DAC channel number * @param[in] sample value to be output * * @xclass */ void dacPutChannelX(DACDriver *dacp, dacchannel_t channel, dacsample_t sample) { osalDbgCheck(channel < DAC_MAX_CHANNELS); osalDbgAssert(dacp->state == DAC_READY, "invalid state"); dac_lld_put_channel(dacp, channel, sample); }