基于STM32F单片机的音乐播放器设计

STM32单片机课程设计

题目:基于STM32的大容量音乐播放器设计指导教师:曹利钢

所在学院:机械电子工程

专业班级:14自动化2班

姓名:张志浩

学号:114040200227

联系电话:134********

实践时间:2017年5月30日

目录

一引言 (1)

二系统整体概述设计 (1)

三硬件设计

3.1控制器 (2)

3.2电源 (3)

3.3PCM1770音频播放模块 (4)

3.4 SD卡数据存储模块 (4)

3.5 W25Q32数据存储模块和OLED显示模块 (4)

3.6按键控制 (5)

四软件设计

4.1 软件 (6)

4.2软件设计流程图 (7)

五程序设计 (8)

六课程小结 (12)

摘要:采用具有ARMCortex-M3内核的STM32F103R8T6等芯片进行相关的硬件设计,使用KEIL4.0进行固件程序和驱动程序的开发,设计了一种基于STM32的CCID协议的USB读卡器.该读卡器支持符合ISO7816-3规范的接触式IC卡。实验表明,该设计可以提高智能卡系统的通信速度和中断响应速度。

关键词:USB;CCID协议;STM32;ISO7816-3

一.引言

随着社会的快速发展,现今社会生活紧张,而欣赏音乐是其中最好的舒缓压力的方式之一,音乐成了我们生活工作中的一个重要的部分。位次我设计了一个基于STM32的大容量音乐播放器。

二系统总体设计概述

基于PCM1770芯片播放器

三硬件设计

3.1控制器

STM32F105互联型系列微处理器使用高性能的ARM Cortex-M3 32位的RISC内核。工作最高频率为72MHZ,内置256K字节的闪存和64K字节的SRAM。丰富的I/O端口和联接到两条APB总线的外设。包含标准的通讯接口(2个IIC接口,3个SPI接口,2个IIS接口,1个USB OTG 全速接口,5个USART接口和2个CAN接口),2个12位的ADC和4个通用的16位定时器。它具有高性能、低功耗、低电压等特性,同时还具有高集成度和易于开发的特点,使该系列产品成为小型项目和作为完整平台的理想选择。STM32的使用需要一个最小系统,包括晶振电路,复位电路。

1)晶振电路的设计:晶振电路用于向处理器提供工作时钟。本系统使用72MHZ无源晶振作为系统的主振荡器。晶振的负载电容应当按照要求选取,电容不正确可能导致晶振起振缓慢甚至不起振,这将影响整个系统的稳定性。

2)复位电路的设计:采用简单的

“RC+按键”复位形式,该复位电路可以实现上电自动复位和手动按键复位。上电自动复位是通过外部复位电路的电容充电来实现的,按键复位是通过复位端经电阻与电源接通而实现的。

3.2电源

本系统所需要的硬件输入电源为3.3V, 采用AS1 l17—3.3稳压芯片来提供,输入电压范围是4.75V-10V,输出电压3.3V。在使用过程中用5V电源供电即可。

3.3PCM1770音频播放模块

DAC芯片选择德州仪器的PCM1770PWR芯片提供音频播放功能,它是具有耳机放大器的 24 位低功耗立体声音频 DAC(解码器)。可支持工业标准音频数据格式,包括标准模式、I2S飞利浦标准、MSB对齐标准。可直接驱动耳机,具有软件控制音量大小,芯片模式和模拟语音合成等功能。PCM1770的I2S共4路信号,I2S_SD 串行数据用来接收2路左右声道时分复用通道的数据、I2S_WS 字选(左右声道选择)从模式下作为输入、I2S_CK 串行位时钟从模式下作为输入、I2S_MCK 主时钟 PCM1770工作需要的时钟。PCM1770的SPI共三路信号,SPI2_CS 接口片选、SPI2_SD 数据接收、SPI2_CLK 时钟信号。

本系统中处理器通过I2S接口(处理器带有I2S接口)传送音频信号到PCM1770,由它进行解码输出到音频座。处理器通过SPI接口访问PCM1770的寄存器,实现配置和控制功能。如图1所示。

