基于STM32的多功能MP3播放器设计

一、整体设计思路

由于该多功能MP3要实现图片浏览和mp3播放这两大功能,对ram和处理速度的要求比较高,首先对图片的解压缩要用到的ram比较多,其次,对MP3的播放,处理起来速度是有要求的,尤其对320Kbps的MP3格式数据流的处理,必须非常快,才能实现MP3的流畅播放。可供选择的八位机有AVR,PIC等,可供选择的32位处理器有SAMSUNG,NXP,STM32,ATMEL等。

首先要有丰富的RAM,八位机主要靠扩展,内部RAM一般在4Kbyte以内,更多的RAM得靠外扩,32位机里面,SAMSUNG一般不内带RAM,也要外扩,对于这个设计,当然成本越低越好,外扩RAM,FLASH芯片必然加大成本。所以控制芯片最好拥有自带的FLASH和RAM。

其次,由于本系统要播放MP3音乐和JPEG图片等,而两种格式的文件往往比较大,所以存储媒介也就有要求了,可供选择的有FLASH芯片,如SAMSUNG公司的K9F系列,还有SD卡,U盘等。如果选择FLASH,则整个系统要求较多的IO口来读取,更重要的一点是,这样做的后果就是整个系统的容量就被固定了,扩容存在困难。而U盘和SD卡都是不错的选择,但是SD卡相对于U盘,读取容易,而且相同容量的U盘和SD卡,SD卡的价格较低。所以系统选择SD卡作为存储媒介。

第三,系统播放MP3要同时读取SD卡和VS1003,都要用到SPI口,所以控制芯片最好有两个SPI,这样不用复用,可以提高速度。

第四,彩色台灯的控制需要通过PWM调制,来实现调光,所以,控制芯片还要有至少3路的PWM输出。

通过以上分析,本系统选择STM32作为控制芯片,STM32是ST公司最新推出的基于Cortex-M3构架的STM32F103RBT6芯片。

采用STM32F103RBT6作为控制核心,该芯片具有6通道的16位PWM输出,RTC时钟,两个高速SPI,两个IIC,三个串口,自带USB和CAN接口。具有128K flash和20K 的SRAM,对本系统来说足够了,同时以后还有很大的升级空间。

二 设计思路 

经过上一章,多功能MP3的的硬件系统已经设计出来了,但是没有软件的支持,硬件就不能正常工作,形同虚设。软件是硬件的灵魂,控制着整个硬件系统的运行。所以软件对整个系统的重要性从某种意义上说比硬件更加重要。

整个MP3的软件系统涉及到很多方面,是一个比较复杂的系统,不可能一次把所有的代码都写出来。这里对软件代码的编写采用模块化的设计思想,将整个软件系统逐步划分为子系统,再将子系统逐步细化为单一功能的模块来实现,最后再将所有的模块整合成一个大系统,实现预期的功能。

2.1  软件模块化设计  

从整个系统来说,按其与硬件是否直接相关,可以把软件分为两大部分:(一)与硬件相关的底层驱动软件子系统。(二)与硬件无关的应用软件子系统。这两个子系统的软件又可以细化为许多模块。

对于底层驱动软件子系统包括如下模块程序:LCD驱动模块、触摸屏驱动模块、SD卡驱动模块、VS1003驱动模块、PT2314驱动模块、FM24C16驱动模块、TEA5767驱动模块、温度传感器驱动模块、彩灯驱动模块、实时时钟驱动模块。

对于应用软件子系统包括如下模块程序:JPEG/BMP解码模块、FAT文件系统管理模块、音乐播放模块、图片浏览模块、游戏模块、闹钟模块、时间模块、设置管理模块、电子书模块、收音机模块、彩灯控制模块。

当进行模块化程序设计时,我们首先要明确模块的功能作用,将其划分为一个个独立的功能模块,将其封装为函数,供给其他模块调用。底层驱动主要实现一些基本的底层功能,如硬件初始化、与硬件密切相关的时序函数等等。应用层实现整个软件系统的应用功能函数。

2.2 LCD模块驱动程序设计 

本系统用到的LCD是八位数据模式,驱动IC型号是FMT0371,该芯片为松下合资厂生产的一个LCD驱动IC。最高支持26万色的TFT LCD,有6位、8位、16位和18位数据模式,可以方便选择。本系统配套的LCD使用的是八位数据模式,65K色。

根据该LCD的DATASHEET,每个像素点的GRAM实际上是一个18bit的数据寄存器。在16bit模式下与写入数据的对应关系如图3.1 所示:

图3.1

从图中可以看出,RGB的有效位数分别为565,比如写入0XF800则显示纯红色,写入0X07E0则显示纯绿色,写入0X001F 则显示纯蓝色。在处理数据的时候要把像素值先变换为这样的结构,然后再写入LCD。LCD的显示状态都是由LCD的控制命令控制的,通过写入不同的控制命令和数据,就可以实现不同的现实功能和效果。分析DATASHEET得到几个重要的控制命令:

00H:这个命令用来控制内存操作模式,这里我们主要用它来改变LCD的扫描方向。

02H,03H:这两个命令用来分别设置X,Y方向的开始显示的点坐标。

04H,05H:这两个命令用来分别设置X,Y方向的结束显示的点坐标。

0EH,0FH:这两个命令用来写入和读取显存。

LCD驱动部分包括几个关键函数:LCD读写寄存器函数、LCD读写数据函数、LCD初始化函数和LCD画点函数。有了这几个基本函数,其他的画线、画面、甚至画图都比较容易了。LCD与MCU的连线包括D0~D7、CS、RS、RST、WR、RD、BL共14根线。

D0~D7:数据线

CS:LCD的片选线,低电平有效。

RS:LCD的地址/数据控制,高电平表示数据,低电平表示地址。

RST:复位线,低电平有效。

WR:写数据访问控制。

RD:读数据访问控制。

BL:LCD背光,高电平有效。

LCD读写寄存器

(1)对LCD寄存器的操作线设置RS为低,表示写入寄存器,然后拉低片选信号,给BL

送入数据,然后通过一个WR的脉冲,就可以把数据写入到LCD了。最后释放RS,CS,完成此次操作。对LCD寄存器的读操作和写操作差不多,不同之处就是把WR脉冲改为RD脉冲。

(2) LCD读写数据

对于LCD数据的读写,和寄存器的读写差不多,只要把RS设置为高,就表示此次操作是对数据的读写,其他同寄存器的读写操作一样。

对于以上两步,要注意在读写数据的时候必须先对寄存器写入0X0E/0X0F命令来表明是读还是写。

(3) LCD初始化

这部分是在前面两步成功的基础上才能进行的,LCD的初始化涉及到其内部很多寄存器的初始化。比较复杂,由void TFT_Init(void)函数实现,具体初始化过程请参考附件里面的代码。

(4) LCD画点

画点的实现,要先设置LCD开始显示和结束显示的范围,通过0X02H~0X04H这四个命令实现。之后写入0X0E命令,开始写入数据,就可以写入像素值(16bit)了,对于画点,我们只要写入一个像素点就可以了,这样就完成了在LCD上画一点。具体见附件里面的void TFT_DrawPoint(u8 x,u16 y)函数。

以上四个函数是LCD的主要函数,是最底层的。其他任何功能的函数都可以在这几个底层函数基础上实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值