ST 官方手册UM1905对size参数的说明如下:
当选择 24 位数据帧或 32 位数据帧时,Size参数表示16 位数据的数量。
这意味着,无论数据帧实际位宽是多少,传递给 DMA 的缓冲区长度都必须以int16_t的个数来计量;换句话说,若缓冲区按int32_t类型定义,其长度值需要乘以 2。
我在网上看到多个示例代码均遵循这一规范编写,但该文档描述与实际行为不符:当 I2S 的数据位宽为 32 位或 24 位时,HAL_I2S_Receive_DMA () 函数实际会将size参数解读为缓冲区中int32_t类型数据的个数。
这一行为可通过阅读stm32f7xx_hal_i2s.c源码验证:
如截图所示,该 API 会在数据位宽为 24 位或 32 位时对size参数做补偿处理,导致函数实际行为与文档说明不一致。
文档说明与源码实现,哪一个是正确的?
经验证,该问题在 Nucleo-F722、F446 和 G431 开发板上均存在。其中 F722 所使用的固件为 STM32Cube FW_F7 V1.15.0 版本。
|
|