你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【实战经验】基于STM32 I2S的音频应用开发介绍

[复制链接]
zero99 发布时间:2017-11-7 15:09
基于STM32 I2S的音频应用开发介绍
0 j/ {2 ]% l$ }2 p; s; _/ _
前言2 C$ V5 S2 H# U  d
    在音频开发中,I2S(Inter-IC Sound)接口被广泛采用。大部分STM32集成了I2S接口。本文主要为了让STM32使用者了解I2S音频接口,及快速实现I2S接口的音频应用开发。 首先,对STM32的I2S接口进行简单介绍,然后描述了几种常见I2S音频应用架构及每种架构音频部分的电路图,最后围绕每种架构给出实现例,以便读者进行参考理解。其中,实现例会围绕STM32CubeMX展开,以便开发者能够参考并快速、简便地实现软件开发。除此之外,在Cube软件包中有I2S外设应用例程,提供了更完善的实现参考。
! i( P* _/ Z' U" x) T3 `: N1 s3 K2 Y, W. ?2 M  M! C
一 STM32 I2S接口简介
; G8 _1 ^" C+ _. G3 y    I2S(Inter-IC Sound)是飞利浦公司针对数字音频设备之间的音频数据传输,制定的一种总线标准。$ \, \9 R/ P) s+ ]" @! _
    STM32 I2S接口信号线构成如下表: . z3 m) h4 L) v; N( P$ B& w
11.jpg
) }& Q( ?1 L6 M# \' ]    其中,SD和SD_Ext信号线可分别配置为发送或者接收。在Cube驱动库中已对其进行封装,例如当配置SD信号线为发送端时,SD_Ext自动被配置为接收端;配置SD为接收端时,SD_Ext自动被配置为发送端。
6 V# j/ _) f0 _    全双工I2S是由两个I2S外设组成,如下图所示。
. t' m# q& M2 G4 t) K% J1 ] 12.jpg # N, I4 h7 [5 z: ]  ~$ j* {
    对于构成全双工I2S的每个I2S外设,都具有单独的寄存器组,如下表所示(以STM32F413xG/H为例)。在Cube驱动库中,全双工下的两个I2S外设操作已经被封装,用户只需像配置一个全双工SPI一样,对一个全双工I2S的API进行调用即可。后续会以实例形式进行描述。& C4 L+ h1 B) O4 H3 N
13.jpg
  H' M4 _) J4 p8 l" m% t    STM32 I2S支持四种接口标准和数据格式,如下表。更多内容请参考对应型号STM32的参考手册。
