diff --git a/include/libopencm3/stm32/common/dac_common_all.h b/include/libopencm3/stm32/common/dac_common_all.h index c93b9dbc..069d6a65 100644 --- a/include/libopencm3/stm32/common/dac_common_all.h +++ b/include/libopencm3/stm32/common/dac_common_all.h @@ -100,7 +100,7 @@ specific memorymap.h header before including this header file.*/ /** DMAEN2: DAC channel2 DMA enable */ #define DAC_CR_DMAEN2 (1 << 28) -/** MAMP2[3:0]: DAC channel2 mask/amplitude selector */ +/** MAMP2[3:0]: DAC channel2 mask/amplitude selector field position */ #define DAC_CR_MAMP2_SHIFT 24 /** WAVE2[1:0]: DAC channel2 noise/triangle wave generation enable */ @@ -118,8 +118,10 @@ specific memorymap.h header before including this header file.*/ /** DMAEN1: DAC channel1 DMA enable */ #define DAC_CR_DMAEN1 (1 << 12) -/** MAMP1[3:0]: DAC channel1 mask/amplitude selector */ +/** MAMP1[3:0]: DAC channel1 mask/amplitude selector field position */ #define DAC_CR_MAMP1_SHIFT 8 +/** MAMP Mask/Amplitude selector field size */ +#define DAC_CR_MAMPx_MASK 0xf /** WAVEn[1:0]: DAC channel1 noise/triangle wave generation enable */ #define DAC_CR_WAVE1_SHIFT 6 @@ -257,7 +259,7 @@ void dac_trigger_disable(uint32_t dac, int channel); void dac_set_trigger_source(uint32_t dac, uint32_t source); void dac_set_waveform_generation(uint32_t dac, enum dac_wave wave); void dac_disable_waveform_generation(uint32_t dac, int channel); -void dac_set_waveform_characteristics(uint32_t dac, uint8_t mamp); +void dac_set_waveform_characteristics(uint32_t dac, int channel, int mamp); void dac_load_data_buffer_single(uint32_t dac, uint16_t data, enum dac_align align, int channel); void dac_load_data_buffer_dual(uint32_t dac, uint16_t data1, uint16_t data2, diff --git a/lib/stm32/common/dac_common_all.c b/lib/stm32/common/dac_common_all.c index bc26ef74..6b88d10a 100644 --- a/lib/stm32/common/dac_common_all.c +++ b/lib/stm32/common/dac_common_all.c @@ -347,12 +347,31 @@ become read-only. @note The DAC trigger must be enabled for this to work. @param[in] dac the base address of the DAC. @ref dac_reg_base -@param[in] mamp uint8_t. Taken from @ref dac_mamp2 or @ref dac_mamp1 or a -logical OR of one of each of these to set both channels simultaneously. +@param[in] channel one or both, select from @ref dac_channel_id +@param[in] mamp amplitude of mixed waveform, bit width @ref DAC_CR_MAMPx_MASK */ -void dac_set_waveform_characteristics(uint32_t dac, uint8_t mamp) +void dac_set_waveform_characteristics(uint32_t dac, int channel, int mamp) { - DAC_CR(dac) |= mamp; + uint32_t reg = DAC_CR(dac); + switch(channel) { + case DAC_CHANNEL1: + reg &= ~(DAC_CR_MAMPx_MASK << DAC_CR_MAMP1_SHIFT); + reg |= mamp << DAC_CR_MAMP1_SHIFT; + break; + case DAC_CHANNEL2: + reg &= ~(DAC_CR_MAMPx_MASK << DAC_CR_MAMP2_SHIFT); + reg |= mamp << DAC_CR_MAMP2_SHIFT; + break; + case DAC_CHANNEL_BOTH: + reg &= ~(DAC_CR_MAMPx_MASK << DAC_CR_MAMP1_SHIFT) + | ~(DAC_CR_MAMPx_MASK << DAC_CR_MAMP2_SHIFT); + reg |= mamp << DAC_CR_MAMP1_SHIFT; + reg |= mamp << DAC_CR_MAMP2_SHIFT; + break; + default: + break; + } + DAC_CR(dac) = reg; } /** @brief Load DAC Data Register.