stm32:dac: new api for waveform characteristics

Old API required users to manually construct bit maps frm opaquely named
defines, with little help.  It also was a pure OR operation, with no way
to ever clear bits.

Signed-off-by: Karl Palsson <karlp@tweak.net.au>
This commit is contained in:
Karl Palsson 2021-01-24 22:49:33 +00:00
parent da9db7f1f5
commit 8295d248e0
2 changed files with 28 additions and 7 deletions

View File

@ -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,

View File

@ -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.