3.4 SD卡数据存储模块

SD卡(Secure Digital Memory Card)安全数码卡,是一种基于半导体快闪记忆器的新一代记忆设备,它被广泛地于便携式装置上使用。SD卡具有大容量、高性能、安全等多种特点的多功能存储卡。SD卡支持两种接口访问模式,SDIO模式和SPI模式。本系统选择kingston 8G的SD卡,采用SPI模式通讯。

3.5 W25Q32数据存储模块和OLED显示模块

本系统选择型号为CT242864PMY的OLED屏以及16Mbit的串行FLASH存储芯片W25Q32,OLED(Organic Light Emitting Display)有机发光二极管显示面板,是一门相当年轻的显示技术。它利用有机半导体材料和发光材料在电流的驱动下产生发光来实现显示。与LCD相比有很多优点,超轻、超薄、高亮度、大视角、像素自身发光、低功耗、高清晰等等。CT242864PMY与一般LCD接口相似,包括数控选择D/C、读写选择W/R、复位和8个并行数据传输位。

W25X系列FLASH存储器可以为用户提供存储解决方案,具有PCB板占用空间少,引脚数量少,功耗低等特点。与不同串行FLSH相比,使用更灵活,性能更出色。它非常适合做代码下载应例如存储声音,文本和数据。工作电压在2.7V-3.6V。在这里选择W25Q32型号,存储容量为4M,存储汉字和字母,供OLED显示屏使用。如图3所示。

3.6按键控制

本系统中选择普通三个四角按键作为控制输入端,可以控制播放、暂停、音乐选择、声音调节等。

四软件设计

RealView MDK开发套件源自德国Keil公司,是ARM公司目前最新推出的针对各种嵌入式处理器的软件开发工具, 支持ARM7、ARM9和最新的Cortex-M3核处理器.本次设计的软件平台是建立在MDK μVision4之上的。系统软件设计包括应用层的主程序和驱动层的PCM1770音频、W25Q32汉字存取、OLED显示、SD卡和FatFS文件系统、按键模块。4.1 软件

1)为了能够实时在OLED屏幕上显示所播放音乐的名称,必须将数字、字母、汉字以及图形符号所对应的的OLED显示码(16*8或者16*16点阵)存于W25Q32。这里是按照国标GB2312-80中规定的区位码的顺序存储。由于处理器的FLASH为256K,要存储区位码中所有汉字图形可以分两次烧录存储。在每次使用时根据机内码与区位码的对应规则调用。第一步:将区位码转换为国标码。两区位码改写成十六进制前两位是区码,后两位是位码。将十六进制数加2020H得到的就是国标码。第二步:国标码转换成机内码。将所得到的国标码加8080H,就可得机内码。

2)FatFS 是一个通用的文件系统模块,用于在小型嵌入式系统中实现FAT文件系统。 FatFs 的编写遵循ANSI C,因此不依赖于硬件平台。它可以嵌入到便宜的微控制器中,如 8051, PIC, AVR, ARM 等等。本系统将通过FatFS 文件系统访问SD卡文件。FatFs 模块为应用程序提供了部分函数,在此基础上再编写遍历文件等函数即可满足应用。

3)处理器STM32F105的I2S接口为主模式和16bitMSB 对齐标准,PCM1770为从设备模式和MSB对齐标准。SPI2接口(访问PCM1770寄存器接口)为主模式和数据传输从MSB位开始。

4.2软件设计流程图

处理器上电后先配置各模块的GPIO接口并初始化,通过FatFS文件系统遍历SD卡中音频文件并将文件名存储。从W25Q32中读取上次停止时正在播放的音乐文件显示在OLED屏幕,准备播放。在主程序大循环中有两个工作,第一判断正在读取的文件是否读取完成,第二判断是否有按键按下。处理器采用中断的方式通过I2S接口播放音频文件。

五程序设计

1、初始化的一般流程如下:

(1)硬复位,xReset = 0;

(2)延时,xDCS、xCS、xReset置1;