+ G! V6 q) `2 w; [% Y 14.jpg
' R* m; P, D* l$ K; n7 Y& q" K    由表可看出,STM32 I2S支持音频分辨率可为16,24和32位。I2S时钟配置及数据格式选择决定了音频采样率,时钟产生架构如下图所示。不同系列STM32 I2S接口能够支持的最大音频采样率有差异,更多采样率支持情况请参考对应型号STM32的参考手册。$ |  |6 C+ u- y" E- ~9 F
15.jpg 7 W1 K: E" y8 Z, w+ c
: u- {! ~% J' Q" c" k7 y
    图中MCK、CK分别对应I2S总线上的主时钟和总线时钟。其中I2SxCLK获取路径如下图所示(对应于右侧的I2S clocks)。红色线路或者绿色线路可选,本文中以红色线路为例,利用PLL时钟源获取I2SxCLK时钟。9 E" s8 ?) K- m
    注:下图是 STM32F429时钟配置图的部分。不同型号STM32的时钟树存在差异,具体以实际采用型号的时钟树为准。
, [6 G# \# h4 ~# G 16.jpg
: ?7 L$ g9 T5 O% L    在遵循I2S标准的实现方案中,采样率公式如下 (注:Fs为采样率,得益于Cube驱动库中的良好API实现,可以直接设置采样率,使用者不需要按照下述公式进行I2SDIV和IDD的计算及配置。):
0 v+ C7 [+ ]; z+ C  A 17.jpg
6 f' o. e1 @; |9 Z, s    上述采样率公式不能直接用于PDM输出的MEMS麦克风,通过后一节中介绍可知,PDM麦克风访问只是利用了I2S的数据和时钟线,并且在采集到麦克风位流数据后,需要经过降频操作(PDM转PCM,ST提供了PDM转PCM库支持,更多介绍可参考AN3998),从而获得PCM数据。所以,在这种情况下,主时钟配置为失能,数据位宽需要与帧位宽相同。折算后的采样率为:
1 w+ J4 S- Y3 M5 v- S 18.jpg 6 E& F' E; @' X2 v
    其中,DIV为PDM转PCM的降频因子,由调用的API决定。
% C$ B; C* L: F7 [" n; O- }2 _: w: G0 T1 Q' o6 t
二 常见I2S接口音频应用实现; H9 W( [9 [) }' g& z) k0 Q) n$ T
    I2S接口应用相对固定,整理两种音频支持结构如下。9 y- k% A  A4 x
19.jpg 7 O+ [: i! k% R- Q
    其中,麦克风与播放器功能的实现相互独立。可根据实现需要决定采用的实现架构。
. ~8 W( d( i4 P9 N1 a    实现1参考电路如下图。原理图摘自STM32F413H-DISCO板,可在ST官网获取完整的原理图及BOM表等资源。其中CODEC_MCK、CODEC_CK、CODEC_WS、CODEC_SD、CODEC_ext_SD分别对应I2S的MCK、CLK、WS、SD和ext_SD信号线。
' N  J' i" d/ F" [3 F+ _4 {  [ 21.jpg 2 ?6 s/ O6 n! f+ ?/ E! n# x% f+ |
    实现2参考电路如下图。其中单麦电路和双麦电路同时存在仅为读者参考理解,实际开发时可根据应用需要选择单麦或者双麦实现。原理图摘自STM32F411E-DISCO和STM32429I-EVAL板,可在ST官网获取完整的原理图及BOM表等资源。
! b0 {3 s3 I3 C1 b 22.jpg 4 ]4 x, t6 }+ l: x) \
    在实现2中,直接采集麦克风数据。市面上MEMS麦克风有PCM输出和PDM输出之分,其中PDM麦克风由于内部结构相对简单,成本更低,被大量采用。图中MP45DT02和MP34DT01TR都为PDM输出的MEMS麦克风。PDM数据不能直接使用,需要经过滤波,降频等操作获得PCM数据。
% ?$ i9 [5 ]$ \+ S* C+ |    另外,I2S对双麦克风的支持需要结合定时器及2个IO复用引脚。实现框架如下图。  J$ R" t9 U7 X. f+ E2 ~4 P
23.jpg
( D+ K6 p4 T) s( J5 m; d    通过定时器对I2S_CLK信号进行两分频输出,然后将获得的信号提供给MEMS麦克风的数据线。实现时序图如下所示。依据I2S 标准(Pilips标准、左对齐标准和右对齐标准)时序, I2S_CLK的上升沿获取数据。而对于文中提及的两种MEMS麦克风,输入时钟(TIM_CLK_OUT)的下降沿使得左通道麦克风(LR引脚下拉)输出有效数据,右通道麦克风(LR引脚上拉)数据线进入高阻态;输入时钟的上升沿,左通道麦克风数据线进入高阻态,右通道麦克风输出有效数据。从而实现双麦克风采集。& ^9 T4 h5 a5 S/ x. Y
24.jpg
0 |5 I) l, P/ H! @5 C6 u4 _& i7 C5 x# J% D- }) c7 G
三 应用实现例: u3 p( I  C; J* o) W  p6 }4 e
    本节围绕上述介绍的两种典型实现架构,结合ST评估板,介绍I2S接口应用在STM32CubeMX工具上配置实现,以及在生成工程后的API调用,最终实现基于I2S接口的音频数据传输。利用STM32CubeMX,能够更快的实现针对自定义STM32平台的开发。实现流程如下。
0 B4 m% G6 s5 e* {9 H* V 25.jpg , I. _9 }+ k4 C( r. }* H3 C; l) B
- ~8 [9 G8 e) z, C+ S
3.1 前期准备
7 q6 d8 _7 e/ i+ d4 E9 Y3 L3 j 26.jpg
- B, A" E+ j3 \8 C( `$ A. a, t' W0 Q
/ y" y1 ?: G* z, a3.2 应用实现9 w# v4 Q8 @; t5 u$ X
& t, B( T; g( P7 q

( c2 ]% ~  U1 g3.2.1 实现1) k, t0 q$ D0 Q# u. t: l' q) }
    结合STM32CubeMX的软件开发流程如下图。' R/ v" P  W" g+ `4 T! b
27.jpg % J6 M2 z) l) K) R3 ?
    接下来一步一步呈现实现过程。+ Z: j' O& T6 s4 B" ]: }# H
    步骤1:在STM32CubeMX中根据硬件选择STM32F413ZHTx、外部时钟、调试接口、I2C通道和I2S通道(利用I2C接口配置和控制编解码器),如下截图。硬件电路原理图可以在上节的链接网址中获取。其中,I2S工作于主模式。
  e% o% u0 h' V& Z9 f" J; w$ _ 28.jpg
