嵌入式程序设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
嵌入式系统课程设计报告
专业:电子信息工程
班级:电1304-1
学号:20132581
姓名:向鹏
指导教师:王伟明
电气与电子工程学院
2015年7月
前言
随着科学技术的不断进步,嵌入式近些年来逐渐兴起,其领域比较新,发展非常迅速,由于它属于新兴领域,接触的人并不是很多,但是嵌入式在各种电子设备上的应用越来越越广泛,并且各种电子设备也在朝着嵌入式微系统,智能化的方向前进。
STM32系列是基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARM Cortex-M内核。
作为21世纪的人才,为了与社会实际需要相衔接,提高我们的学习兴趣,利用STM32系列单片机进行了一次嵌入式系统设计。
摘要:在本次课题设计中采用STM32系列中的STM32F103VET5微控制器芯片。
采用VS1003B解码芯片用于MP3歌曲的解码。
μC/OS-II为实时多任务操作系统,用于此MP3来开始、切换、暂停、结束歌曲。
μCGUI是一种嵌入式应用中的图形支持系统,用其来编辑图形窗口并在CPU上运行。
关键词:MP3播放器,STM32,μCOS-II,μCGUI, VS1003B
目录
一、课程设计任务要求 (3)
二、系统硬件设计 (3)
三、系统软件实现 (4)
四、系统调试及实验结果 (10)
五、课程设计总结 (11)
六、参考文献 (11)
一、课程设计任务要求
本次的课程设计目的是实现一个触摸屏型的MP3播放器,整个播放器共分成2个不同的模块,分别为:
1、初始化程序。
2、播放、暂停、切换、停止界面的编写。
二、系统硬件设计
用STM32开发MP3播放器必须用到音频解码器。
本课程设计中用到的VS1003B是单片MP3/AAC/WMA/MIDI音频解码器。
它包含了一个高性能、有专利的低功耗DSP 处理器内核VS_DSP4、工作数据存储器、供用户应用程序和任何固化解码器一起运行的16 KB 指令RAM 及0.5KB 多的数据RAM、串行的控制和输入数据接口、最多8 个可用的通用I/O引脚、一个UART、并有一个优质的可变采样率立体声ADC和立体声DAC、和跟随的一个耳机功放。
其原理图如下图1所示。
图1 音频解码器原理图
所介绍的MP3播放器的播放文件来自SD卡,从计算机的USB端口取电,并通过RS232串口与计算机通信,另外播放器还提供了LCD液晶显示,音量调节按钮等人机交互功能。
该款MP3播放器的硬件电路并不复杂,采用的芯片均是市面上常见的音频信号处理芯片,而且还加入了STM32单片机的JTAG调试接口和ISP程序下载端口。
其硬件设计图如下图2所示。
图2硬件设计原理图
根据此硬件设计图再结合软件设计就能做出MP3。
三、系统软件实现
此次的课程设计在于开发一个MP3播放器,其流程图如下图3所示。
图3 程序流程图
而我的任务是MP3内部的初始化和播放暂停等功能。
MP3的功能部分是播放器必不可少的组成。
为方便介绍,此软件实现只给出主要程序部分。
1、本例程提供了硬件平台的初始化
RCC为复位与时钟控制。
复位分三种方式,即电源复位、系统复位和备份区域复位。
系统复位将复位除时钟控制寄存器CSR中的复位标志和备份区域中的寄存器外的所有寄存器。
当在NRST引脚上产生一个低电平,系统复位发生,即通过按复位按钮可以引发复位。
另外,对于备份区域的复位是一种在软件复位的时候设定备份区域控制寄存器中的对应位就产生,一种是当电源和电池都掉电又都重新上电时产生。
GPIO是常规输入/输出端口,STM32F103VE有PA、PB、PC、PD、PE共5个16位的GPIO。
STM32的GPIO都可编程,具有很多复用功能。
GPIO可以配置为很多总模式,这些模式有:输入浮空、输入上拉、输入下拉、模拟输入、开漏输入、推挽输出、推挽复用、开漏复用。
通过对GPIO寄存器编程,可以设置每个端口的工作模式。
SPI是串行外设端口,是一种同步串行外设端口,它可以使MCU与各种外围设备以串行方式进行通信、交换信息。
STM32的SPI支持全双工同步传输,可选择以8或16位传输帧格式进行传输,支持多种模式。
/*******************************************************************
* 名称:void SD_TEST(void)
* 功能:SD卡测试函数
********************************************************************/
void SD_TEST(void){
Status = SD_Init();
Status = SD_GetCardInfo(&SDCardInfo);
Status = SD_SelectDeselect((uint32_t) (SDCardInfo.RCA << 16));
Status = SD_EnableWideBusOperation(SDIO_BusWide_4b);
Status = SD_SetDeviceMode(SD_DMA_MODE);
if (Status == SD_OK)
{
Status = SD_ReadBlock(Buffer_Block_Rx, 0x00, 512);
}
if (Status == SD_OK)
{ USART_OUT(USART1,"\r\nSD SDIO-4bit模式测试TF卡成功!\n ");
} }
/********************************************************************
* 名称:void BSP_Init(void)
* 功能:奋斗板初始化函数
********************************************************************/
void BSP_Init(void)
{
RCC_Configuration(); //系统时钟初始化
USART_Config(USART1,115200); //初始化串口1
SD_TEST(); //SD卡初始化
tp_Config(); //SPI1 触摸电路初始化
FSMC_LCD_Init(); //FSMC TFT接口初始化
SPI_VS1003_Init(); //VS1003 初始化
USART_OUT(USART1,"**** (C) COPYRIGHT 2015 奋斗嵌入式开发工作室*******\r\n");
//向串口1发送开机字符。
USART_OUT(USART1,"**\r\n");
USART_OUT(USART1,"* 奋斗版STM32开发板基于SD卡的MP3播放*\r\n");
USART_OUT(USART1,"* *\r\n");
USART_OUT(USART1,"*MCU平台:STM32F103VET6 *\r\n");
USART_OUT(USART1,"*介质硬件:Micro SD VS1003 *\r\n");
USART_OUT(USART1,"*固件库:3.5 *\r\n");
USART_OUT(USART1,"* 例程版本: 0.1 *\r\n");
USART_OUT(USART1,"******************************************\r\n");
/* 初始化文件系统,获得根目录下的文件名*/
OutPutFile();
}
/*******************************************************************
* 名称:void tp_Config(void)
* 功能:TFT 触摸屏控制初始化
********************************************************************/
void tp_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
SPI_InitTypeDef SPI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //口线速度50MHZ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用模式
GPIO_Init(GPIOA, &GPIO_InitStructure); //SPI1 触摸芯片的片选控制PB7 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //口线速度50MHZ
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出模式
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //SPI1 SST25VF016B片选
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //SPI1 VS1003片选
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //SPI1 网络模块片选
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_SetBits(GPIOC, GPIO_Pin_4); //SPI1 SST25VF016B 片选置高 GPIO_SetBits(GPIOB, GPIO_Pin_12); //SPI1 VS1003片选置高
GPIO_SetBits(GPIOA, GPIO_Pin_4); //SPI1 网络模块片选置高
2、MP3功能控制
slider 控件是有滑块与滑动条组成。
使用Slider 控件,可以计算出滑块在滑动工程中占整个滑动条的比例。
如果滑动条的整体长度为100,则滑动的范围就是0-100。
按照展示方式,滑动条可以分为两种:一种是为水平滑动条,另一种是垂直滑动条,它们之间的用法完全相同。
开发中我们常使用滑动条来调节声音或者颜色等。
μCGUI 是一种嵌入式应用中的图形支持系统。
它设计用于为任何使用LCD 图形显示的应用提供高效的独立于处理器及LCD 控制器的图形用户接口,它适用单任务或是多任务系统环境, 并适用于任意LCD 控制器和CPU 下任何尺寸的真实显示或虚拟显示。
它的设计架构是模块化的,由不同的模块中的不同层组成,由一个LCD 驱动层来包含所有对LCD 的具体图形操作。
UCGUI 可以在任何的CPU 上运行,因为它是100%的标准C 代码编写的。
UCGUI 能够适应大多数的使用黑白或彩色LCD 的应用,它提供非常好的允许处理灰度的颜色管理。
还提供一个可扩展的2D 图形库及占用极少RAM 的窗口管理体系,其软件层次结构图如下图4所示。
用户程序
API 函数接口
高级图形接口基本图形接口
对话框窗口
控件矩形椭圆圆弧位圆字体圆线点
硬件驱动颜色管理
内存设备输入设备
图4 μCGUI 软件体系的层次结构
μCGUI 提供给窗口和窗口控件的回调机制的背后,是一个事件驱动标志。
在大多数的窗口系统中,流控不但仅时从用户程式到图像系统,而且还要能够从用户程式到图像系统,并且能够通过用户程式提供的回调函数,返回到用户程式。
这个机制,就称为回调机制。
在μC/GUI中,回到机制用来在窗口管理中出控制窗口的重绘操作,这使得窗口管理的有效性成为可能。
μC/OS-II 是专门为计算机的嵌入式应用设计的,绝大部分代码是用C语言编写的。
CPU 硬件相关部分是用汇编语言编写的、总量约200行的汇编语言部分被压缩到最低限度,为的是便于移植到任何一种其它的CPU 上。
用户只要有标准的ANSI 的C交叉编译器,有汇编器、连接器等软件工具,就可以将μC/OS-II 嵌入到开发的产品中。
μC/OS-II 具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点,最小内核可编译至2KB 。
μC/OS-II 已经移植到了几乎所有知名的CPU 上。
严格地说uC/OS-II只是一个实时操作系统内核,它仅仅包含了任务调度,任务管理,时间管理,内存管理和任务间的通信和同步等基本功能。
没有提供输入输出管理,文件系统,网络等额外的服务。
但由于uC/OS-II良好的可扩展性和源码开放,这些非必须的功能完全可以由用户自己根据需要分别实现。
USART为STM32的同步异步接收器。
它提供了一种灵活的方法与使用异步串行数据格式的外部设备之间进行全双工数据交换。
USART利用分数波特率发生器提供宽范围的波特率选择。
另外,它还允许多处理器通信。
USART也可以使用DMA方式直接将接受的数据存储到内存或从内存中批量发送数据,也支持多种中断方式。
/********************************************************************
* 名称:static void _cbCallback(WM_MESSAGE * pMsg)
* 功能:窗体回调函数
SLIDER_SetRange(slider0,0,fsize); //设置slider部件的初始值SLIDER_SetV alue(slider0,0);
open_f=1; //播放状态标志
OSSemPost(MP3_SEM); //传送MP3播放信号量}
else if(open_f==1){ //暂停播放任务
open_f=2;
OSTaskSuspend(APP_TASK_MP3_PRIO); //挂起任务
}
else if(open_f==2){ //继续播放任务
open_f=1;
OSTaskResume(APP_TASK_MP3_PRIO); //恢复任务
}
}
else if (Id == GUI_ID_BUTTON1){ //F2--列表框的高亮条上移
if(file_no!=0){
file_no--;
LISTBOX_DecSel(listbox1);
if(open_f!=0){ //如果是非停止播放状态,播放上一首
open_f=0;
goto pub;
}
}
}
else if (Id == GUI_ID_BUTTON2){ //F3--列表框的高亮条下移
if(file_no<(file_num-1)){
file_no++;
LISTBOX_IncSel(listbox1);
if(open_f!=0){ //如果是非停止播放状态,播放下一首
open_f=0;
goto pub;
}
}
}
else if (Id == GUI_ID_BUTTON3){ //F4--停止播放
if(open_f==1||open_f==2){ //停止播放
open_f=0;
mp3_step=0;
}
}
else if (Id == GUI_ID_BUTTON4){ //F5--快进
if(mp3_step<(fsize-65536)){
mp3_step=mp3_step+65536;
f_lseek(&fsrc,mp3_step); //定位快进进度到文件里
}
}
break;
default:
break;
}
break;
default:
WM_DefaultProc(pMsg);
}
}
/*******************************************************************
* 名称:void Fun(void)
* 功能:显示及处理界面
********************************************************************/
void Fun(void) {
unsigned short i=0,a;
open_f=0;
GUI_CURSOR_Show();
WM_SetCreateFlags(WM_CF_MEMDEV);
DesktopColorOld = WM_SetDesktopColor(GUI_BLUE);
/* 建立窗体,包含了资源列表,资源数目,并指定回调函数*/
hWin = GUI_CreateDialogBox(aDialogCreate, GUI_COUNTOF(aDialogCreate), _cbCallback, 0, 0, 0); /* 设置窗体字体*/
FRAMEWIN_SetFont(hWin, pFont); /* 获得TEXT 部件的句柄*/
text0 = WM_GetDialogItem(hWin, GUI_ID_TEXT0);
text1 = WM_GetDialogItem(hWin, GUI_ID_TEXT1);//获得slider 部件的句柄slider0 = WM_GetDialogItem(hWin, GUI_ID_SLIDER0);// 获得按钮部件的句柄
_ahButton[0] = WM_GetDialogItem(hWin, GUI_ID_BUTTON0);
_ahButton[1] = WM_GetDialogItem(hWin, GUI_ID_BUTTON1);
_ahButton[2] = WM_GetDialogItem(hWin, GUI_ID_BUTTON2);
_ahButton[3] = WM_GetDialogItem(hWin, GUI_ID_BUTTON3);
_ahButton[4] = WM_GetDialogItem(hWin, GUI_ID_BUTTON4); //按键字体设置
四、系统调试及实验结果
调试过程:
在测试过程中出现了一些问题,主要是由于屏幕开启窗口模式时大小没有符合屏幕的大小而产生的,经过对窗口函数的更改,即将其大小改为人工输入可以非常方便的调整,将其界面做的更加美观。
点触的时候也点不准确,我觉得可以加上触屏校准,使其精准。
实验结果:
达到测量能够播放的要求,并且可以暂停、快进、切歌、停止等,达到了设计的目的。
实验设计效果如下图5、图6所示:
图5 效果图 图6 效果图
五、课程设计总结
本学期为期两周的嵌入式课程设计在不知不觉中结束了,虽说这次课程设计时间不是很长,但是感觉自己收获颇丰,不仅学习到了一些新知识,回顾了以前的一些快要遗忘的知识点,而且使自己的学习目标更加明确,学习方法更加完善,也体会到软件开发的趣味,更加清楚地认识到了自己在软件开发及学习上的一些不足之处。
在这次的课程设计中不仅检验了我所学习的知识,也培养了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情。
在设计过程中,与同学分工设计,和同学们相互探讨,相互学习,相互监督。
学会了合作,学会了运筹帷幄,学会了宽容,学会了理解,也学会了做人与处世。
课程设计是我们专业课程知识综合应用的实践训练,着是我们迈向社会,从事职业工作前一个必不少的过程。
“千里之行始于足下”,通过这次课程设计,我深深体会到这句千古名言的真正含义。
也感谢老师和同学们的帮助。
我今天认真的进行课程设计,学会脚踏实地迈开这一步,就是为以后打下坚实的基础。
六、参考文献
[1] 卢有亮 基于STM32的嵌入式系统原理与设计 北京:机械工业出版社,2014
[2] 李丽 MATLAB 工程计算及应用 北京:人民邮电出版社,2013。