网站导航: 首页 > 设计参考 > 正文 文章搜索
基于uCOS II的MP3文件播放系统设计
 
文章编号:
091115142359
文章分类: 单片机 ARM
点 击:
...
关 键 词: uCOS,MP3
文章来源:
网络
摘 要:
MP3文件解码一般采用软件解码和硬件解码两种方法。硬件解码实现简单,但需增加硬件成本。软件解码需占用大量CPU时间,实现难度大,但成本低、处理灵活,只要CPU具有足够的处理速度则是一种很好选择

1 引言
    近几年,MP3音频产品受到消费者的青睐,而高质量的音效是当前MP3音频产品发展的重要趋势。MP3文件解码一般采用软件解码和硬件解码两种方法。硬件解码实现简单,但需增加硬件成本。软件解码需占用大量CPU时间,实现难度大,但成本低、处理灵活,只要CPU具有足够的处理速度则是一种很好选择。本文介绍了MP3文件播放系统硬件和软件设计,采用Cirrus Logic公司的EP9315处理器和UDA1341编解码器,并介绍了基于uC/OS-II开源实时操作系统的MP3解码原理,播放函数以及硬件接口初始化等。

2 MP3编解码原理
    MP3是MPEG-1 Audio Layer-3的缩写,它是一套完整的基于感知的音频编码算法。这一算法应用了心理声学模型可达到1:12的压缩比率。心理声模型应用于人耳特性,最大限度保持原始声音质量。MPEG-1 Audio编码对象是20 Hz~20 000 Hz的宽带声音,采用感知子带编码,也叫做子带编码(sub-band coding,SBC),从而达到既压缩声音数据又尽可能保持声音原有质量的目的。SBC编码对象不局限于话音数据和某一种声源。具体思想是:首先把时域中的声音数据变换到频域,对频域内的子带分量分别量化和编码,根据心理声学模型确定样本精度,从而达到压缩数据量的目的。子带编码的理论根据是听觉系统的掩蔽特性,主要是利用频域掩蔽特性,编码过程中保留信号带宽,但是却扔掉被掩蔽的信号,因此编码后还原(解码、重构)的声音信号与编码前的声音信号不相同.但人的听觉系统很难分辨出它们的差别。因此.对于听觉系统,这种压缩是“无损压缩”。
    当打开MP3文件后,播放器首先试图对帧进行同步,然后分别读取通道息及增益因子等数据,再进行霍夫曼解码,至此已获得解压数据。但这些数据不能播放,它们仍处于频域,若要播放,还需将其通过特定手段由频域变换到时域。然后再分别进行立体化处理、抗锯齿处理、IMDCT变换、IDCT变换及窗口化滑动处理。这样得到的数据就可进行D/A转换并播放。
    MP3歌曲的解码是一个非常复杂的过程.可通过Start_mp3_decode()解码函数完成。另外,还需给解码函数进行供给数据、针对音频接口的初始化、针对播放过程的初始化等操作。

3 系统硬件设计
3.1 系统结构分析
    本系统以EP9315为核心.包括Philips公司的UDA1341型立体声音频编解码器、SDRAM、Flash存储器。处理器通过IIS接口控制音频数据在系统内存(SDRAM)与UDA1341之间传输。通过L3控制端口实现UDA1341的配置和控制,本设计系统MP3采用USB Host结构。使用时需插U盘。系统结构图如图1所示。
 
