mirror of
https://gitee.com/Lyon1998/pikapython.git
synced 2025-01-29 17:22:56 +08:00
362 lines
14 KiB
C
362 lines
14 KiB
C
/*
|
|
* Copyright 2021 MindMotion Microelectronics Co., Ltd.
|
|
* All rights reserved.
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
|
|
#ifndef __HAL_DAC_H__
|
|
#define __HAL_DAC_H__
|
|
|
|
#include "hal_common.h"
|
|
|
|
/*!
|
|
* @addtogroup DAC
|
|
* @{
|
|
*/
|
|
|
|
/*!
|
|
* @brief DAC driver version number.
|
|
*/
|
|
#define DAC_DRIVER_VERSION 0u /*!< dac_0. */
|
|
|
|
/*!
|
|
* @addtogroup DAC_CHANNEL_SELECTION
|
|
* @{
|
|
*/
|
|
#define DAC_CHN_NUM (2u) /*!< The total number of DAC channel. */
|
|
#define DAC_CHN_1 (0u) /*!< The selection of DAC Channel 1. */
|
|
#define DAC_CHN_2 (1u) /*!< The selection of DAC Channel 2. */
|
|
/*!
|
|
*@}
|
|
*/
|
|
|
|
/*!
|
|
* @brief DAC align type.
|
|
*/
|
|
typedef enum
|
|
{
|
|
DAC_Align_8b_Dual = 0u, /*!< The selection of dual channel data alignment of 8b right. */
|
|
DAC_Align_8b_Right = 1u, /*!< The selection of single channel data alignment of 8b right. */
|
|
DAC_Align_12b_Left = 2u, /*!< The selection of single channel data alignment of 12b left. */
|
|
DAC_Align_12b_Right = 3u, /*!< The selection of single channel data alignment of 12b right. */
|
|
DAC_Align_12b_Dual_Left = 4u, /*!< The selection of dual channel data alignment of 12b left. */
|
|
DAC_Align_12b_Dual_Right = 5u, /*!< The selection of dual channel data alignment of 12b right. */
|
|
} DAC_Align_Type;
|
|
|
|
/*!
|
|
* @brief DAC LFSR unmask bit selector type for adding noise wave.
|
|
*/
|
|
typedef enum
|
|
{
|
|
DAC_AddNoise_LFSRUnMask_0 = 0u, /*!< Unmask DAC channel LFSR bit0. */
|
|
DAC_AddNoise_LFSRUnMask_1 = 1u, /*!< Unmask DAC channel LFSR bit[1:0]. */
|
|
DAC_AddNoise_LFSRUnMask_2 = 2u, /*!< Unmask DAC channel LFSR bit[2:0]. */
|
|
DAC_AddNoise_LFSRUnMask_3 = 3u, /*!< Unmask DAC channel LFSR bit[3:0]. */
|
|
DAC_AddNoise_LFSRUnMask_4 = 4u, /*!< Unmask DAC channel LFSR bit[4:0]. */
|
|
DAC_AddNoise_LFSRUnMask_5 = 5u, /*!< Unmask DAC channel LFSR bit[5:0]. */
|
|
DAC_AddNoise_LFSRUnMask_6 = 6u, /*!< Unmask DAC channel LFSR bit[6:0]. */
|
|
DAC_AddNoise_LFSRUnMask_7 = 7u, /*!< Unmask DAC channel LFSR bit[7:0]. */
|
|
DAC_AddNoise_LFSRUnMask_8 = 8u, /*!< Unmask DAC channel LFSR bit[8:0]. */
|
|
DAC_AddNoise_LFSRUnMask_9 = 9u, /*!< Unmask DAC channel LFSR bit[9:0]. */
|
|
DAC_AddNoise_LFSRUnMask_10 = 10u, /*!< Unmask DAC channel LFSR bit[10:0]. */
|
|
DAC_AddNoise_LFSRUnMask_11 = 11u, /*!< Unmask DAC channel LFSR bit[11:0]. */
|
|
} DAC_AddNoise_Type;
|
|
|
|
/*!
|
|
* @brief DAC triangle amplitude selector type for adding triangle wave.
|
|
*/
|
|
typedef enum
|
|
{
|
|
DAC_AddTriangle_LFSRAmplitude_1 = 0u, /*!< Max triangle amplitude of 1. */
|
|
DAC_AddTriangle_LFSRAmplitude_3 = 1u, /*!< Max triangle amplitude of 3. */
|
|
DAC_AddTriangle_LFSRAmplitude_7 = 2u, /*!< Max triangle amplitude of 7. */
|
|
DAC_AddTriangle_LFSRAmplitude_15 = 3u, /*!< Max triangle amplitude of 15. */
|
|
DAC_AddTriangle_LFSRAmplitude_31 = 4u, /*!< Max triangle amplitude of 31. */
|
|
DAC_AddTriangle_LFSRAmplitude_63 = 5u, /*!< Max triangle amplitude of 63. */
|
|
DAC_AddTriangle_LFSRAmplitude_127 = 6u, /*!< Max triangle amplitude of 127. */
|
|
DAC_AddTriangle_LFSRAmplitude_255 = 7u, /*!< Max triangle amplitude of 255. */
|
|
DAC_AddTriangle_LFSRAmplitude_511 = 8u, /*!< Max triangle amplitude of 511. */
|
|
DAC_AddTriangle_LFSRAmplitude_1023 = 9u, /*!< Max triangle amplitude of 1023. */
|
|
DAC_AddTriangle_LFSRAmplitude_2047 = 10u, /*!< Max triangle amplitude of 2047. */
|
|
DAC_AddTriangle_LFSRAmplitude_4095 = 11u, /*!< Max triangle amplitude of 4095. */
|
|
} DAC_AddTriangle_Type;
|
|
|
|
/*!
|
|
* @brief This type of structure instance is used to keep the settings when calling the @ref DAC_EnableAddNoise() to initialize the DAC noise wave generation.
|
|
*/
|
|
typedef struct
|
|
{
|
|
DAC_AddNoise_Type AddNoise; /*!< Specify the noise wave pattern. */
|
|
} DAC_AddNoise_Init_Type;
|
|
|
|
/*!
|
|
* @brief This type of structure instance is used to keep the settings when calling the @ref DAC_EnableAddTriangle() to initialize the DAC triangle wave generation.
|
|
*/
|
|
typedef struct
|
|
{
|
|
DAC_AddTriangle_Type AddTriangle; /*!< Specify the triangle wave pattern. */
|
|
} DAC_AddTriangle_Init_Type;
|
|
|
|
/*!
|
|
* @brief This type of structure instance is used to keep the settings when calling the @ref DAC_Init() to initialize the DAC module.
|
|
*/
|
|
typedef struct
|
|
{
|
|
bool EnableTrigger; /*!< Specify whether to use the trigger and the trigger type. */
|
|
bool EnableOutBuf; /*!< Specify whether output buffer is enabled. */
|
|
} DAC_Init_Type;
|
|
|
|
/*!
|
|
* @brief Initialize the DAC module.
|
|
*
|
|
* @param DACx DAC instance.
|
|
* @param channel Indicated DAC channel. See to @ref DAC_CHANNEL_SELECTION.
|
|
* @param init Pointer to the initialization structure. See to @ref DAC_Init_Type.
|
|
* @return None.
|
|
*/
|
|
void DAC_Init(DAC_Type * DACx, uint32_t channel, DAC_Init_Type * init);
|
|
|
|
/*!
|
|
* @brief Enable the DAC module.
|
|
*
|
|
* The DAC module should be enabled before outputting voltage.
|
|
*
|
|
* @param DACx DAC instance.
|
|
* @param channel Indicated DAC channel. See to @ref DAC_CHANNEL_SELECTION.
|
|
* @param enable 'true' to enable the module, 'false' to disable the module.
|
|
* @return None.
|
|
*/
|
|
void DAC_Enable(DAC_Type * DACx, uint32_t channel, bool enable);
|
|
|
|
/*!
|
|
* @brief Enable the DAC channel output.
|
|
*
|
|
* The DAC output channel should be enabled before outputting voltage.
|
|
*
|
|
* @param DACx DAC instance.
|
|
* @param channel Indicated DAC channel. See to @ref DAC_CHANNEL_SELECTION.
|
|
* @param enable 'true' to enable the DAC channel output, 'false' to disable the DAC channel output.
|
|
* @return None.
|
|
*/
|
|
void DAC_EnableChannelOutput(DAC_Type * DACx, uint32_t channel, bool enable);
|
|
|
|
/*!
|
|
* @brief Get the echo data from the output of the indicated DAC channel.
|
|
*
|
|
* The value in DAC_DORx register takes effect on the actual output of DAC.
|
|
*
|
|
* @param DACx DAC instance.
|
|
* @param channel Indicated DAC channel. See to @ref DAC_CHANNEL_SELECTION.
|
|
* @return The indicated DAC channel data output value.
|
|
*/
|
|
uint32_t DAC_GetData(DAC_Type * DACx, uint32_t channel);
|
|
|
|
/*!
|
|
* @brief Put the value into the indicated channel of the DAC module with the alignment.
|
|
*
|
|
* The value in DAC_DORx register takes effect on the actual output of DAC.
|
|
*
|
|
* @param DACx DAC instance.
|
|
* @param channel Indicated DAC channel. See to @ref DAC_CHANNEL_SELECTION.
|
|
* @param value Data value to be put in indicated DAC channel for conversion.
|
|
* @param align Alignment the value expected to be put into the conversion. See to @ref DAC_Align_Type.
|
|
* @return The current converted value of the indicated DAC channel.
|
|
*/
|
|
uint32_t DAC_PutData(DAC_Type * DACx, uint32_t channel, uint32_t value, DAC_Align_Type align);
|
|
|
|
/*!
|
|
* @brief Enable the feature of generating noise wave from the DAC module.
|
|
*
|
|
* If enable additional noise wave, the output value will depend on the the unmask LFSR bit and input of the indicated channel.
|
|
*
|
|
* @param DACx DAC instance.
|
|
* @param channel Indicated DAC channel. See to @ref DAC_CHANNEL_SELECTION.
|
|
* @param init Pointer to the initialization structure. See to @ref DAC_AddNoise_Init_Type. If null, disable the wave generation.
|
|
* @return None.
|
|
*/
|
|
void DAC_EnableAddNoise(DAC_Type * DACx, uint32_t channel, DAC_AddNoise_Init_Type * init);
|
|
|
|
/*!
|
|
* @brief Enable the feature of generating triangle wave from the DAC module.
|
|
*
|
|
* Defaultedly, DAC does not generate any wave.
|
|
* If enable additional triangle wave, the output value will depend on the the indicated amplitude and input of the indicated channel.
|
|
*
|
|
* @param DACx DAC instance.
|
|
* @param channel Indicated DAC channel. See to @ref DAC_CHANNEL_SELECTION.
|
|
* @param init Pointer to the initialization structure. See to @ref DAC_AddTriangle_Init_Type. If null, disable the wave generation.
|
|
* @return None.
|
|
*/
|
|
void DAC_EnableAddTriangle(DAC_Type * DACx, uint32_t channel, DAC_AddTriangle_Init_Type * init);
|
|
|
|
/*!
|
|
* @brief Enable the DMA trigger from the DAC module.
|
|
*
|
|
* The DMA trigger events are the same as the intertupts.
|
|
*
|
|
* @param DACx DAC instance.
|
|
* @param channel Indicated DAC channel. See to @ref DAC_CHANNEL_SELECTION.
|
|
* @param enable 'true' to enable the DMA trigger, 'false' to disable the DMA trigger.
|
|
* @return None.
|
|
*/
|
|
void DAC_EnableDMA(DAC_Type * DACx, uint32_t channel, bool enable);
|
|
|
|
/*!
|
|
* @brief Do trigger the indicated DAC channel with software trigger.
|
|
*
|
|
* @param DACx DAC instance.
|
|
* @param channel Indicated DAC channel. See to @ref DAC_CHANNEL_SELECTION.
|
|
* @return None.
|
|
*/
|
|
void DAC_DoSwTrigger(DAC_Type * DACx, uint32_t channel);
|
|
|
|
/*!
|
|
* @brief Do trigger the dual DAC channels with software trigger simultaneously.
|
|
*
|
|
* @param DACx DAC instance.
|
|
* @return None.
|
|
*/
|
|
void DAC_DoDualChannelSwTrigger(DAC_Type * DACx);
|
|
|
|
/*!
|
|
* @brief Get the indicated register address of the DAC module.
|
|
*
|
|
* @param DACx DAC instance.
|
|
* @param channel Indicated DAC channel. See to @ref DAC_CHANNEL_SELECTION.
|
|
* @param align Alignment that the data expects to br transferred. See to @ref DAC_Align_Type.
|
|
* @return The value of the address for indicated align type of the DAC channel.
|
|
*/
|
|
uint32_t DAC_GetDataRegAddr(DAC_Type * DACx, uint32_t channel, DAC_Align_Type align);
|
|
|
|
/*!
|
|
* @brief Put 8-bit value into the indicated channel of the DAC module.
|
|
*
|
|
* The low 8-bit of the setting value here will be output with 4-bit left shift.
|
|
* If the value is 0x1f, the output will be 0x1f0.
|
|
*
|
|
* @param DACx DAC instance.
|
|
* @param channel Indicated DAC channel. See to @ref DAC_CHANNEL_SELECTION.
|
|
* @param value Data value to be put in indicated DAC channel for conversion.
|
|
* @return None.
|
|
*/
|
|
void DAC_PutData8bRightAlign(DAC_Type * DACx, uint32_t channel, uint32_t value);
|
|
|
|
/*!
|
|
* @brief Put the 12-bit value into indicated channel of the DAC module.
|
|
*
|
|
* The low 12-bit of the setting value here will be output after 4-bit right shift.
|
|
* If the value is 0x1ff, the output will be 0x1f.
|
|
*
|
|
* @param DACx DAC instance.
|
|
* @param channel Indicated DAC channel. See to @ref DAC_CHANNEL_SELECTION.
|
|
* @param value Data value to be put in indicated DAC channel for conversion.
|
|
* @return None.
|
|
*/
|
|
void DAC_PutData12bLeftAlign(DAC_Type * DACx, uint32_t channel, uint32_t value);
|
|
|
|
/*!
|
|
* @brief Put the current data into indicated channel of the DAC module.
|
|
*
|
|
* The low 12-bit of the setting value here will output with the original value.
|
|
*
|
|
* @param DACx DAC instance.
|
|
* @param channel Indicated DAC channel. See to @ref DAC_CHANNEL_SELECTION.
|
|
* @param value Data value to be put in indicated DAC channel for conversion.
|
|
* @return None.
|
|
*/
|
|
void DAC_PutData12bRightAlign(DAC_Type * DACx, uint32_t channel, uint32_t value);
|
|
|
|
/*!
|
|
* @brief Respectively put the value into the dual channels of the DAC module 8b right aligned.
|
|
*
|
|
* Simultaneously output the low 8-bit of the low 16-bit and high 16-bit of the 32-bit value seperately with a 4-bit left shift.
|
|
* If value is 0x011f01ff, the output of each channel will be 0xff0 ( channel 1 ) and 0x1f0 ( channel 2 ).
|
|
*
|
|
* @param DACx DAC instance.
|
|
* @param value Data value to be put in DAC channel 1 and DAC channel 2 for conversion.
|
|
* @return None.
|
|
*/
|
|
void DAC_PutDualChannelData8bRightAlign(DAC_Type * DACx, uint32_t value);
|
|
|
|
/*!
|
|
* @brief Put the data into the dual channel of the DAC module 12b left aligned.
|
|
*
|
|
* Simultaneously output the high 12-bit of the low 16-bit and high 16-bit of the 32-bit value seperately after 4-bit right shift.
|
|
* If value is 0x011f01ff, the output of each channel will be 0x01f ( channel 1 ) and 0x011 ( channel 2 ).
|
|
*
|
|
* @param DACx DAC instance.
|
|
* @param value Data value to be put in DAC channel 1 and DAC channel 2 for conversion.
|
|
* @return None.
|
|
*/
|
|
void DAC_PutDualChannelData12bLeftAlign(DAC_Type * DACx, uint32_t value);
|
|
|
|
/*!
|
|
* @brief Put the data into the dual channel of the DAC module 12b right aligned.
|
|
*
|
|
* Simultaneously output the low 12-bit of the low 16-bit and high 16-bit of the 32-bit value seperately.
|
|
*
|
|
* @param DACx DAC instance.
|
|
* @param value Data value to be put in DAC channel 1 and DAC channel 2 for conversion.
|
|
* @return None.
|
|
*/
|
|
void DAC_PutDualChannelData12bRightAlign(DAC_Type * DACx, uint32_t value);
|
|
|
|
/*!
|
|
* @brief Get the 8-bit data register address of the DAC module.
|
|
*
|
|
* @param DACx DAC instance.
|
|
* @param channel Indicated DAC channel. See to @ref DAC_CHANNEL_SELECTION.
|
|
* @return The value of the address for DAC module's 8-bit data register .
|
|
*/
|
|
uint32_t DAC_GetData8bRegAddr(DAC_Type * DACx, uint32_t channel);
|
|
|
|
/*!
|
|
* @brief Get the 12-bit left-aligned data register address of the DAC module.
|
|
*
|
|
* @param DACx DAC instance.
|
|
* @param channel Indicated DAC channel. See to @ref DAC_CHANNEL_SELECTION.
|
|
* @return The value of the address for DAC module's 12-bit left-aligned data register .
|
|
*/
|
|
uint32_t DAC_GetData12bLeftRegAddr(DAC_Type * DACx, uint32_t channel);
|
|
|
|
/*!
|
|
* @brief Get the 12-bit right-aligned data register address of the DAC module.
|
|
*
|
|
* @param DACx DAC instance.
|
|
* @param channel Indicated DAC channel. See to @ref DAC_CHANNEL_SELECTION.
|
|
* @return The value of the address for DAC module's 12-bit right-aligned data register .
|
|
*/
|
|
uint32_t DAC_GetData12bRightRegAddr(DAC_Type * DACx, uint32_t channel);
|
|
|
|
/*!
|
|
* @brief Get the dual channel 8-bit data register address of the DAC module.
|
|
*
|
|
* @param DACx DAC instance.
|
|
* @return The value of the address for DAC module's dual channel 8-bit data register .
|
|
*/
|
|
uint32_t DAC_GetDualChannelData8bRegAddr(DAC_Type * DACx);
|
|
|
|
/*!
|
|
* @brief Get the dual channel 12-bit left-aligned data register address of the DAC module.
|
|
*
|
|
* @param DACx DAC instance.
|
|
* @return The value of the address for DAC module's 12-bit dual channel left-aligned data register .
|
|
*/
|
|
uint32_t DAC_GetDualChannelData12bLeftRegAddr(DAC_Type * DACx);
|
|
|
|
/*!
|
|
* @brief Get the dual channel 12-bit right-aligned data register address of the DAC module.
|
|
*
|
|
* @param DACx DAC instance.
|
|
* @return The value of the address for DAC module's 12-bit dual channel right-aligned data register .
|
|
*/
|
|
uint32_t DAC_GetDualChannelData12bRightRegAddr(DAC_Type * DACx);
|
|
|
|
/*!
|
|
*@}
|
|
*/
|
|
|
|
#endif /* __HAL_DAC_H__ */
|
|
|