STM32G474xx HAL用户手册
stm32g4xx_hal_cordic.c
转至该文件的文档。
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         =