图1 系统结构图
3.2 音频解码器接口部分
   IIS(inter-IC Sound)总线是Philips公司提出的串行数字音频总线协议。它是一种面向多媒体的音频总线专用于音频设备之间的数据传输,为数字立体声提供序列的连接至标准编解码器。IIS总线只处理声音数据,其他信号(如控制信号)必须单独传输。为了使电路的引出脚尽可能少,IIS只使用3条串行总线提供分时复用功能的数据线、字段选择线和时钟信号线。
    整个音频系统的硬件设计主要是CPU与编解码器的连接。本系统采用Philips公司的基于IIS音频总线UDA1341型音频编解码器。UDA1341支持IIS总线数据格式,采用位元流转换技术进行信号处理,具有可编程增益放大器(PGA)和数字自动增益控制器(AGC)。UDA1341对外提供两组音频信号输入接口.每组包括左右2个声道。由于IIS总线只处理音频数据,因此UDA1341还内置用于传输控制信号的L3总线接口。L3接口相当于混音器控制接口,可以控制输入/输出音频信号的低音及音量大小等。L3接口接至EP9315的3个通用GPIO输入输出引脚。EP9315内置多达6通道的IIS总线接口,可直接外接16位的立体声编解码器,含有3个发送通道和3个接收通道。EP9315支持12个独立的DMA通道,其中10个通道是用于外围模块与存储器之间的数据传输,另外2个通道是专用于存储器之间的数据传输。
    如图2所示,器件EP9315的IIS总线信号与UDA1341的IIS信号直接相连接。L3接口的引脚L3MODE、L3CLOCK和L3DATA分别与EP9315的EGP1012、EGPIO11和EGPIO10通用数据输出引脚相连,利用这3个I/O端口模拟L3总线的全部时序和协议实现控制。
 
图2 音频部分连接图

4 软件设计
4.1 嵌入式实时操作系统uC/OS-II
    对大多数移动设备而言,采用公开源代码的操作系统uC/OS-II是最好的选择。uC/OS-II是一个完整、可移植、可同化及可裁减占先实时多任务内核。uC/OS-II大致分为内核、任务管理、时间管理、任务同步与通信、与CPU的接口等5部分,其中任务管理部分与任务操作密切相关,包括任务建立、删除、挂起、恢复等。任务同步与通信部分包括信号邮箱、邮箱队列和时间标志等部分,主要用于任务间的相互联系和对临界资源的访问吲。

4.2 uC/OS-II内核的多任务管理
    uC/OS-II除了具有良好的稳定性和安全性外.主要是对多任务的管理,可以管理多达64个任务。除了8个自用任务外,用户的应用程序最多可达56个任务。
    在多任务系统中,内核负责管理各个任务,并且负责任务之间的通信。内核提高的基本服务是任务切换。由实时内核管理。一个任务有5种状态,在任意给定时刻,任务状态一定是这5种状态之一:休眠、就绪、运行、挂起(等待某事件发生)和被中断。
    uC/OS-II总是进入就绪状态任务中优先级最高的那一个。通过任务级的调度函数OSSched()或者中断级的调度函数OSIntExt()在任务就绪列表OSRdyTb()中查找,在确定优先级最高的就绪态任务后,如果有更高优先级的任务要运行,调用OS_TASK_SW()完成实际的任务切换。

4.3 uC/OS-II任务间通信
    uC/OS-II有3种用于数据共享和任务通信方法:信号量、邮箱和消息队列。信号量是一个二值量或可计数量,用于表示一个或者多个事件的发生.或者用于实现共享资源的互斥访问。任务调用函数OSSemPend()等待一个信号量,用OSSemPost()发送一个信号量。邮箱和消息队列都是uC/OS-II中利用指针变量的通信机制。邮箱中包含一个指针。指向包含了特定“消息”的数据结构,也可把邮箱当作二值信号量实现资源互斥访问。而消息队列可看作是多个邮箱组成的数组,只是它们共用一个等待任务列表。每个指针所指向的数据结构可按具体应用设定。
    此系统中含有播放(play)、暂停播放(pause)、停止播放(stop)、音量控制(control volume)、下载音乐(download)5个任务。各任务设置相应任务堆栈和优先级,其中download任务优先级最高,其他4个任务优先级从高到低依次为停止播放(stop-task)、暂停播放(pause-task)、音量控制(control volume-task)、播放(play-task)。这样在播放(play-task)运行态时,其他任务也能获得CPU控制权,完成播放过程中的其他功能。
    ARM处理器有音频文件解码库,能够有效的解码MP3格式的歌曲,输出16-bit立体声PCM数据。在播放任务play-task中。调用int play(struct audio_play *play)函数播放歌曲,struct audio_play *play是自定义的audio_play类型指针。播放时调用voidwrite_dev()初始化IIS接口和DMA2,以下为实现软件播放的主要代码:
 

 
  1. int play(struct audio_play *Audio_play)   
  2. {   
  3.     struct buffer *buffer;   
  4.     unsigned int len;   
  5.     buffer=&output[bindex];   
  6.     while(buffer->playing==1);   
  7.     buffer->speed=c_speed;   
  8.     len = audio_pcm_s16le();   
  9.     buffer->pcm_length += len;   
  10.     if ((buffer->pem_length+ MAX_NSAMPLES*2*2)   
  11.         >=sizeof(buffer->pcm_data))   
  12.     {   
  13.         write_dev();   
  14.         bindex=(bindex+1)   
  15.     }   
  16.     return 2;   
  17. }  

