rt-thread-official/bsp/gd32103c-eval/Libraries/GD32F1xx_standard_peripheral/Source/gd32f10x_dac.c

327 lines
10 KiB
C

/**
******************************************************************************
* @brief DAC functions of the firmware library.
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "gd32f10x_dac.h"
#include "gd32f10x_rcc.h"
/** @addtogroup GD32F10x_Firmware
* @{
*/
/** @defgroup DAC
* @brief DAC driver modules
* @{
*/
/** @defgroup DAC_Private_Defines
* @{
*/
/* CTLR register bits mask */
#define CTLR_BITS_CLEAR ((uint32_t)0x00000FFE)
/* DAC Dual Channels SWTRIG masks */
#define DUAL_SWTRIG_SET ((uint32_t)0x00000003)
/* DHR registers offsets */
#define DHR12R1_OFFSET ((uint32_t)0x00000008)
#define DHR12R2_OFFSET ((uint32_t)0x00000014)
#define DHR12RD_OFFSET ((uint32_t)0x00000020)
/* DOR register offset */
#define DOR_OFFSET ((uint32_t)0x0000002C)
/**
* @}
*/
/** @defgroup DAC_Private_Functions
* @{
*/
/**
* @brief Deinitialize the DAC peripheral registers.
* @param DAC_InitParaStruct: DAC_InitPara structure that contains the
* configuration information for the selected DAC channel.
* @retval None
*/
void DAC_DeInit(DAC_InitPara *DAC_InitParaStruct)
{
/* Enable DAC reset state */
RCC_APB1PeriphReset_Enable(RCC_APB1PERIPH_DACRST, ENABLE);
/* Release DAC from reset state */
RCC_APB1PeriphReset_Enable(RCC_APB1PERIPH_DACRST, DISABLE);
/* Initialize the DAC_Trigger */
DAC_InitParaStruct->DAC_Trigger = DAC_TRIGGER_NONE;
/* Initialize the DAC_WaveGeneration */
DAC_InitParaStruct->DAC_WaveType = DAC_WAVEGENE_NONE;
/* Initialize the DAC_LFSRUnmask_TriangleAmplitude */
DAC_InitParaStruct->DAC_LFSRNoise_AmplitudeTriangle = DAC_LFSR_BIT0;
/* Initialize the DAC_OutputBuffer */
DAC_InitParaStruct->DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;
}
/**
* @brief Initialize the DAC peripheral.
* @param DAC_Channel: the selected DAC channel.
* This parameter can be one of the following values:
* @arg DAC_Channel_1: select DAC Channel1
* @arg DAC_Channel_2: select DAC Channel2
* @param DAC_InitStruct: DAC_InitTypeDef structure .
* @retval None
*/
void DAC_Init(uint32_t DAC_Channel, DAC_InitPara *DAC_InitParaStruct)
{
uint32_t temp1 = 0, temp2 = 0;
/* DAC CTLR Configuration */
/* Get the DAC CTLR value */
temp1 = DAC->CTLR;
/* Clear BOFF, TEN, TSEL, WAVE and MAMP bits */
temp1 &= ~(CTLR_BITS_CLEAR << DAC_Channel);
/* Configure for the DAC channel: buffer output, trigger, wave generation,
mask/amplitude for wave generation */
/* Set TSEL and TEN bits according to DAC_Trigger */
/* Set WAVE bits according to DAC_WaveType */
/* Set MAMP bits according to DAC_LFSRNoise_AmplitudeTriangle */
/* Set BOFF bit according to DAC_OutputBuffer */
temp2 = (DAC_InitParaStruct->DAC_Trigger | DAC_InitParaStruct->DAC_OutputBuffer |
DAC_InitParaStruct->DAC_WaveType | DAC_InitParaStruct->DAC_LFSRNoise_AmplitudeTriangle);
/* Calculate CTLR register value */
temp1 |= temp2 << DAC_Channel;
/* Write to DAC CTLR */
DAC->CTLR = temp1;
}
/**
* @brief Enable or disable the DAC channel.
* @param DAC_Channel: the selected DAC channel.
* This parameter can be one of the following values:
* @arg DAC_Channel_1: select DAC Channel1.
* @arg DAC_Channel_2: select DAC Channel2.
* @param NewValue: New value of the DAC channel.
* This parameter can be: ENABLE or DISABLE.
* @retval None
*/
void DAC_Enable(uint32_t DAC_Channel, TypeState NewValue)
{
if (NewValue != DISABLE) {
/* Enable the selected DAC channel */
DAC->CTLR |= (DAC_CTLR_DEN1 << DAC_Channel) ;
} else {
/* Disable the selected DAC channel */
DAC->CTLR &= ~(DAC_CTLR_DEN1 << DAC_Channel);
}
}
/**
* @brief Enable or disable the selected DAC channel software trigger.
* @param DAC_Channel: the selected DAC channel.
* This parameter can be one of the following values:
* @arg DAC_Channel_1: select DAC Channel1
* @arg DAC_Channel_2: select DAC Channel2
* @param NewValue: New value of the selected DAC channel software trigger.
* This parameter can be: ENABLE or DISABLE.
* @retval None
*/
void DAC_SoftwareTrigger_Enable(uint32_t DAC_Channel, TypeState NewValue)
{
if (NewValue != DISABLE) {
/* Enable software trigger for DAC channel1 */
DAC->SWTR |= (uint32_t)DAC_SWTR_SWTR1 << (DAC_Channel >> 4);
} else {
/* Disable software trigger for DAC channel1 */
DAC->SWTR &= ~((uint32_t)DAC_SWTR_SWTR1 << (DAC_Channel >> 4));
}
}
/**
* @brief Enable or disable simultaneously the two DAC channels software
* triggers.
* @param NewValue: new value of the DAC channels software triggers.
* This parameter can be: ENABLE or DISABLE.
* @retval None
*/
void DAC_DualSoftwareTrigger_Enable(TypeState NewValue)
{
if (NewValue != DISABLE) {
/* Enable software trigger */
DAC->SWTR |= DUAL_SWTRIG_SET ;
} else {
/* Disable software trigger */
DAC->SWTR &= ~DUAL_SWTRIG_SET;
}
}
/**
* @brief Enable or disable the selected DAC channel wave generation.
* @param DAC_Channel: the selected DAC channel.
* This parameter can be one of the following values:
* @arg DAC_Channel_1: select DAC Channel1
* @arg DAC_Channel_2: select DAC Channel2
* @param DAC_Wave: the wave type to enable or disable.
* This parameter can be one of the following values:
* @arg DAC_WAVE_NOISE: noise wave generation
* @arg DAC_WAVE_TRIANGLE: triangle wave generation
* @param NewValue: new value of the selected DAC channel wave generation.
* This parameter can be: ENABLE or DISABLE.
* @retval None
*/
void DAC_WaveGeneration_Enable(uint32_t DAC_Channel, uint32_t DAC_Wave, TypeState NewValue)
{
if (NewValue != DISABLE) {
/* Enable the selected DAC channel wave generation */
DAC->CTLR |= DAC_Wave << DAC_Channel;
} else {
/* Disable the selected DAC channel wave generation */
DAC->CTLR &= ~(DAC_Wave << DAC_Channel);
}
}
/**
* @brief Set the specified data holding register value for DAC channel1.
* @param DAC_Align: the data alignment for DAC channel1.
* This parameter can be one of the following values:
* @arg DAC_ALIGN_8B_R: select 8bit right data alignment
* @arg DAC_ALIGN_12B_L: select 12bit left data alignment
* @arg DAC_ALIGN_12B_R: select 12bit right data alignment
* @param Data: Data to be loaded.
* @retval None
*/
void DAC_SetChannel1Data(uint32_t DAC_Align, uint16_t Data)
{
__IO uint32_t temp = 0;
temp = (uint32_t)DAC_BASE;
temp += DHR12R1_OFFSET + DAC_Align;
/* Set the DAC channel1 */
*(__IO uint32_t *) temp = Data;
}
/**
* @brief Set the specified data holding register value for DAC channel2.
* @param DAC_Align: the data alignment for DAC channel2.
* This parameter can be one of the following values:
* @arg DAC_ALIGN_8B_R: select 8bit right data alignment
* @arg DAC_ALIGN_12B_L: select 12bit left data alignment
* @arg DAC_ALIGN_12B_R: select 12bit right data alignment
* @param Data: Data to be loaded.
* @retval None
*/
void DAC_SetChannel2Data(uint32_t DAC_Align, uint16_t Data)
{
__IO uint32_t temp = 0;
temp = (uint32_t)DAC_BASE;
temp += DHR12R2_OFFSET + DAC_Align;
/* Set the DAC channel2 */
*(__IO uint32_t *) temp = Data;
}
/**
* @brief Set the specified data for dual channel
* @param DAC_Align: the data alignment for dual channel DAC.
* This parameter can be one of the following values:
* @arg DAC_Align_8b_R: select 8bit right data alignment
* @arg DAC_Align_12b_L: select 12bit left data alignment
* @arg DAC_Align_12b_R: select 12bit right data alignment
* @param Data2: Data for DAC Channel2.
* @param Data1: Data for DAC Channel1.
* @retval None
*/
void DAC_SetDualChannelData(uint32_t DAC_Align, uint16_t Data2, uint16_t Data1)
{
uint32_t data = 0, temp = 0;
/* set dual DAC data holding register value */
if (DAC_Align == DAC_ALIGN_8B_R) {
data = ((uint32_t)Data2 << 8) | Data1;
} else {
data = ((uint32_t)Data2 << 16) | Data1;
}
temp = (uint32_t)DAC_BASE;
temp += DHR12RD_OFFSET + DAC_Align;
/* Set the dual DAC selected data holding register */
*(__IO uint32_t *)temp = data;
}
/**
* @brief Return the last data output value.
* @param DAC_Channel: the selected DAC channel.
* This parameter can be one of the following values:
* @arg DAC_Channel_1: select DAC Channel1
* @arg DAC_Channel_2: select DAC Channel2
* @retval The DAC channel1 data output value.
*/
uint16_t DAC_GetDataOutputValue(uint32_t DAC_Channel)
{
__IO uint32_t temp = 0;
temp = (uint32_t) DAC_BASE;
temp += DOR_OFFSET + ((uint32_t)DAC_Channel >> 2);
/* Returns the DAC channel data */
return (uint16_t)(*(__IO uint32_t *) temp);
}
/**
* @brief Enable or disable DMA request.
* @param DAC_Channel: the selected DAC channel.
* This parameter can be one of the following values:
* @arg DAC_Channel_1: select DAC Channel1
* @arg DAC_Channel_2: select DAC Channel2
* @param NewValue: New value of the selected DAC channel DMA request.
* This parameter can be: ENABLE or DISABLE.
* @retval None
*/
void DAC_DMA_Enable(uint32_t DAC_Channel, TypeState NewValue)
{
if (NewValue != DISABLE) {
/* Enable DMA request */
DAC->CTLR |= (DAC_CTLR_DDMAEN1 << DAC_Channel);
} else {
/* Disable DMA request */
DAC->CTLR &= ~(DAC_CTLR_DDMAEN1 << DAC_Channel);
}
}
/**
* @brief Enable or disable the specified DAC interrupts.
* @param DAC_Channel: the selected DAC channel.
* This parameter can be one of the following values:
* @arg DAC_Channel_1: DAC Channel1 selected
* @arg DAC_Channel_2: DAC Channel2 selected
* @param NewValue: Alternative state of the specified DAC interrupts.
* This parameter can be: ENABLE or DISABLE.
* @retval None
*/
void DAC_INTConfig(uint32_t DAC_Channel, TypeState NewValue)
{
if (NewValue != DISABLE) {
/* Enable the DAC DMAUDR interrupts */
DAC->CTLR |= (DAC_INT_DMAUDR << DAC_Channel);
} else {
/* Disable the DAC DMAUDR interrupts */
DAC->CTLR &= (~(uint32_t)(DAC_INT_DMAUDR << DAC_Channel));
}
}
/**
* @}
*/
/**
* @}
*/
/**
* @}
*/