STM32G474xx HAL 用户手册
stm32g4xx_hal_dac_ex.c
转到此文件的文档。
00001 /**
00002   ******************************************************************************
00003   * @file    stm32g4xx_hal_dac_ex.c
00004   * @author  MCD Application Team
00005   * @brief   扩展的 DAC HAL 模块驱动。
00006   *          此文件提供用于管理 DAC 外设扩展功能的固件函数。
00007   *          functionalities of the DAC peripheral.
00008   *
00009   *
00010   ******************************************************************************
00011   * @attention
00012   *
00013   * Copyright (c) 2019 STMicroelectronics.
00014   * All rights reserved.
00015   *
00016   * 本软件受可在本软件组件根目录中找到的 LICENSE 文件条款的约束。
00017   * in the root directory of this software component.
00018   * 如果此软件未附带 LICENSE 文件,则按原样提供。
00019   *
00020   ******************************************************************************
00021   @verbatim
00022   ==============================================================================
00023                       ##### 如何使用此驱动程序 #####
00024   ==============================================================================
00025     [..]
00026      *** 双模式 IO 操作 ***
00027      ==============================
00028      [..]
00029       (+) 使用 HAL_DACEx_DualStart() 使能两个通道并启动双模式操作的转换。
00030           如果选择了软件触发,使用 HAL_DACEx_DualStart() 将启动
00031           之前通过 HAL_DACEx_DualSetValue() 设置的值的转换。
00032       (+) 使用 HAL_DACEx_DualStop() 禁用两个通道并停止双模式操作的转换。
00033       (+) 使用 HAL_DACEx_DualStart_DMA() 使能两个通道并启动双模式操作的转换,
00034           使用 DMA 为 DAC 转换器提供数据。
00035           首次发出的触发将启动之前通过 HAL_DACEx_DualSetValue() 设置的值的转换。
00036       (+) 使用 HAL_DACEx_DualStop_DMA() 禁用两个通道并停止双模式操作的转换,
00037           使用 DMA 为 DAC 转换器提供数据。
00038       (+) 当启用双模式时(即同时使用 DAC 通道 1 和通道 2):
00039           使用 HAL_DACEx_DualGetValue() 获取要转换的数字数据,并使用
00040           HAL_DACEx_DualSetValue() 设置要在通道 1 和通道 2 中同时转换的数字值。
00041      *** 信号生成操作 ***
00042      ===================================
00043      [..]
00044       (+) 使用 HAL_DACEx_TriangleWaveGenerate() 生成三角波信号。
00045       (+) 使用 HAL_DACEx_NoiseWaveGenerate() 生成噪声信号。
00046 
00047       (+) 使用 HAL_DACEx_SawtoothWaveGenerate() 生成锯齿波信号。
00048       (+) 使用 HAL_DACEx_SawtoothWaveDataReset() 重置锯齿波。
00049       (+) 使用 HAL_DACEx_SawtoothWaveDataStep() 步进锯齿波。
00050 
00051       (+) HAL_DACEx_SelfCalibrate 校准一个 DAC 通道。
00052       (+) HAL_DACEx_SetUserTrimming 设置用户微调值。
00053       (+) HAL_DACEx_GetTrimOffset 获取微调值(复位后的出厂设置,
00054           如果在复位后至少使用过一次 HAL_DACEx_SetUserTrimming,则为用户设置)。
00055 
00056  @endverbatim
00057   ******************************************************************************
00058   */
00059 
00060 
00061 /* Includes ------------------------------------------------------------------*/
00062 #include "stm32g4xx_hal.h"
00063 
00064 /** @addtogroup STM32G4xx_HAL_Driver
00065   * @{
00066   */
00067 
00068 #ifdef HAL_DAC_MODULE_ENABLED
00069 
00070 #if defined(DAC1) || defined(DAC2) || defined(DAC3) ||defined (DAC4)
00071 
00072 /** @defgroup DACEx DACEx
00073   * @brief DAC 扩展 HAL 模块驱动
00074   * @{
00075   */
00076 
00077 /* Private typedef -----------------------------------------------------------*/
00078 /* Private define ------------------------------------------------------------*/
00079 
00080 /* DAC 最小微调时间的延迟。                                       */
00081 /* 注意:两个校准步骤之间所需的最小时间                    */
00082 /*       下面的延迟是在以下条件下指定的:                       */
00083 /*        - DAC 通道输出缓冲器已启用                                 */
00084 /* 字面量设置为最大值(请参阅器件数据手册,                   */
00085 /* 电气特性,参数 "tTRIM")。                            */
00086 /* 单位:us                                                                   */
00087 #define DAC_DELAY_TRIM_US          (50UL)     /*!< DAC 最小微调时间的延迟 */
00088 
00089 /* Private macro -------------------------------------------------------------*/
00090 /* Private variables ---------------------------------------------------------*/
00091 /* Private function prototypes -----------------------------------------------*/
00092 /* Exported functions --------------------------------------------------------*/
00093 
00094 /** @defgroup DACEx_Exported_Functions DACEx 导出函数
00095   * @{
00096   */
00097 
00098 /** @defgroup DACEx_Exported_Functions_Group2 IO 操作函数
00099   *  @brief    扩展的 IO 操作函数
00100   *
00101 @verbatim
00102   ==============================================================================
00103                  ##### 扩展功能函数 #####
00104   ==============================================================================
00105     [..]  本节提供允许以下操作的函数:
00106       (+) 启动转换。
00107       (+) 停止转换。
00108       (+) 启动转换并启用 DMA 传输。
00109       (+) 停止转换并禁用 DMA 传输。
00110       (+) 获取转换结果。
00111       (+) 获取双模式转换结果。
00112 
00113 @endverbatim
00114   * @{
00115   */
00116 
00117 
00118 /**
00119   * @brief  使能 DAC 并启动两个通道的转换。
00120   * @param  hdac 指向包含指定 DAC 配置信息的 DAC_HandleTypeDef 结构体的指针。
00121   * @retval HAL 状态
00122   */
00123 HAL_StatusTypeDef HAL_DACEx_DualStart(DAC_HandleTypeDef *hdac)
00124 {
00125   uint32_t tmp_swtrig = 0UL;
00126   __IO uint32_t wait_loop_index;
00127 
00128   /* 检查 DAC 外设句柄 */
00129   if (hdac == NULL)
00130   {
00131     return HAL_ERROR;
00132   }
00133 
00134   /* 检查参数 */
00135   assert_param(IS_DAC_CHANNEL(hdac->Instance, DAC_CHANNEL_2));
00136 
00137   /* 进程锁定 */
00138   __HAL_LOCK(hdac);
00139 
00140   /* 更改 DAC 状态 */
00141   hdac->State = HAL_DAC_STATE_BUSY;
00142 
00143   /* 使能外设 */
00144   __HAL_DAC_ENABLE(hdac, DAC_CHANNEL_1);
00145   __HAL_DAC_ENABLE(hdac, DAC_CHANNEL_2);
00146   /* 确保在外设使能后使用前有最小等待时间 */
00147   /* 等待循环初始化和执行 */
00148   /* 注意:变量除以 2 以部分补偿              */
00149   /*       CPU 处理周期,以 us 为单位进行缩放以避免          */
00150   /*       超过 32 位寄存器容量并处理低频。 */
00151   wait_loop_index = ((DAC_DELAY_STARTUP_US / 10UL) * ((SystemCoreClock / (100000UL * 2UL)) + 1UL));
00152   while (wait_loop_index != 0UL)
00153   {
00154     wait_loop_index--;
00155   }
00156 
00157   /* 检查是否启用了软件触发 */
00158   if ((hdac->Instance->CR & (DAC_CR_TEN1 | DAC_CR_TSEL1)) == DAC_TRIGGER_SOFTWARE)
00159   {
00160     tmp_swtrig |= DAC_SWTRIGR_SWTRIG1;
00161   }
00162   if ((hdac->Instance->CR & (DAC_CR_TEN2 | DAC_CR_TSEL2)) == (DAC_TRIGGER_SOFTWARE << (DAC_CHANNEL_2 & 0x10UL)))
00163   {
00164     tmp_swtrig |= DAC_SWTRIGR_SWTRIG2;
00165   }
00166   /* 使能所选的 DAC 软件转换*/
00167   SET_BIT(hdac->Instance->SWTRIGR, tmp_swtrig);
00168 
00169   /* 更改 DAC 状态 */
00170   hdac->State =