8 V4 i8 y7 U" P' @5 x2 ^7 m0 @! ^# i
    选择各外设后,由于外设功能可关联到不同的引脚,自动分配的引脚可能与硬件连接的引脚不一致。此时,可以在需要重新关联的引脚上按住Ctrl键+鼠标左键按下,出现支持相同功能的全部复用引脚,将其拖动到与硬件设计一致的引脚上。如上图步骤5所示。9 q& S; f6 T9 F
    步骤2:时钟配置。时钟配置涉及环节较多,STM32CubeMX提供了便捷的时钟配置实现,如下图,只需简单的几步,即可获得最高主频运行的时钟配置。需要注意“ Input Frequency ”值,应保持与外部高速时钟一致。
) j0 A# u: ?. f' h# T& h    尽管在上述I2S接口介绍中, I2S采样率与时钟配置有关联,但在HAL库实现中会根据I2S中的采样率参数,自动完成时钟参数配置。
) W& ^% }  e, O- ~! x2 } 29.jpg % E+ U$ p1 e/ X& {) q' V
    步骤3:I2S配置。点击切换到Configuration标签页,按照如下步骤进入I2S配置界面。
$ a5 M& `3 ?- x3 c( h0 k 31.jpg
- v* O# x" g7 [# i- \% V# k7 n% h 1 }) h# ], ~& I# l# h( t
    I2S 参数配置。配置后截图如下。
6 z* `- V- T/ T+ G1 ~* k 32.jpg 8 B6 _/ N+ ^3 e5 V# @* V
    Transmission Mode: 传输模式。决定SD数据线传输方向(SD_Ext方向相反)。根据硬件设计, I2Sx_SD向编解码器输出数据,所以选择发送模式。
