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

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

[复制链接]
zero99 发布时间:2017-11-7 15:09
基于STM32 I2S的音频应用开发介绍

6 x, R: a( t& G7 J前言1 l9 z" X9 V0 K) H
    在音频开发中,I2S(Inter-IC Sound)接口被广泛采用。大部分STM32集成了I2S接口。本文主要为了让STM32使用者了解I2S音频接口,及快速实现I2S接口的音频应用开发。 首先,对STM32的I2S接口进行简单介绍,然后描述了几种常见I2S音频应用架构及每种架构音频部分的电路图,最后围绕每种架构给出实现例,以便读者进行参考理解。其中,实现例会围绕STM32CubeMX展开,以便开发者能够参考并快速、简便地实现软件开发。除此之外,在Cube软件包中有I2S外设应用例程,提供了更完善的实现参考。
1 m! ?/ B" u! L. F" T( W& t8 O7 Y& M
一 STM32 I2S接口简介% p4 D: {5 ~8 z4 e, m/ U; _' h! u
    I2S(Inter-IC Sound)是飞利浦公司针对数字音频设备之间的音频数据传输,制定的一种总线标准。1 c2 Q# M' ]! \" D0 |' V4 P8 T' `& \: f. A
    STM32 I2S接口信号线构成如下表:
2 n* [4 e  M) S. \/ H* B! L 11.jpg . h3 D5 M- r9 Z6 c4 F- ]- c0 h# ]0 a
    其中,SD和SD_Ext信号线可分别配置为发送或者接收。在Cube驱动库中已对其进行封装,例如当配置SD信号线为发送端时,SD_Ext自动被配置为接收端;配置SD为接收端时,SD_Ext自动被配置为发送端。3 C: @5 I; B: R) c. g6 Q
    全双工I2S是由两个I2S外设组成,如下图所示。  E. L  a  `! C) N( B2 a
12.jpg
) u' U( F- m4 x7 @8 r/ C2 B* F8 d; ^    对于构成全双工I2S的每个I2S外设,都具有单独的寄存器组,如下表所示(以STM32F413xG/H为例)。在Cube驱动库中,全双工下的两个I2S外设操作已经被封装,用户只需像配置一个全双工SPI一样,对一个全双工I2S的API进行调用即可。后续会以实例形式进行描述。
( Y$ R3 G/ v! s5 ~6 t! I7 T( O9 n 13.jpg
- H/ F4 _0 b( ~. p    STM32 I2S支持四种接口标准和数据格式,如下表。更多内容请参考对应型号STM32的参考手册。 0 {3 ^) ?9 h9 }7 Q" E
14.jpg
" P# ?9 w8 e. Q* D7 d0 b- t    由表可看出,STM32 I2S支持音频分辨率可为16,24和32位。I2S时钟配置及数据格式选择决定了音频采样率,时钟产生架构如下图所示。不同系列STM32 I2S接口能够支持的最大音频采样率有差异,更多采样率支持情况请参考对应型号STM32的参考手册。
" j% n: y5 r0 l5 s$ m/ V6 l+ ^- B 15.jpg
9 y; _6 P* t% G1 ?; t( u; y9 `
* {; a/ {0 a7 L! H3 ?% b: L" V    图中MCK、CK分别对应I2S总线上的主时钟和总线时钟。其中I2SxCLK获取路径如下图所示(对应于右侧的I2S clocks)。红色线路或者绿色线路可选,本文中以红色线路为例,利用PLL时钟源获取I2SxCLK时钟。
* f7 w8 |$ d* `; Q, h/ l) F    注:下图是 STM32F429时钟配置图的部分。不同型号STM32的时钟树存在差异,具体以实际采用型号的时钟树为准。
( z9 ]* a' ~$ \% U) Y 16.jpg
; S& x) d0 O" _' d3 f7 Q3 h    在遵循I2S标准的实现方案中,采样率公式如下 (注:Fs为采样率,得益于Cube驱动库中的良好API实现,可以直接设置采样率,使用者不需要按照下述公式进行I2SDIV和IDD的计算及配置。):
$ e  h9 o0 v* D" |! r4 X/ ` 17.jpg - D% c2 @: J) q+ N# R  _- c: U
    上述采样率公式不能直接用于PDM输出的MEMS麦克风,通过后一节中介绍可知,PDM麦克风访问只是利用了I2S的数据和时钟线,并且在采集到麦克风位流数据后,需要经过降频操作(PDM转PCM,ST提供了PDM转PCM库支持,更多介绍可参考AN3998),从而获得PCM数据。所以,在这种情况下,主时钟配置为失能,数据位宽需要与帧位宽相同。折算后的采样率为:
% P$ t- N* B! h, u8 l" V 18.jpg # Y: x; `' `5 [7 s0 W
    其中,DIV为PDM转PCM的降频因子,由调用的API决定。$ v( h  s- v9 Z8 u( N/ H# a. P  Q
  {* j/ J3 j4 r" Z
二 常见I2S接口音频应用实现0 q/ f& ~: K0 g- F+ g
    I2S接口应用相对固定,整理两种音频支持结构如下。* }' y6 Z7 c0 W2 T# Z9 R
19.jpg ' j5 Q, \3 r9 r" K: _  ^  o) z/ p
    其中,麦克风与播放器功能的实现相互独立。可根据实现需要决定采用的实现架构。% A+ k2 G/ @: d) r
    实现1参考电路如下图。原理图摘自STM32F413H-DISCO板,可在ST官网获取完整的原理图及BOM表等资源。其中CODEC_MCK、CODEC_CK、CODEC_WS、CODEC_SD、CODEC_ext_SD分别对应I2S的MCK、CLK、WS、SD和ext_SD信号线。' f  [7 \8 V+ c. g0 e- m9 t
21.jpg ) j1 b4 o* ]/ {
    实现2参考电路如下图。其中单麦电路和双麦电路同时存在仅为读者参考理解,实际开发时可根据应用需要选择单麦或者双麦实现。原理图摘自STM32F411E-DISCO和STM32429I-EVAL板,可在ST官网获取完整的原理图及BOM表等资源。4 C* Y0 D8 [1 o' L: `7 |+ B
22.jpg
6 ^8 [: O7 n3 G0 ~7 {7 s    在实现2中,直接采集麦克风数据。市面上MEMS麦克风有PCM输出和PDM输出之分,其中PDM麦克风由于内部结构相对简单,成本更低,被大量采用。图中MP45DT02和MP34DT01TR都为PDM输出的MEMS麦克风。PDM数据不能直接使用,需要经过滤波,降频等操作获得PCM数据。
) x# A/ |- a1 K! i8 N    另外,I2S对双麦克风的支持需要结合定时器及2个IO复用引脚。实现框架如下图。
- C9 f0 M" L! R' c; s/ n 23.jpg ' }# o9 Y) ]4 Z: i( |5 L  Q( M
    通过定时器对I2S_CLK信号进行两分频输出,然后将获得的信号提供给MEMS麦克风的数据线。实现时序图如下所示。依据I2S 标准(Pilips标准、左对齐标准和右对齐标准)时序, I2S_CLK的上升沿获取数据。而对于文中提及的两种MEMS麦克风,输入时钟(TIM_CLK_OUT)的下降沿使得左通道麦克风(LR引脚下拉)输出有效数据,右通道麦克风(LR引脚上拉)数据线进入高阻态;输入时钟的上升沿,左通道麦克风数据线进入高阻态,右通道麦克风输出有效数据。从而实现双麦克风采集。' Q3 v+ [" \4 N
24.jpg
' G* o* Z0 x  Y0 ?3 f" A" R1 q: `$ _; D
三 应用实现例
/ Q: |% v+ o6 s# c: ]( b    本节围绕上述介绍的两种典型实现架构,结合ST评估板,介绍I2S接口应用在STM32CubeMX工具上配置实现,以及在生成工程后的API调用,最终实现基于I2S接口的音频数据传输。利用STM32CubeMX,能够更快的实现针对自定义STM32平台的开发。实现流程如下。
6 z5 M& w& ?# ` 25.jpg . }( q; }6 R# |+ w* R4 \- b
1 k/ Y5 Z8 b6 e! X6 }
3.1 前期准备
. i; \0 R3 y! ?- i$ F 26.jpg 3 o% s5 I" H2 c4 l

# a2 K- @% d# J9 j3.2 应用实现/ M! j9 z7 V" h! f

% P! [7 N, A7 b, e9 Q( {# @6 p2 ]: j9 i) c  x2 ^
3.2.1 实现1
) F4 g8 p" n2 Z- ~! o$ O    结合STM32CubeMX的软件开发流程如下图。
! z. J" T2 U/ b. i1 i 27.jpg
3 W' O: Z% D, L8 k9 W& D    接下来一步一步呈现实现过程。
$ l! x$ t" S. u3 f    步骤1:在STM32CubeMX中根据硬件选择STM32F413ZHTx、外部时钟、调试接口、I2C通道和I2S通道(利用I2C接口配置和控制编解码器),如下截图。硬件电路原理图可以在上节的链接网址中获取。其中,I2S工作于主模式。
. J" w4 O5 A, L8 p! J& R- { 28.jpg
5 b+ C. p0 a; ?- ]$ w6 J- ]( U
7 b& X' _0 T1 C: @    选择各外设后,由于外设功能可关联到不同的引脚,自动分配的引脚可能与硬件连接的引脚不一致。此时,可以在需要重新关联的引脚上按住Ctrl键+鼠标左键按下,出现支持相同功能的全部复用引脚,将其拖动到与硬件设计一致的引脚上。如上图步骤5所示。
7 B8 O  J! @7 @/ V    步骤2:时钟配置。时钟配置涉及环节较多,STM32CubeMX提供了便捷的时钟配置实现,如下图,只需简单的几步,即可获得最高主频运行的时钟配置。需要注意“ Input Frequency ”值,应保持与外部高速时钟一致。0 Y, h5 \$ H% e
    尽管在上述I2S接口介绍中, I2S采样率与时钟配置有关联,但在HAL库实现中会根据I2S中的采样率参数,自动完成时钟参数配置。6 e5 k2 D% b. g- x* J6 P7 A* h; O9 w
29.jpg 7 d+ C. w: b8 z1 P$ _' S
    步骤3:I2S配置。点击切换到Configuration标签页,按照如下步骤进入I2S配置界面。/ _' x. J8 ^. ^/ s
31.jpg - b3 @; J7 X4 x" O1 t
$ N& Q9 v- d/ P+ T9 ?2 i
    I2S 参数配置。配置后截图如下。4 [- P0 ~" J' S
32.jpg
) A1 e' S. e( z- F9 n    Transmission Mode: 传输模式。决定SD数据线传输方向(SD_Ext方向相反)。根据硬件设计, I2Sx_SD向编解码器输出数据,所以选择发送模式。
6 R6 w8 Y( m: s$ g; M6 Z    Communication Standard: 传输标准。本文中采用I2S Philips标准(需要利用I2C发送命令配置WM8994工作于相同标准)。
+ S: W! W! B% H; I9 h+ f    Data and Frame Format: 数据位宽和帧位宽。如同“传输标准”的配置,保持与编解码器配置一致。: z: e- o, e5 J1 ?* d
    Selected Audio Frequency: 音频频率。可选频率8KHz、11KHz、16KHz、22KHz、32KHz、44KHz、48KHz、96KHz、192KHz,这里选择48KHz。如同“传输标准”的配置,保持与编解码器配置一致。% ]: T5 ~8 G+ R' S8 P1 ^; Y* J/ f
    Clock polarity:时钟极性(非激活态时)。8 H# ]4 [% W# r( W) o4 v! c
    I2S DMA设置。切换到DMA Settings标签页,按照下图步骤设置。(图为设置完成后截图。)
  C. S; t9 V: l8 R1 n: Z$ {% V( n 33.jpg $ _) t1 f6 q/ p+ Y8 j1 T
    步骤4:I2C配置。点击FMPI2C1图标进入FMPI2C配置界面,参数配置如下图。参数介绍请参考对应型号的参考手册。, f7 z2 q, y3 H$ j6 h$ k
34.jpg
- u2 m4 x4 Q/ e" |- w    步骤5:生成IAR工程文件。在菜单栏 \ Project \ Settings打开工程设置界面,设置工程名、工程存放位置以及对应的IDE工具(本文中采用IAR EWARM)。其他保持默认,更多参数介绍请参考UM1718。
$ T$ r) C( {" A3 O    点击菜单栏 \ Project \ Generate code生成工程。STM32CubeMX生成工程中包含了时钟、外设等初始化。开发者可以在此基础上增加函数调用实现应用开发。2 j2 W. h; A! V3 Z* [: I3 v
    步骤6:利用IAR EWARM打开工程,添加API调用,实现音频数据传输,具体步骤如下。
/ o6 P# T( w4 e9 D    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文件夹中,并添加到工程中,如下图。
! z& T& x) Y" k! Y& }  O  _/ W: K( j) R 35.jpg
- H  z, \" z3 m    2. 按照下表增添应用代码。实现如下音频数据流向。为简便起见,直接将I2S接收和发送关联到同一个存储空间,并同时执行,在实际应用中,应加以优化完善,避免读写位置交错引起的错误。
# V- c. u3 ~# @* x0 s: z: M" w' l    另外,由于硬件上仅有一路麦克风通道输入,尽管采用双麦克风通道配置,但有一路麦克风通道无有效数据,体现在耳机输出上,有一路无有效输出。. s! p8 ~! c8 U' a6 y, `- x3 l
36.jpg
* o' P. J0 z/ b    3. 编译生成执行文件,下载运行。4 C7 `/ b" V. n3 w1 T
    注:下表中省略号表示,之间有其他未列出的代码部分。
# p& P# Q% n4 P# x/ _) V
1 Z1 Z# `0 A8 r5 u" b 37.jpg 38.jpg
; M/ B. m$ y& P" X, ^ 39.jpg # S8 O8 ~: G) h9 P
; u. b9 _# ~0 L2 x  T# c% L
    由上述添加及修改,可知在利用STM32CubeMX配置、生成工程后,I2S数据接收和发送实现方便,只需要调用HAL库提供的API即可。工作较多集中在STM32的音频接口了解和编解码器功能配置方面。编解码器方面,一般编解码器厂商会有文档、配套工具或者配置例程提供。+ |- F! p" e8 g3 E6 v( E
( A3 c$ D6 w- z$ p
3.2.2 实现2
4 S0 y4 k0 i4 Z* c  H    这种架构实现例,可参考Cube软件包中提供的例程,不再做展开介绍。例程路径如下:
7 L) F$ b7 F& ]. V- A2 {    1.STM32Cube_FW_F4_V1.16.0\Projects\STM32F401-Discovery\Applications\Audio\Audio_playback_and_record1 f2 m1 E2 v8 s' T5 I7 }/ C
    2.STM32Cube_FW_F4_V1.16.0\Projects\STM32F411E-Discovery\Applications\Audio\Audio_playback_and_record
8 f( ~6 X7 x7 H) G7 x% ^3 u0 G- n8 C; x* s" D- R) G8 ]
四 低功耗设计
) i. A, ^, m/ B! t7 Y! W    不同功耗模式下,I2S工作情况如下表。
; W7 A1 g# `6 Y# P- ] 41.jpg
8 ~1 I( f! }* O2 F# l3 B    注1. 不同系列STM32,低功耗模式有差异,具体以参考手册为准。0 V0 i* ]8 H1 c; Q5 Z  y: \' x5 F
    注2. 批处理模式(BAM)并非所有STM32产品都支持,支持情况请以对应型号的STM32参考手册中描述为准。BAM能够实现在睡眠模式下,批量获取数据,然后再退出睡眠模式进行运算处理等操作。能够进一步实现功耗的降低。更多关于BAM介绍可参考RM0430。
( r6 s! I  v3 B4 J# U* q
3 x  k$ V5 W9 b3 ^1 ~2 ^2 V9 ~五 小结
% r' N2 C5 s4 R: A+ p5 S  O    在STM32音频开发中,结合STM32CubeMX和Cube软件包中提供的例程,容易完成基于STM32的音频平台搭建。I2S各协议时序清晰,开发过程中,出现异常时,开发者可以先利用示波器,判断波形对应时序是否正确,以此缩小问题范围,加快问题定位及解决。" j8 d. N$ F3 V- e( C
, W1 b# O' Y) E! C8 O4 Z) l
* z4 ]* t6 ^% u9 o2 m
参考文档% A4 c( t6 @- ]2 B6 W! n; n8 k
RM0430  STM32F413/423 advanced ARM®-based 32-bit MCUs
* T& J; w: b% k; NAN2739  How to use the high-density STM32F103xx microcontroller to play audio files with an external I²S audio codec* G5 ], _( s3 O
AN3998  PDM audio software decoding on STM32 microcontrollers
+ y4 {! y, r6 C# s5 ]4 v( gUM1718  STM32CubeMX for STM32 configuration and initialization C code generation; E9 k$ @) _" [' Q

! i* I$ Y& y4 O  Y4 c1 s+ l' b" m& N9 f6 Z% Q# @5 Y
文档下载1>>         文档下载2>>       更多实战经验>>       6 P2 U" U6 i6 U
赞 收藏 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 编辑
+ b# o9 n, H! n& A) w# N, Y5 T5 ^. c4 b) T7 u! V& Z
您好,那个实现二,没找到。能提供一下吗。
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 手机版