HAL_I2S_Receive_DMA()のバグ

By | 2020年2月11日

STM32 Cube HALのHAL_I2S_Receive_DMA()にはバグが有ります。

このAPIはsize引数でデータの長さを指定することに成っていますが、ドキュメント(UM1905)によれば、sizeの長さはバッファ内部のデータ型によらず、int16_t型のサイズで測ったデータ個数を与えることに成っています。

話がややこしいですね。

例えば、I2S信号フレームで32bitオーディオデータを扱う場合、メモリ上のオーディオデータも当然ながら1サンプルが32bitとなります。LR両チャンネル合わせて32データ分のバッファのサイズは128Byteとなります。この場合、直感的にはsizeパラメタに32を与えたくなりますが、UM1905の説明では、64を与えるべきとなります。

しかしながら、実際にはこの補正はAPI内部で行われています。ですから、仕様書通りにプログラムを書くと、DMAがバッファ・オーバーランを起こします。私の場合、ヒープ中のデータをめちゃめちゃにされたため、セマフォが破壊されると言った事象がプログラムと非同期に発生し、解析に手間取りました(結局、自分のプログラムにはバグは無いという結論に達し、HALにバグがあるとすればどんな問題かと仮定しながら調査して問題が判明した)。

この問題はNucleo-F722, F446, G431で再現しています。F722のHALファームウェアバージョンは1.15.0です。

この問題はコミュニティに報告済みです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください