|
STM32G474xx HAL 用户手册
|
00001 /** 00002 ****************************************************************************** 00003 * @file stm32g4xx_hal_sai.c 00004 * @author MCD 应用团队 00005 * @brief SAI HAL 模块驱动程序。 00006 * 此文件提供固件函数,用于管理串行音频接口 (SAI) 外设的以下功能: 00007 * + 初始化/反初始化函数 00008 * + I/O 操作函数 00009 * + 外设控制函数 00010 * + 外设状态函数 00011 * 00012 ****************************************************************************** 00013 * @attention 00014 * 00015 * 版权所有 (c) 2019 STMicroelectronics。 00016 * 保留所有权利。 00017 * 00018 * 本软件受可在本软件组件根目录中找到的 LICENSE 文件条款的约束。 00019 * 如果本软件未附带 LICENSE 文件,则按原样提供。 00020 * 00021 ****************************************************************************** 00022 @verbatim 00023 ============================================================================== 00024 ##### 如何使用此驱动程序 ##### 00025 ============================================================================== 00026 00027 [..] 00028 SAI HAL 驱动程序可按如下方式使用: 00029 00030 (#) 声明一个 SAI_HandleTypeDef 句柄结构体(例如 SAI_HandleTypeDef hsai)。 00031 (#) 通过实现 HAL_SAI_MspInit() API 来初始化 SAI 底层资源: 00032 (##) 使能 SAI 接口时钟。 00033 (##) SAI 引脚配置: 00034 (+++) 使能 SAI GPIO 的时钟。 00035 (+++) 将这些 SAI 引脚配置为复用功能上拉。 00036 (##) 如果需要使用中断处理(HAL_SAI_Transmit_IT() 00037 和 HAL_SAI_Receive_IT() API),则进行 NVIC 配置: 00038 (+++) 配置 SAI 中断优先级。 00039 (+++) 使能 NVIC SAI IRQ 句柄。 00040 00041 (##) 如果需要使用 DMA 处理(HAL_SAI_Transmit_DMA() 00042 和 HAL_SAI_Receive_DMA() API),则进行 DMA 配置: 00043 (+++) 为 Tx/Rx 流声明一个 DMA 句柄结构体。 00044 (+++) 使能 DMAx 接口时钟。 00045 (+++) 使用所需的 Tx/Rx 参数配置已声明的 DMA 句柄结构体。 00046 (+++) 配置 DMA Tx/Rx 流。 00047 (+++) 将初始化的 DMA 句柄关联到 SAI DMA Tx/Rx 句柄。 00048 (+++) 配置优先级并使能 DMA Tx/Rx 流传输完成中断的 NVIC。 00049 00050 (#) 初始化可以通过两种方式完成 00051 (##) 专家模式:初始化结构体 Init、FrameInit 和 SlotInit,然后调用 HAL_SAI_Init()。 00052 (##) 简化模式:初始化 Init 结构体的高位部分,然后调用 HAL_SAI_InitProtocol()。 00053 00054 [..] 00055 (@) 特定的 SAI 中断(FIFO 请求和上溢/下溢中断) 00056 将在发送和接收过程中使用宏 __HAL_SAI_ENABLE_IT() 和 __HAL_SAI_DISABLE_IT() 进行管理。 00057 [..] 00058 (@) 确保已配置 SAI 时钟源: 00059 (+@) SYSCLK 或 00060 (+@) PLLQ 输出 或 00061 (+@) HSI 或 00062 (+@) 在 stm32g4xx_hal_conf.h 文件中正确设置常量 EXTERNAL_CLOCK_VALUE 后配置的外部时钟源。 00063 00064 [..] 00065 (@) 在主机发送模式下:使能音频块会立即为外部从机生成位时钟, 00066 即使 FIFO 中没有数据,但是 FS 信号的生成取决于 FIFO 中是否存在数据。 00067 00068 [..] 00069 (@) 在主机接收模式下:使能音频块会立即为外部从机生成位时钟和 FS 信号。 00070 00071 [..] 00072 (@) 为避免 SAI 行为异常,必须遵守以下条件: 00073 (+@) 首位偏移 <= (时隙大小 - 数据大小) 00074 (+@) 数据大小 <= 时隙大小 00075 (+@) 时隙数 x 时隙大小 = 帧长度 00076 (+@) 当选择 SAI_FS_CHANNEL_IDENTIFICATION 时,时隙数应为偶数。 00077 00078 [..] 00079 (@) PDM 接口可通过 HAL_SAI_Init 函数激活。 00080 请注意,PDM 接口仅适用于 SAI1 子块 A。 00081 PDM 麦克风延迟可通过 HAL_SAIEx_ConfigPdmMicDelay 函数进行调整。 00082 00083 [..] 00084 此驱动程序中提供三种操作模式: 00085 00086 *** 轮询模式 IO 操作 *** 00087 ================================= 00088 [..] 00089 (+) 使用 HAL_SAI_Transmit() 在阻塞模式下发送一定量的数据 00090 (+) 使用 HAL_SAI_Receive() 在阻塞模式下接收一定量的数据 00091 00092 *** 中断模式 IO 操作 *** 00093 =================================== 00094 [..] 00095 (+) 使用 HAL_SAI_Transmit_IT() 在非阻塞模式下发送一定量的数据 00096 (+) 传输结束时执行 HAL_SAI_TxCpltCallback(),用户可以通过 00097 自定义函数指针 HAL_SAI_TxCpltCallback() 添加自己的代码 00098 (+) 使用 HAL_SAI_Receive_IT() 在非阻塞模式下接收一定量的数据 00099 (+) 接收结束时执行 HAL_SAI_RxCpltCallback(),用户可以通过 00100 自定义函数指针 HAL_SAI_RxCpltCallback() 添加自己的代码 00101 (+) 如果发生标志错误,将执行 HAL_SAI_ErrorCallback() 函数,用户可以通过 00102 自定义函数指针 HAL_SAI_ErrorCallback() 添加自己的代码 00103 00104 *** DMA 模式 IO 操作 *** 00105 ============================= 00106 [..] 00107 (+) 使用 HAL_SAI_Transmit_DMA() 在非阻塞模式 (DMA) 下发送一定量的数据 00108 (+) 传输结束时执行 HAL_SAI_TxCpltCallback(),用户可以通过 00109 自定义函数指针 HAL_SAI_TxCpltCallback() 添加自己的代码 00110 (+) 使用 HAL_SAI_Receive_DMA() 在非阻塞模式 (DMA) 下接收一定量的数据 00111 (+) 接收结束时执行 HAL_SAI_RxCpltCallback(),用户可以通过 00112 自定义函数指针 HAL_SAI_RxCpltCallback() 添加自己的代码 00113 (+) 如果发生标志错误,将执行 HAL_SAI_ErrorCallback() 函数,用户可以通过 00114 自定义函数指针 HAL_SAI_ErrorCallback() 添加自己的代码 00115 (+) 使用 HAL_SAI_DMAPause() 暂停 DMA 传输 00116 (+) 使用 HAL_SAI_DMAResume() 恢复 DMA 传输 00117 (+) 使用 HAL_SAI_DMAStop() 停止 DMA 传输 00118 00119 *** SAI HAL 驱动程序附加函数列表 *** 00120 =============================================== 00121 [..] 00122 以下是 SAI HAL 驱动程序可用的其他 API: 00123 00124 (+) HAL_SAI_EnableTxMuteMode(): 在发送模式下使能静音 00125 (+) HAL_SAI_DisableTxMuteMode(): 在发送模式下禁用静音 00126 (+) HAL_SAI_EnableRxMuteMode(): 在接收模式下使能静音 00127 (+) HAL_SAI_DisableRxMuteMode(): 在接收模式下禁用静音 00128 (+) HAL_SAI_FlushRxFifo(): 刷新接收 FIFO。 00129 (+) HAL_SAI_Abort(): 中止当前传输 00130 00131 *** SAI HAL 驱动程序宏列表 *** 00132 ================================== 00133 [..] 00134 以下是 SAI HAL 驱动程序中最常用的宏: 00135 00136 (+) __HAL_SAI_ENABLE(): 使能 SAI 外设 00137 (+) __HAL_SAI_DISABLE(): 禁用 SAI 外设 00138 (+) __HAL_SAI_ENABLE_IT(): 使能指定的 SAI 中断 00139 (+) __HAL_SAI_DISABLE_IT(): 禁用指定的 SAI 中断 00140 (+) __HAL_SAI_GET_IT_SOURCE(): 检查指定的 SAI 中断源是否 00141 已使能或已禁用 00142 (+) __HAL_SAI_GET_FLAG(): 检查指定的 SAI 标志是否已设置 00143 00144 *** 回调注册 *** 00145 ============================= 00146 [..] 00147 编译定义 USE_HAL_SAI_REGISTER_CALLBACKS 设置为 1 时, 00148 允许用户动态配置驱动程序回调。 00149 使用函数 HAL_SAI_RegisterCallback() 注册用户回调。 00150 00151 [..] 00152 函数 HAL_SAI_RegisterCallback() 允许注册以下回调: 00153 (+) RxCpltCallback : SAI 接收完成。 00154 (+) RxHalfCpltCallback : SAI 接收半完成。 00155 (+) TxCpltCallback : SAI 发送完成。 00156 (+) TxHalfCpltCallback : SAI 发送半完成。 00157 (+) ErrorCallback : SAI 错误。 00158 (+) MspInitCallback : SAI MspInit。 00159 (+) MspDeInitCallback : SAI MspDeInit。 00160 [..] 00161 此函数接受 HAL 外设句柄、回调 ID 00162 和指向用户回调函数的指针作为参数。 00163 00164 [..] 00165 使用函数 HAL_SAI_UnRegisterCallback() 将回调重置为默认 00166 弱函数。 00167 HAL_SAI_UnRegisterCallback() 接受 HAL 外设句柄 00168 和回调 ID 作为参数。 00169 [..] 00170 此函数允许重置以下回调: 00171 (+) RxCpltCallback : SAI 接收完成。 00172 (+) RxHalfCpltCallback : SAI 接收半完成。 00173 (+) TxCpltCallback : SAI 发送完成。 00174 (+) TxHalfCpltCallback : SAI 发送半完成。 00175 (+) ErrorCallback : SAI 错误。 00176 (+) MspInitCallback : SAI MspInit。 00177 (+) MspDeInitCallback : SAI MspDeInit。 00178 00179 [..] 00180 默认情况下,在 HAL_SAI_Init 之后,如果状态为 HAL_SAI_STATE_RESET, 00181 所有回调都将重置为相应的传统弱函数: 00182 例如 HAL_SAI_RxCpltCallback()、HAL_SAI_ErrorCallback()。 00183 MspInit 和 MspDeInit 回调是例外,它们分别在 HAL_SAI_Init