" b  |# O5 A2 H1 {8 G    Communication Standard: 传输标准。本文中采用I2S Philips标准(需要利用I2C发送命令配置WM8994工作于相同标准)。: N/ |' ^' E* g3 {3 b5 J6 P2 W$ y7 ?
    Data and Frame Format: 数据位宽和帧位宽。如同“传输标准”的配置,保持与编解码器配置一致。9 F# m* ?/ F. k1 k
    Selected Audio Frequency: 音频频率。可选频率8KHz、11KHz、16KHz、22KHz、32KHz、44KHz、48KHz、96KHz、192KHz,这里选择48KHz。如同“传输标准”的配置,保持与编解码器配置一致。+ u+ e+ r+ [2 p/ c2 `7 s2 ?8 @
    Clock polarity:时钟极性(非激活态时)。- K' m" b3 B% v; j. j
    I2S DMA设置。切换到DMA Settings标签页,按照下图步骤设置。(图为设置完成后截图。)
5 X1 w1 P4 u+ c, z 33.jpg # v7 u9 x. f! n$ f
    步骤4:I2C配置。点击FMPI2C1图标进入FMPI2C配置界面,参数配置如下图。参数介绍请参考对应型号的参考手册。- r( K$ t0 n% r; o4 G' X6 {6 I& ~
34.jpg
$ h8 P( j. q0 _* o. f7 V) r. |    步骤5:生成IAR工程文件。在菜单栏 \ Project \ Settings打开工程设置界面,设置工程名、工程存放位置以及对应的IDE工具(本文中采用IAR EWARM)。其他保持默认,更多参数介绍请参考UM1718。
( L+ `0 E" v& I    点击菜单栏 \ Project \ Generate code生成工程。STM32CubeMX生成工程中包含了时钟、外设等初始化。开发者可以在此基础上增加函数调用实现应用开发。
6 d8 B& I% n- @& x, B+ C5 i    步骤6:利用IAR EWARM打开工程,添加API调用,实现音频数据传输,具体步骤如下。
( Y5 O! E- N) d& {( H6 q    1. 添加编解码器wm8994的驱动函数。为简化操作,直接采用Cube软件包中提供的wm8994驱动文件wm8994.c,wm8994.h和audio.h(文件位于STM32Cube_FW_F4_V1.16.0\Drivers\BSP\Components\wm8994和STM32Cube_FW_F4_V1.16.0\Drivers\BSP\Components\Common)。其中wm8994.c复制到src文件夹中,wm8994.h和audio.h复制到inc文件夹中,并添加到工程中,如下图。- s. F8 r! |1 f# e
35.jpg
* {6 b3 i; u; [; K8 e2 K2 x, m" D    2. 按照下表增添应用代码。实现如下音频数据流向。为简便起见,直接将I2S接收和发送关联到同一个存储空间,并同时执行,在实际应用中,应加以优化完善,避免读写位置交错引起的错误。
; u2 o- t/ Y, l: T5 j    另外,由于硬件上仅有一路麦克风通道输入,尽管采用双麦克风通道配置,但有一路麦克风通道无有效数据,体现在耳机输出上,有一路无有效输出。8 d; i( T+ `4 o0 {
36.jpg & V/ N7 K/ o5 I8 o- J
    3. 编译生成执行文件,下载运行。
" \8 b; @- M1 a/ O    注:下表中省略号表示,之间有其他未列出的代码部分。
7 w# ^1 u* {5 f! I
" n. t- d$ V) s" `! t4 x  m 37.jpg 38.jpg ; g: T! q9 x" g$ |
39.jpg
0 h! ]1 l( P% \) N" o) D* o
; k+ A) d. J% i. }7 Q; N9 g    由上述添加及修改,可知在利用STM32CubeMX配置、生成工程后,I2S数据接收和发送实现方便,只需要调用HAL库提供的API即可。工作较多集中在STM32的音频接口了解和编解码器功能配置方面。编解码器方面,一般编解码器厂商会有文档、配套工具或者配置例程提供。2 q4 A5 [* H( ?! d. w" m) g
% Y! K7 Q  y* @/ k
3.2.2 实现2
# W3 K, [- q' w1 n1 f( C* c$ k! o    这种架构实现例,可参考Cube软件包中提供的例程,不再做展开介绍。例程路径如下:
# n( t, ^2 M) ?' m7 U7 }( Z8 V    1.STM32Cube_FW_F4_V1.16.0\Projects\STM32F401-Discovery\Applications\Audio\Audio_playback_and_record
# I. U0 p4 S/ h* ~& R* d  c    2.STM32Cube_FW_F4_V1.16.0\Projects\STM32F411E-Discovery\Applications\Audio\Audio_playback_and_record. k4 y% P0 G2 s1 q( I
4 ?* h; L7 u: \1 J( ?
四 低功耗设计+ @2 g2 J" {7 N
    不同功耗模式下,I2S工作情况如下表。3 I9 ]) P. [. M
41.jpg
7 p, n; {/ a. u4 [0 E% E    注1. 不同系列STM32,低功耗模式有差异,具体以参考手册为准。1 b) z" o" A! s/ Q5 V# W2 R$ d/ }. ^
    注2. 批处理模式(BAM)并非所有STM32产品都支持,支持情况请以对应型号的STM32参考手册中描述为准。BAM能够实现在睡眠模式下,批量获取数据,然后再退出睡眠模式进行运算处理等操作。能够进一步实现功耗的降低。更多关于BAM介绍可参考RM0430。' N( g: E# W- ?0 Y8 D7 h* \& x, a* `
7 H- z# j1 m+ A7 X/ u$ w2 v
五 小结
# ~; _& G, w- `" {4 j* A+ ?5 r' [    在STM32音频开发中,结合STM32CubeMX和Cube软件包中提供的例程,容易完成基于STM32的音频平台搭建。I2S各协议时序清晰,开发过程中,出现异常时,开发者可以先利用示波器,判断波形对应时序是否正确,以此缩小问题范围,加快问题定位及解决。; f& H* ~  H+ P9 Z. s3 X* o- r
6 l3 D' Q3 J! H. M% g+ Z9 o$ P

" H; O/ e/ U) X% d* t参考文档
- _* H' ?8 `, ]0 f/ _5 C3 U( T3 [4 fRM0430  STM32F413/423 advanced ARM®-based 32-bit MCUs4 r* }2 }% ]) L. z  `5 n
AN2739  How to use the high-density STM32F103xx microcontroller to play audio files with an external I²S audio codec2 |8 ]0 j, R1 a, y1 f0 ~
AN3998  PDM audio software decoding on STM32 microcontrollers: {+ K" t5 e1 u$ y1 V+ j+ s$ t
UM1718  STM32CubeMX for STM32 configuration and initialization C code generation
: l' z7 q& ^+ P3 Z# Q
2 j4 a2 S- r- p( f) L" {9 S! w0 G# ]. C) f. W/ N
文档下载1>>         文档下载2>>       更多实战经验>>       & R- |& N5 T  v% u: c- P
赞 收藏 5 评论5 发布时间:2017-11-7 15:09

举报

5个回答
adlu 回答时间:2017-11-7 17:38:27
腻害了!
typhoon5168 回答时间:2019-2-15 11:16:05
剛好需要這資料, 學習了
chunzhang 回答时间:2019-6-3 17:41:12
本帖最后由 chunzhang 于 2019-6-3 17:42 编辑 0 `  W8 S/ t2 R3 I$ Z( ?

0 f* E; T1 d: R+ I6 _您好,那个实现二,没找到。能提供一下吗。
pkoko 回答时间:2020-5-9 10:32:45
详细,谢谢分享
灯火通明yun 回答时间:2022-7-6 16:09:37
一点自己的东西都没有,你还不如直接分享《基于STM32_I2S的音频应用开发介绍.pdf》来的爽快,净是些Copy

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版