(3)等待DREQ为高;

(4)软件复位:SPI_MODE = 0x0804;

(5)等待DREQ为高(软件复位结束);

(6)设置VS1003的采样率:SPI_AUDATA = 0xBB81,采样率,立体声;

(7)设置重音:SPI_BASS = 0x0055;

(8)设置音量:SCI_VOL = 0x2020;

(9)发送4个字节无效数据,用以启动SPI发送;

2、播放MP3的一般流程如下:(1)打开一个指定的MP3文件;(2)发32个字节的数据到VS1003;(3)检测DREQ,当DREQ为高时发下一个32字节的数据;(4)是否发完32个字节,否,则回到第3步; (5)是否发完打开的MP3文件,否,则回到第2步;(6)关闭打开的MP3的文件;

读写函数如下:

u16 Vs1003_REG_Read(u8 address);//读寄存器

void Vs1003_DATA_Write(unsigned char * buf);//写数据

void Vs1003_CMD_Write(u8 address,u16 data);//写命令

void Vs1003_Init(void); //初始化VS1003

void Mp3Reset(void); //硬复位

void Vs1003SoftReset(void); //软复位

void set1003(void); //设置VS1003的音量,播放模式等

void VsRamTest(void); //RAM测试

void VsSineTest(void); //正弦测试

u16 GetDecodeTime(void); //得到解码时间

u16 GetHeadInfo(void); //得到比特率

void ResetDecodeTime(void);//重设解码时间

void LoadPatch(void); //加载频谱分析代码

void GetSpec(u8 *p); //得到分析数据

TFT显示屏驱动程序

驱动TFT显示屏实际上就是对ILI9320驱动IC的操作。对ILI9320的初始化操作

如下:

(1)向ILI9320控制器写入0x00.

(2)如果返回的数据为不是0x9320,则驱动IC不是ILI9320,停止初始化。(3)如果返回的数据为0x9320,则向相应的寄存器写入默认的数据,启动驱动IC。(4)拉低片选信号CS,再写R22h寄存器,接着写入要写的数据。(5)写结束后再将CS拉高。 TFT显示屏的读写函数如下:

extern void TFT_Write_Start(void); //写开始 extern void TFT_Write_End(void); //写结束extern void TFT_SetGRAMHVA(u16 x0,u16 y0); //设置GRAM的最初地址 extern void TFT_SetGRAMArea(u16 HSA,u16 HEA,u16 VSA,u16 VEA); //设置一个GRAM显示区域

extern void TFT_init(void);

//TFT显示屏初始化

//extern void TFT_Test_Square(u16 x0,u16 x1,u16 y0,u16 y1,u16 Color); extern void TFT_Clear(u1 6 x0,u16 x1,u16 y0,u16 y1,u16 Color); //清屏函数

extern void DrawOnePixel(u16 x, u16 y, u16 Color); //画点函数

extern void Write_Asc8x16E(u16 x,u16 y,u16 TextColor,u16 BackColor,u16 W_Char);//8*16英文字符

extern void Write_Asc12x24E(u16 x,u16 y,u16 TextColor,u16 BackColor,u16 W_Char);

extern void Write_Asc12x24E_String(u16 x,u16 y,u16 TextColor,u16 BackColor,u8 *W_String); extern void Write_Asc20x40E(u16 x,u16 y,u16 TextColor,u16 BackColor,u16 W_Char);

extern void Write_GB16(u16 x,u16 y,u16 TextColor,u16 BackColor,u8 *W_Char);//16*16中文字符

extern void Write_GB_16_And_Asc8x16E(u16 x,u16 y,u16 TextColor,u16 BackColor,u8 *W_String) ;extern void Write_GB_24_And_Asc12x24E(u16 x,u16 y,u16 TextColor,u16 BackColor,u8 *W_Strin g);

extern void Display_Picture(u16 x,u16 y,u16 Width,u16 Height ,u16 *Picture); //显示图片

SD卡驱动程序

1、驱动模选择

