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