|
STM32G474xx HAL 用户手册
|
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 =