SD卡上电时,如果CS接地,SD将进入SPI模式,CS接高电平,将进入SD BUS模式。在SD BUS 模式时,发送CMDO SD卡不会回应,在SPI模式时,发送CMD0,SD卡能回应R1信息。

2、初始化SD卡

进入SD BUS模式后,发送CMDO复位SD卡。由于处于SD BUS模式,SD卡此时不会回复信息。发送命令的时候需要注意SD卡命令状态,不同的状态只能响应待定的命令,下面为初始化命令发送流程:

(1) CMDO 复位卡。(2)CDM55 用户命令。

(3)CMD41 SD卡工作电压设置命令。(4)CMD2 从默认地址获取SD卡ID。(5)CMD3获取一个新地址。(6)CMD9从新地址读取SD卡ID。(7)CMD7选择新地址的SD卡为有效卡。(8)CMD55 用户命令。(9)CMD6设置数据位宽。(10)CMD16设置BLOCK 长度。(11)CMD13读取当前SD卡状态。(12)初始化完成。 3、发送SD卡支持的操作命令

不同的SD卡所支持的命令稍有不同,但基本命令都是支持的。详细支持哪类命令要从SD 卡的ID中获得。这一步主要为读,写,擦这三个功能。读CMD17,写CMD24,擦CMD38。

4、退出SD卡操作

如果总线上挂有多个SD卡,就需要用CMD7命令退出当前SD卡,从面选择其他的SD卡操

作。CMD7命令为选择卡或取消卡,在初始化的时候发送CMD7命令,SD卡将进

入数据发送模式,在数据模式里发送CMD7则退出当前卡的操作。需要注意的是,在数据模式里不同的状态只支持特定命令。

SD卡读写函数如下:

u8 SPI_ReadWriteByte(u8 TxData); //SPI总线读写一个字节 u8 SD_WaitReady(void); //等待SD卡就绪 u8 SD_SendCommand(u8 cmd, u32 arg, u8 crc); //SD卡发送一个命令 u8 SD_SendCommand_NoDeassert(u8 cmd, u32 arg, u8 crc); u8 SD_Init(void); //SD卡初始化 u8 SD_ReceiveData(u8 *data, u16 len, u8 release);//SD卡读数据 u8 SD_GetCID(u8 *cid_data); //读SD卡CID u8 SD_GetCSD(u8 *csd_data); //读SD卡CSD u32 SD_GetCapacity(void); //取SD卡容量 u8 SD_ReadSingleBlock(u32 sector, u8 *buffer); //读一个sector u8 SD_WriteSingleBlock(u32 sector, const u8 *buffer); //写一个sector u8 SD_ReadMultiBlock(u32 sector, u8 *buffer, u8 count); //读多个sector u8 SD_WriteMultiBlock(u32 sector, const u8 *data, u8 count); //写多个sector

五课程设计小计

在做本次课程设计的过程中,我感触最深的当属查阅大量的设计资料了。为了让自己的设计更加完善,查阅这方面的设计资料是十分必要的,同时也是必不可少的。我们是在做嵌入式课程设计,但我们不是艺术家,他们可以抛开实际尽情在幻想的世界里翱翔,而我们一切都要有据可依,有理可寻,不切实际的构想永远只能是构想,永远无法升级为设计。其次,在这次课程设计中,我们运用到了以前所学的专业课知识,如:C语言、模拟和数字电路知识等。虽然过去从未独立应用过它们,但在学习的过程中带着问题去学我发现效率很高,这是我做这次课程设计的又一收获。要做好一个课程设计,就必须做到:在设计程序之前,对所用嵌入式的内部结构有一个系统的了解。在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路。在设计课程过程中遇到问题是很正常的,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题。课程设计结束了,但是从中学到的知识会让我受益终身。发现、提出、分析、解决问题和实践能力的提高都会受益于我在以后的学习、工作和生活中。在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。我们通过查阅大量有关资料,并在小组中互相讨论,交流经验和自学,使自己学到了不少知识,虽然经历了不少艰辛,但收获同样巨大。

相关文档
最新文档