5 运行播放任务时接口初始化
    在系统开始时,需初始化硬件函数,各接口的初始化根据任务的具体执行要求。设置相应的控制寄存器实现。ARM存储系统中。所有I/O映射为地址空间,易于实现读写操作。其中对UDA1341的初始化需要注意L3控制端口的时序。因为L3控制端口由ARM 器件的通用PORT控制 需软件编程实现传送控制信息过程中符号L3的时序。实现IIS初始化的主要代码为:
 

 
  1. void IIS_Init(void)   
  2. {   
  3.     rIISCON&=0;   
  4.     rIISMOD&=0;   
  5.     rIISFCON&=0;   
  6.     rIISCON1=(1<<5)|(1<<2)|(1<<1);   
  7.     rIISMOD|=(0<<8)|(2<<6)|(0<<4)|(1<<3)|(1<<2)|(1<<0);   
  8.     rIISFC0N|=(1<<15)|(1<<13)   
  9. }   

    实现DMA初始化的主要代码为:
 

 
  1. void DMA_init(void)   
  2. {   
  3.     rDISRC2=(U32)(output[playing_index].pcm_data);   
  4.     rDISRCC2=(0<<1)|(0<<0);   
  5.     rDIDST2=(U32)0x55000010;   
  6.     rDIDSTC2=(1<<1)|(1<<0);   
  7.     rDCON2=(0<<31)|(0<<30)|(1<<29)|(0<<28)|(0<<27)|   
  8.         (0<<24)|(1<<23)|(1<<22)|(1<<20)   
  9.         |((output[playing_index].pcm_length)/2);   
  10.     rDMASKTRIG2=(1<<1);   
  11.     rIISC0N (1<<0);   
  12. }   

    实现UDA1341初始化的主要代码为:
 

 
  1. unsigned Init_UDA1341(void)   
  2. {   
  3.     uda134l_volume=62-((DEF_VOLUME*61)/100);   
  4.     uda1341_boost=0;   
  5.     uda_sampling =DATA2_DEEMP_NONE | DATA2_PEAKAFTER;   
  6.     uda_sampling&=~(DATA2_MUTE);   
  7.     write_gpio_bit(GPIO_L3CLOCK,1);   
  8.     write_gpio_bit(GPIO_L3MODE,1);   
  9.     static void uda1341_l3_address(u8 data);   
  10.     static void uda1341_l3_data(U8 data);   
  11.     write_gpio_bit(GPIO_L3CLOCK,1);   
  12.     write_gpio_bit(GPIO-L3MODE,0);   
  13.     return 1;   
  14. }  

6 结束语
    本系统充分利用了uC/OS-II的多任务管理和任务通信功能。提出了一种基于EP9315处理器的MP3文件播放系统,支持串口调试和USB接口下载歌曲。由于系统采用UDA1341编解码器件。具有音
频输入接口,因此可以扩展系统的录音功能。

 
相关文章:

 
最新开源项目
 
 
  查看更多...  
 
本站相关产品   淘宝网店
 




 
  查看更多...  

 

本站程序由百合电子工作室开发和维护
Copyright @ baihe electric studio
渝ICP备09006681号-4