|
STM32G474xx HAL用户手册
|
00001 /** 00002 ****************************************************************************** 00003 * @file stm32g4xx_hal_cordic.c 00004 * @author MCD Application Team 00005 * @brief CORDIC HAL模块驱动程序。 00006 * 本文件提供用于管理CORDIC外设以下功能的固件函数: 00007 * + 初始化和反初始化函数 00008 * + 外设控制函数 00009 * + 回调函数 00010 * + IRQ处理程序管理 00011 * + 外设状态函数 00012 * 00013 ****************************************************************************** 00014 * @attention 00015 * 00016 * Copyright (c) 2019 STMicroelectronics. 00017 * All rights reserved. 00018 * 00019 * This software is licensed under terms that can be found in the LICENSE file 00020 * in the root directory of this software component. 00021 * If no LICENSE file comes with this software, it is provided AS-IS. 00022 * 00023 ****************************************************************************** 00024 @verbatim 00025 ================================================================================ 00026 ##### 如何使用此驱动程序 ##### 00027 ================================================================================ 00028 [..] 00029 CORDIC HAL驱动程序可按如下方式使用: 00030 00031 (#) 通过实现HAL_CORDIC_MspInit()初始化CORDIC低层资源: 00032 (++) 使用__HAL_RCC_CORDIC_CLK_ENABLE()使能CORDIC接口时钟 00033 (++) 如果使用中断(例如HAL_CORDIC_Calculate_IT()) 00034 (+++) 使用HAL_NVIC_SetPriority()配置CORDIC中断优先级 00035 (+++) 使用HAL_NVIC_EnableIRQ()使能CORDIC IRQ处理程序 00036 (+++) 在CORDIC IRQ处理程序中调用HAL_CORDIC_IRQHandler() 00037 (++) 如果使用DMA控制数据传输(例如HAL_CORDIC_Calculate_DMA()) 00038 (+++) 使用__HAL_RCC_DMA2_CLK_ENABLE()使能DMA2接口时钟 00039 (+++) 配置并使能两个DMA通道,一个用于管理从内存到外设的数据传输 00040 (输入通道),另一个用于管理从外设到内存的数据传输 00041 (输出通道) 00042 (+++) 使用__HAL_LINKDMA()将初始化的DMA句柄关联到CORDIC DMA句柄 00043 (+++) 配置两个DMA通道的传输完成中断的优先级并使能NVIC。 00044 使用HAL_NVIC_SetPriority()和HAL_NVIC_EnableIRQ() 00045 00046 (#) 使用HAL_CORDIC_Init()初始化CORDIC HAL。此函数 00047 (++) 依赖于HAL_CORDIC_MspInit()进行低层初始化, 00048 00049 (#) 使用HAL_CORDIC_Configure()配置CORDIC处理(计算)。 00050 此函数配置: 00051 (++) 处理函数:余弦、正弦、相位、模量、反正切、 00052 双曲余弦、双曲正弦、双曲反正切、 00053 自然对数、平方根 00054 (++) 缩放因子:1至2exp(-7) 00055 (++) 输入数据宽度:32位输入数据大小(Q1.31格式)或16位 00056 输入数据大小(Q1.15格式) 00057 (++) 输出数据宽度:32位输出数据大小(Q1.31格式)或16位 00058 输出数据大小(Q1.15格式) 00059 (++) 一次计算预期的32位写入次数:一次32位写入 00060 或两次32位写入 00061 (++) 一次计算后预期的32位读取次数:一次32位读取 00062 或两次32位读取 00063 (++) 精度:计算1至15个周期(周期越多,精度越高) 00064 00065 (#) 提供四种处理(计算)函数: 00066 (++) 轮询模式:处理API是阻塞函数 00067 即它处理数据并等待处理完成 00068 API为HAL_CORDIC_Calculate 00069 (++) 零开销轮询模式:处理API是阻塞函数 00070 即它处理数据并等待处理完成 00071 比标准轮询模式稍快,但也阻塞AHB总线 00072 API为HAL_CORDIC_CalculateZO 00073 (++) 中断模式:处理API是非阻塞函数 00074 即它在中断下处理数据 00075 API为HAL_CORDIC_Calculate_IT 00076 (++) DMA模式:处理API是非阻塞函数,CPU不用于 00077 数据传输, 00078 即数据传输由DMA保证 00079 API为HAL_CORDIC_Calculate_DMA 00080 00081 (#) 调用HAL_CORDIC_DeInit()反初始化CORDIC外设。此函数 00082 (++) 依赖于HAL_CORDIC_MspDeInit()进行低层反初始化, 00083 00084 *** 回调注册 *** 00085 ============================================= 00086 00087 编译定义USE_HAL_CORDIC_REGISTER_CALLBACKS设置为1时 00088 允许用户动态配置驱动程序回调。 00089 使用函数HAL_CORDIC_RegisterCallback()注册中断回调。 00090 00091 函数HAL_CORDIC_RegisterCallback()允许注册以下回调: 00092 (+) ErrorCallback : 错误回调。 00093 (+) CalculateCpltCallback : 计算完成回调。 00094 (+) MspInitCallback : CORDIC MspInit。 00095 (+) MspDeInitCallback : CORDIC MspDeInit。 00096 此函数需要HAL外设句柄、回调ID 00097 以及指向用户回调函数的指针作为参数。 00098 00099 使用函数HAL_CORDIC_UnRegisterCallback()将回调重置为默认 00100 弱函数。 00101 HAL_CORDIC_UnRegisterCallback需要HAL外设句柄 00102 和回调ID作为参数。 00103 此函数允许重置以下回调: 00104 (+) ErrorCallback : 错误回调。 00105 (+) CalculateCpltCallback : 计算完成回调。 00106 (+) MspInitCallback : CORDIC MspInit。 00107 (+) MspDeInitCallback : CORDIC MspDeInit。 00108 00109 默认情况下,在HAL_CORDIC_Init()之后且状态为HAL_CORDIC_STATE_RESET时, 00110 所有回调都设置为对应的弱函数: 00111 示例HAL_CORDIC_ErrorCallback()、HAL_CORDIC_CalculateCpltCallback()。 00112 MspInit和MspDeInit函数例外,它们在HAL_CORDIC_Init()/ HAL_CORDIC_DeInit()中 00113 仅当这些回调为空(未预先注册)时才重置为遗留弱函数。 00114 否则,如果MspInit或MspDeInit不为空,HAL_CORDIC_Init()/ HAL_CORDIC_DeInit() 00115 保留并使用用户预先注册的MspInit/MspDeInit回调 00116 00117 回调只能在HAL_CORDIC_STATE_READY状态下注册/注销。 00118 MspInit/MspDeInit例外,可以在HAL_CORDIC_STATE_READY或HAL_CORDIC_STATE_RESET状态下 00119 注册/注销,因此已注册的(用户)MspInit/DeInit回调可在Init/DeInit期间使用。 00120 在这种情况下,首先使用HAL_CORDIC_RegisterCallback()注册MspInit/MspDeInit用户回调 00121 再调用HAL_CORDIC_DeInit() 00122 或HAL_CORDIC_Init()函数。 00123 00124 当编译定义USE_HAL_CORDIC_REGISTER_CALLBACKS设置为0或 00125 未定义时,回调注册功能不可用,所有回调都设置为对应的弱函数。 00126 00127 @endverbatim 00128 ****************************************************************************** 00129 */ 00130 00131 /* Includes ------------------------------------------------------------------*/ 00132 #include "stm32g4xx_hal.h" 00133 #if defined(CORDIC) 00134 #ifdef HAL_CORDIC_MODULE_ENABLED 00135 00136 /** @addtogroup STM32G4xx_HAL_Driver 00137 * @{ 00138 */ 00139 00140 /** @defgroup CORDIC CORDIC 00141 * @brief CORDIC HAL驱动程序模块。 00142 * @{ 00143 */ 00144 00145 /* Private typedef -----------------------------------------------------------*/ 00146 /* Private define ------------------------------------------------------------*/ 00147 /* Private macro -------------------------------------------------------------*/ 00148 /* Private variables ---------------------------------------------------------*/ 00149 /* Private function prototypes -----------------------------------------------*/ 00150 00151 /** @defgroup CORDIC_Private_Functions CORDIC私有函数 00152 * @{ 00153 */ 00154 static void CORDIC_WriteInDataIncrementPtr(const CORDIC_HandleTypeDef *hcordic, const int32_t **ppInBuff); 00155 static void CORDIC_ReadOutDataIncrementPtr(const CORDIC_HandleTypeDef *hcordic, int32_t **ppOutBuff); 00156 static void CORDIC_DMAInCplt(DMA_HandleTypeDef *hdma); 00157 static void CORDIC_DMAOutCplt(DMA_HandleTypeDef *hdma); 00158 static void CORDIC_DMAError(DMA_HandleTypeDef *hdma); 00159 00160 /** 00161 * @} 00162 */ 00163 00164 /* Exported functions --------------------------------------------------------*/ 00165 /** @defgroup CORDIC_Exported_Functions CORDIC导出函数 00166 * @{ 00167 */ 00168 00169 /** @defgroup CORDIC_Exported_Functions_Group1 初始化和反初始化函数 00170 * @brief 初始化和配置函数。 00171 * 00172 @verbatim 00173 ============================================================================== 00174 ##### 初始化和反初始化函数 ##### 00175 ============================================================================== 00176 [..] 本节提供的函数允许: 00177 (+) 初始化CORDIC外设及相关句柄 00178 (+) 反初始化CORDIC外设 00179 (+) 初始化CORDIC MSP(MCU特定包) 00180 (+) 反初始化CORDIC MSP 00181 00182 [..] 00183 00184 @endverbatim 00185 * @{ 00186 */ 00187 00188 /** 00189 * @brief 初始化CORDIC外设及相关句柄。 00190 * @param hcordic 指向CORDIC_HandleTypeDef结构的指针。 00191 * @retval HAL状态 00192 */ 00201 HAL_StatusTypeDef HAL_CORDIC_Init(CORDIC_HandleTypeDef *hcordic) 00194 { 00195 /* Check the CORDIC handle allocation */ 00196 if (hcordic == NULL) 00197 { 00198 /* Return error status */ 00199 return HAL_ERROR; 00200 } 00201 00202 /* Check the instance */ 00203 assert_param(IS_CORDIC_ALL_INSTANCE(hcordic->Instance)); 00204 00205 #if USE_HAL_CORDIC_REGISTER_CALLBACKS == 1 00206 if (hcordic->State == HAL_CORDIC_STATE_RESET) 00207 { 00208 /* Allocate lock resource and initialize it */ 00209 hcordic->Lock = HAL_UNLOCKED; 00210 00211 /* Reset callbacks to legacy functions */ 00212 hcordic->ErrorCallback =