STM32G474xx HAL 用户手册
stm32g4xx_hal_fmac.c
跳转到此文件的文档。
00001 /**
00002   ******************************************************************************
00003   * @file    stm32g4xx_hal_fmac.c
00004   * @author  MCD Application Team
00005   * @brief   FMAC HAL 模块驱动。
00006   *          此文件提供管理 FMAC 外设以下功能的固件函数:
00007   *           + 初始化和反初始化函数
00008   *           + 外设控制函数
00009   *           + 回调函数
00010   *           + IRQ 处理程序管理
00011   *           + 外设状态和错误函数
00012   *
00013   ******************************************************************************
00014   * @attention
00015   *
00016   * Copyright (c) 2019 STMicroelectronics.
00017   * 保留所有权利。
00018   *
00019   * 本软件受可在本软件组件根目录中的 LICENSE 文件中找到的条款约束。
00020   * 如果本软件未附带 LICENSE 文件,则按原样提供。
00021   *
00022   ******************************************************************************
00023   *
00024   *  @verbatim
00025 ================================================================================
00026             ##### 如何使用此驱动程序 #####
00027 ================================================================================
00028     [..]
00029       FMAC HAL 驱动程序可按如下方式使用:
00030 
00031       (#) 通过实现 HAL_FMAC_MspInit() 初始化 FMAC 底层资源:
00032           (++) 使用 __HAL_RCC_FMAC_CLK_ENABLE() 使能 FMAC 接口时钟。
00033           (++) 如果使用中断(例如,访问配置为 FMAC_BUFFER_ACCESS_IT):
00034                (+++) 使用 HAL_NVIC_SetPriority() 配置 FMAC 中断优先级。
00035                (+++) 使用 HAL_NVIC_EnableIRQ() 使能 FMAC IRQ 处理程序。
00036                (+++) 在 FMAC IRQ 处理程序中,调用 HAL_FMAC_IRQHandler()。
00037           (++) 如果使用 DMA 控制数据传输(例如,访问配置为
00038                FMAC_BUFFER_ACCESS_DMA):
00039                (+++) 使用 __HAL_RCC_DMA1_CLK_ENABLE() 或
00040                      __HAL_RCC_DMA2_CLK_ENABLE()(取决于使用的 DMA 实例)使能 DMA 接口时钟。
00041                (+++) 使用 __HAL_RCC_DMAMUX1_CLK_ENABLE() 使能 DMAMUX1 接口时钟。
00042                (+++) 如果内部缓冲区(系数、输入、输出)的初始化通过 DMA 完成,
00043                      则配置并使能一个 DMA 通道用于管理从内存到内存的数据传输(预加载通道)。
00044                (+++) 如果输入缓冲区通过 DMA 访问,则配置并使能一个
00045                      DMA 通道用于管理从内存到外设的数据传输(输入通道)。
00046                (+++) 如果输出缓冲区通过 DMA 访问,则配置并使能一个
00047                      DMA 通道用于管理从外设到内存的数据传输(输出通道)。
00048                (+++) 使用 __HAL_LINKDMA() 将初始化的 DMA 句柄关联到 FMAC DMA 句柄。
00049                (+++) 使用 HAL_NVIC_SetPriority() 和 HAL_NVIC_EnableIRQ() 配置优先级并使能
00050                      已使能 DMA 通道上的传输完成中断的 NVIC。
00051 
00052       (#) 使用 HAL_FMAC_Init() 初始化 FMAC HAL。此函数
00053           调用 HAL_FMAC_MspInit() 进行底层初始化。
00054 
00055       (#) 使用 HAL_FMAC_FilterConfig() 或 HAL_FMAC_FilterConfig_DMA()
00056           配置 FMAC 处理(滤波器)。
00057           此函数:
00058           (++) 定义 FMAC 内部内存中的内存区域
00059                (输入、系数、输出)以及关联的阈值(输入、输出)。
00060           (++) 配置滤波器及其参数:
00061                (+++) 有限脉冲响应(FIR)滤波器(也称为卷积)。
00062                (+++) 无限脉冲响应(IIR)滤波器(直接形式 1)。
00063           (++) 选择访问输入和输出缓冲区的方式:无、轮询、
00064                DMA、IT。"无"表示输入和/或输出数据将由
00065                另一个 IP(ADC、DAC 等)处理。
00066           (++) 如果输入访问和/或输出访问通过 IT/DMA 进行,
00067                则使能错误中断。如果发生错误,中断
00068                将在循环中触发。为了恢复,用户必须
00069                使用序列 HAL_FMAC_DeInit / HAL_FMAC_Init 重置 IP。
00070                或者,他也可以使用 __HAL_FMAC_DISABLE_IT 禁用中断;
00071                错误状态将被保留,但不会再触发中断。
00072           (++) 使用轮询模式(HAL_FMAC_FilterConfig())或 DMA(HAL_FMAC_FilterConfig_DMA())
00073                将提供的系数写入内部内存。
00074                在 DMA 情况下,当处理完成时调用 HAL_FMAC_FilterConfigCallback()。
00075 
00076        (#) 或者,用户可以通过调用 __HAL_FMAC_ENABLE_IT 使能与
00077            饱和相关的错误中断。这有助于调试滤波器。如果发生饱和,
00078            中断将在循环中触发。为了恢复,用户必须:
00079            (++) 如果用户希望继续,请调用 __HAL_FMAC_DISABLE_IT 禁用中断。
00080            (++) 使用序列 HAL_FMAC_DeInit / HAL_FMAC_Init 重置 IP。
00081 
00082        (#) 或者,使用 HAL_FMAC_FilterPreload() 或 HAL_FMAC_FilterPreload_DMA()
00083            预加载输入(FIR、IIR)和输出(IIR)数据。
00084            在 DMA 情况下,当处理完成时调用 HAL_FMAC_FilterPreloadCallback()。
00085            此步骤是可选的,因为滤波器可以在没有预加载数据的情况下启动。
00086 
00087        (#) 使用 HAL_FMAC_FilterStart() 启动 FMAC 处理(滤波器)。
00088            此函数还配置输出缓冲区,该缓冲区将从循环内部输出缓冲区填充。
00089            该函数立即返回,不会更新提供的缓冲区。IP 处理将保持活动状态,直到
00090            调用 HAL_FMAC_FilterStop()。
00091 
00092        (#) 如果输入内部缓冲区通过 DMA 访问,HAL_FMAC_HalfGetDataCallback()
00093            将被调用以指示输入缓冲区的一半已被处理。
00094 
00095        (#) 如果输入内部缓冲区通过 DMA 或中断访问,HAL_FMAC_GetDataCallback()
00096            将被调用以请求新的输入数据。如果 DMA 不在循环模式下,
00097            将通过 HAL_FMAC_AppendFilterData() 提供。
00098 
00099        (#) 如果输出内部缓冲区通过 DMA 访问,HAL_FMAC_HalfOutputDataReadyCallback()
00100            将被调用以指示输出缓冲区的一半已被处理。
00101 
00102        (#) 如果输出内部缓冲区通过 DMA 或中断访问,
00103            HAL_FMAC_OutputDataReadyCallback() 将被调用以请求新的输出
00104            缓冲区。如果 DMA 不在循环模式下,
00105            将通过 HAL_FMAC_ConfigFilterOutputBuffer() 提供。
00106 
00107        (#) 在除"无"以外的所有模式下,通过 HAL_FMAC_AppendFilterData() 提供要处理的新输入数据。
00108            此函数应仅在先前的输入数据已被处理后调用
00109            (预加载的输入数据不受影响)。
00110 
00111        (#) 在除"无"以外的所有模式下,通过
00112            HAL_FMAC_ConfigFilterOutputBuffer() 提供要填充的新输出缓冲区。此函数应仅在先前
00113            用户的输出缓冲区已被填充后调用。
00114 
00115        (#) 在轮询模式下,使用 HAL_FMAC_PollFilterData() 处理输入和输出数据。
00116            此函数:
00117            (++) 将用户的输入数据(通过 HAL_FMAC_AppendFilterData() 提供)
00118                 写入 FMAC 输入内存区域。
00119            (++) 读取 FMAC 输出内存区域并将其写入用户的输出缓冲区。
00120            它将在以下情况下返回:
00121            (++) 用户的输出缓冲区已填满。
00122            (++) 用户的输入缓冲区已被处理。
00123            未使用的数据(未读取的输入数据或空闲输出数据)将不会被保存。
00124            用户必须使用更新后的输入和输出大小来跟踪它们。
00125 
00126        (#) 使用 HAL_FMAC_FilterStop() 停止 FMAC 处理(滤波器)。
00127 
00128        (#) 调用 HAL_FMAC_DeInit() 反初始化 FMAC 外设。此函数
00129            调用 HAL_FMAC_MspDeInit() 进行底层反初始化。
00130 
00131   ##### 回调注册 #####
00132   ==================================
00133 
00134     [..]
00135       编译定义 USE_HAL_FMAC_REGISTER_CALLBACKS 设置为 1 时
00136       允许用户动态配置驱动程序回调。
00137 
00138     [..]
00139       使用函数 HAL_FMAC_RegisterCallback() 注册用户回调。
00140       函数 HAL_FMAC_RegisterCallback() 允许注册以下回调:
00141       (+) ErrorCallback               : 错误回调。
00142       (+) HalfGetDataCallback         : 获取一半数据回调。
00143       (+) GetDataCallback             : 获取数据回调。
00144       (+) HalfOutputDataReadyCallback : 一半输出数据就绪回调。
00145       (+) OutputDataReadyCallback     : 输出数据就绪回调。
00146       (+) FilterConfigCallback        : 滤波器配置回调。
00147       (+) FilterPreloadCallback       : 滤波器预加载回调。
00148       (+) MspInitCallback             : FMAC MspInit。
00149       (+) MspDeInitCallback           : FMAC MspDeInit。
00150       此函数接受 HAL 外设句柄、回调 ID
00151       和指向用户回调函数的指针作为参数。
00152 
00153     [..]
00154       使用函数 HAL_FMAC_UnRegisterCallback() 将回调重置为默认
00155       弱函数。
00156       HAL_FMAC_UnRegisterCallback() 接受 HAL 外设句柄
00157       和回调 ID 作为参数。
00158       此函数允许重置以下回调:
00159       (+) ErrorCallback               : 错误回调。
00160       (+) HalfGetDataCallback         : 获取一半数据回调。
00161       (+) GetDataCallback             : 获取数据回调。
00162       (+) HalfOutputDataReadyCallback : 一半输出数据就绪回调。
00163       (+) OutputDataReadyCallback     : 输出数据就绪回调。
00164       (+) FilterConfigCallback        : 滤波器配置回调。
00165       (+) FilterPreloadCallback       : 滤波器预加载回调。
00166       (+) MspInitCallback             : FMAC MspInit。
00167       (+) MspDeInitCallback           : FMAC MspDeInit。
00168 
00169     [..]
00170       默认情况下,在 HAL_FMAC_Init() 之后,当状态为 HAL_FMAC_STATE_RESET
00171       时,所有回调都设置为相应的弱函数:
00172       例如 GetDataCallback()、OutputDataReadyCallback()。
00173       MspInit 和 MspDeInit 函数例外,它们分别
00174       仅在 HAL_FMAC_Init()
00175       和 HAL_FMAC_DeInit() 中当这些回调为 null(未预先注册)时重置为传统弱函数。
00176       如果不是,MspInit 或 MspDeInit 不为 null,HAL_FMAC_Init() 和 HAL_FMAC_DeInit()
00177       将保留并使用用户 MspInit/MspDeInit 回调(预先注册)。
00178 
00179     [..]
00180       回调只能在 HAL_FMAC_STATE_READY 状态下注册/注销。
00181       MspInit/MspDeInit 例外,可以在
00182       HAL_FMAC_STATE_READY 或 HAL_FMAC_STATE_RESET 状态下注册/注销,因此注册的(用户)
00183       MspInit/DeInit 回调可在 Init/DeInit 期间使用。
00184       在这种情况下,请先使用 HAL_FMAC_RegisterCallback() 注册 MspInit/MspDeInit 用户回调
00185       然后再调用 HAL_FMAC_DeInit