本科毕业论文(设计、创作)
题 目:基于STM32音乐MP3闹钟的设计与实现
学生姓名: 学号: |
导师所在单位:
完成时间: 年 月
基于STM32音乐MP3闹钟的设计与实现
摘要:改革开放以来,中国迅速崛起,各种电子产品层出不穷,人们对电子产品的要求也越来越高。本设计采用ARMCortex-M3 内核的STM32F103ZE作为微控器,选用开发板的SRAM&Flash模块,SD卡,LCD液晶显示屏模块,Codec音频模块等,以及移植FATFS文件系统,目的是存储SD卡中的大数据文件和管理SD卡中的文件。本设计还移植了UCOSII操作系统,任务的实时调度使得程序变得更加简单,运行环境也更加的稳定。另外,加入MP3软解码,使得系统能够识别MP3格式,正确播放出音乐。本系统设计并实现了集音乐播放,时间显示,时间设置为一体的音乐闹钟,解决了闹钟铃声单调,重复的苦恼。
关键词:STM32;MP3;闹钟,UCOSII;FATFS;SD卡
1
Designand implementation of STM32 MP3 based on the
alarmclock music
Abstract:Since the reform and opening up, China's rapid rise, all kinds ofelectronic products emerge in endlessly, people also more and morehigh to the requirement of electronic products.This design USES theARM architecture (M3 kernel STM32F103ZE as a micro control unit,choose development board SRAM&Flash module, SD card, LCD liquidcrystal display module, audio Codec module, etc, and transplantedFATFS file system, the purpose is to store large data files in SDcard, and manage the files of SD card.This design also transplantUCOSII operating system, the task of real-time scheduling makes theprogram more simple and running environment is also more stable.Inaddition, add soft decode MP3, enables the system
the collection of music playback, time display, time setting for the integration of |
2
目录
第一章绪论..................................................................................................................................11.1设计背景........................................................................................................................1第二章硬件介绍............................................................................................................................22.1STM32F103ZE...................................................................................................................22.2按键模块........................................................................................................................32.3 I/O模块........................................................................................................................32.4存储模块设计...................................................................................................................42.5 LCD液晶屏模块............................................................................................................52.6 Codec音频模块............................................................................................................72.7 USART串口模块............................................................................................................8第三章系统软件设计.....................................................................................................................93.1文件系统FAT..................................................................................................................93.2 SPI驱动.......................................................................................................................103.2 SD卡的软件设计..........................................................................................................113.2 MP3软解码..................................................................................................................123.2.1方案选择.............................................................................................................12
3.2.2 Helix MP3解码器.........................................................................................12
3.3 时 钟..........................................................................................................................12 |
4.2硬件测试......................................................................................................................154.2.1按键中断测试...................................................................................................15
4.2.3 LCD测试............................................................................................................17
4.3软件测试........................................................................................................................174.3.1 FATFS文件系统移植测试................................................................................17
4.3.2.UCOSII操作系统移植.....................................................................................19
4.4系统总体测试与调试...................................................................................................21致谢................................................................................................................................................22参考文献........................................................................................................................................23
I
第一章 绪论
1.1 设计背景
自单片机出现至今,电子技术和计算机技术迅猛发展,其应用领域随着人们的需求越来越大。现今,单片机技术已经遍满人类生活的各个领域,定时控制是不可缺少的条件,未来的物联网等对单片机的要求越来越高,智能化的道路定时必不可少。工业自动化中的数据处理以及实时控制,电子玩具,智能手机,游戏在以后物联网的发展中定时也是发挥着很大的等等,定时的应用领域非常广泛。
作用,智能家居,智能交通系统,智能仪表等领域,或许这一刻的研究正是下一个难题的突破。
因此对于定时器的学习是非常重要的。但仅仅只有单片机的只是远远不够,
针对实际生活,软硬件结合。1964 年,我们的前辈承担着东京奥运会的计时工 |
Saehan公司于1998年推出的,轰动一时。MP3全称叫MPEGAudio Layer3,是一种音频压缩技术。MP3是利用MPEGAudio Layer 3 的技术,将音乐以1:10甚至1:12的压缩率,压缩成容量较小的file,也就是说,在非常好的保持了原来的音质的同时,把文件压缩到非常小的程度在音质丢失很小的情况下。由于MP3具有音质高,体积小等优点,使得其格式在网上非常流行,每首歌大概3,4M字节。使用MP3播放器对MP3文件进行实时的解压缩(解码),这样,高品质的MP3音乐就播放出来了。
当前,MP3播放器不计其数,在各种手机,电脑等各种电子产品中随处可见,不少电子产品的MP3播放器音质非常好,手机,电脑上都可以免费下载播放器。
本次的设计音乐MP3闹钟,主要研究MP3播放和闹钟的实现,MP3播放就是一个难点,但这次毕业论文的设计,不仅巩固所学知识,还锻炼了自我学习的能力。
1
第二章硬件介绍
本设计所用硬件为STM32F103ZE开发板,自带SRAM& Flash 模块,SD卡
模块,LCD液晶屏模块,Codec音频模块,USART串口模块等。
2.1 STM32F103ZE
STM32 | STM32 代表ARM Cortex-M 内核的32 位微控制器 |
F | F 代表芯片子系列。 |
103 | 103 代表增强型系列。 |
R | R 这一项代表引脚数,其中T 代表36 脚,C 代表48 脚,R 代表64 脚,V 代表100 脚,Z 代表144 脚,I 代表176 脚。 |
B | B 这一项代表内嵌Flash 容量,其中6 代表32K 字节Flash,8 代表64K 字节Flash,B 代表128K 字节Flash,C 代表256K 字节Flash,D 代表384K 字节Flash,E 代表512K 字节Flash,G 代表1M 字节Flash。 |
2
T | T 这一项代表封装,其中H 代表BGA 封装,T 代表LQFP 封装,U 代表VFQFPN 封装。 |
6 | 6 这一项代表工作温度范围,其中6 代表-40——85℃,7 代表-40——105℃。 |
图2-2STM32F103ZE 字母表
STM32F103ZE增强型系列使用ARM公司的Cortex-M332 位的RISC内核,工
作频率为72MHz。其功能非常强大。选择STM32F103ZE作为此次设计的微处理器,
主要因为其外围接口多种多样,在实现其他功能的时候更加方便,还有一点就是
其足够大的闪存和内存。
Cortex-M3是一个32位处理器内核。内部的寄存器、数据路径、存储器接口
都是32位的。CM3采用了哈佛结构,拥有独立的数据总线和指令总线,可以让
取指与数据访问并行不悖。这样一来数据访问不再占用指令总线,从而提升了性
能。为实现这个特性,CM3 内部含有好几条总线接口,每条都为自己的应用场合 |
本次设计需要用按键对闹钟进行时间设置,共分为五个按键,上下左右中间,
分别与STMF103ZE的PG15,PD3,PG14,PG13,PG7相连。在开始之前需要对按键,
GPIO进行配置,直接调用库函数。
2.3 I/O 模块
I/O具有通用和复用功能(GPIO和AFIO)。GPIO的每个位可以由软件分别
配置成8种模式:输入上拉,输入下拉,输入浮空,模拟输入,开漏输出,推挽
式输出,推挽式复用功能,开漏复用功能。下图是端口位配置表和输出模式位表。
端口位配置表:
3
图2-3STM32 端口位配置表
输出模式位表:
|
SD卡(SecureDigital Memory Card),译为安全数码卡,是一张只有2克,看起来像一张邮票的SD记忆卡。SD卡是这个信息化社会最为通用的数据存储卡,在我们的生活中起着重要作用。SD卡优点:存储量大、价格低、安全性强、使用方便、安全性好。SD卡有6线制的SD方式和4线制的SPI方式,本设计采用SPI方式。在此过程中,以SD卡为存储设备,必须对其内容进行读取。该系统在SPI模式下其命令由6个字节构使用STM32内部接口SPI1与SD卡进行通信。
成。SD卡以命令形式来控制SD卡的读写操作,可根据命令对多块或单块进行读写操作。下图是电路原理图,SD卡有九个引脚,最特殊的就是9号引脚。
SD 卡有两种方式,如何进入两种不同的模式呢?SD 卡模式:SD 卡从中唤醒 |
4
当CS信号在复位命令被接收期间被拉低进入SPI模式。
图2-5SD 卡电路原理图
2.5 LCD 液晶屏模块
液体:分子的方向不能找到规律的液体。“液态晶体”简称“液晶”是指分
子的方向能找到规律的液体。液晶产品在我们的生活中随处可见,家里常看的电
视,现在几乎人手一步的手机等等。LCD: Liquid Crystal Display 翻译为液晶
显示器,它一种是采用了液晶控制透光度技术来实现色彩的显示器,俩片玻璃中
有许多的细小的电线,有的垂直有的水平,透过通电来控制水晶分子,从而达到
改变分子方向的目的,并将光线折射出来产生画面。
在众多LCD 类型当中,STN、TFT最为常见。STN 的英文为SuperTwisted
Nematic,是我们在平常生活中接触最多的LCD了,还记得以前的老式手机吗?它
5
的屏幕就是STN的。相比于TFT,STN属于被动矩阵式LCD器件,它的优点是功耗小,因此特别省电。STN有传统单色和彩色,彩色是在单色的基础上加了一彩色滤光片,同时把单色显示矩阵中每一个像素分成三个子像素,通过彩色滤光片显示出三原色红绿蓝,因此显示出彩色画面。STN最多能显示出65536中色彩,也因此亮度不高,色泽也不是特别好,因此在强光下,图像看起来有点吃力。
TFT:ThinFilm Transistor薄膜晶体管。也称为主动矩阵,因其背部设置特殊光管,能够“主动”对各个独立像素进行控制,故得到此名。一般TFT的反应时间比较快,约为80ms,而STN为200ms,STN若要提高就会有闪烁现象发生。TFT则改善了STN闪烁现象,并且提高了播放播放动态画面的能力。两者相比,TFT具有更好的还原能力、更高的对比度,以及更好的色彩饱和度,它的色彩更加的细腻,层次感也更强,色彩也更加的逼真。
TFT-LCD与无源TN-LCD、STN-LCD的简单矩阵不同,它在液晶显示屏的每一个像素上都有设置一个薄膜晶体管TFT,可以有效的克服非选通时的串扰,使显
TFT-LCD 即薄膜晶体管液晶显示器。电路原理图如下: | |
图2-6 LCD 电路原理图 | |
6
2.6 Codec 音频模块
Codec是指在数字通信中具有编码、译码功能的编译码器。支持视频和音频压缩(CO)与解压缩的编解码器或软件。Codec技术能有效减少数字存储占用的空间,在计算机系统中,使用硬件完成CODEC可以节省CPU资源,提高系统的运行效率。
在声卡上往往可以找到一颗或者2颗甚至3颗4面有引脚的正方形芯片,面积一般为0.5-1.0平方厘米。这就是CODEC。CODEC就是多媒体数字信号编解码器,主要负责数字->模拟信号转换(DAC)和模拟->数字信号的转换(ADC)。不管是音频加速器好,还是I/O控制器好,他们输入输出的都是纯数字信号,我们要使用声卡上的LineOut 插孔输出信号的话,信号就必须经过声卡上的CODEC的转换处理。可以说,声卡模拟输入输出的品质和CODEC的转换品质有着重大的关系,音频加速器或I/O控制器决定了声卡内部数字信号的质量,而CODEC则决
STM32F103VET 微控制器内置2 个标准的I2S(IC-to-ICsound)接口(与SPI2 |
或CODEC(编解码器)。
I2S是一种数字音频设备之间的音频数据传输总线标准,STM32芯片提供I2S这样的接口,我们可以利用这个接口直接去接数模转换的DAC芯片,这样可以将数字音频转换成模拟音频,最终将美丽的音乐传入我们的耳朵。
I2S有多种数据模式,右对齐音频数据格式输入(I2SData Format),左对齐音频数据格式输入(left-justfiedData Format),I2S音频数据格式输入(I2SData Format),还有就是标准数据格式输入(StandardData Format)。下面是I2SData Format 的接口时序图:
7
图2-7I2S 模式下PCM1770数字音频接口时序
2.7 USART 串口模块
串口最基本的就是波特率的设置。在调用前要进行相应的设置:
第一步:打开串口时钟;
第二步 :设置相应的IO 口模式; |
钟都要打开,还要将对应GPIO引脚设置为第二功能模式。
在嵌入式中串口一般都是用于调试,因为其传送数据相对来说很慢,也不能
进行大量数据传输。一般用DMA。
图2-8 串口调试电路图
8
第三章系统软件设计
本设计所用软件为KeiluVsion4, Source Insight3.5, 串口调试助手。KeiluVsion4 是美国KeilSoftware 公司推出的兼容C语言软件开发系统,对比于传统的汇编,C语言在结构上,可维护性上,结构和功能上都具有明显的优势。
Keil主要包含实时操作系统的核心(这也是嵌入式开发工程师选择此软件的重要原因)、C编译器、库管理器、宏汇编程序、连接器和调试器、固件。KeiluVsion4 相对于前面几个版本,提供一个高效,整洁的环境来开发应用程序。同时能够支持更多的ARM芯片。
SourceInsight3.5实质上是一个支持多种开发语言(java,c,c++等等)的编辑器。具有强大的查找、定位、彩色显示等功能。是一个面向项目的源码查看器,和编辑器。它能动态的分析你的代码并自动维护它的符号信息数据库,然后
把有用的上下文相关的信息提示给你。 |
3.1 文件系统FAT
所谓文件系统就是负责管理和存储文件信息的软件机构称为文件管理系统。FAT文件系统(文件配置表FileAllocation Table)是由微软开发的。目前有三种文件系统:FAT121、FAT16、FAT32。在实际磁盘上FAT结构每一表项的大小, FAT32为32也就是所占的位数。FAT文件分配表每一项为12位,
FAT16为16位,位。
FatFs介绍:当今社会大点信息量越来越大,文件系统成为今后单片机的一个方展方向。由于微软Windows的广泛应用,FAT文件系统最为常用。FatFs是
小型嵌入式系统中,实现FAT 文件系统的一个通用的文件系统模块。且完全独立 | |
FatFs 为单片机的使用而设计,具有很好的层次结果。 | |
9
从上到下依次为应用层,我们不需要了解其协议和内部结构,调用基本点接口函数就行,非常简单。中间层FatFs,实现FAT文件读写协议,一般不用修改,包含头文件就行。需要编写移植代码的是FatFs提供的底层接口。
时钟信号的相位和极性
SPI_CR寄存器的时钟极性(CPOL)和时钟相位(CPHA),可以组合成四种可能的时序关系。CPOL位对主模式和从模式下的设备都有用,没有数据传输时时钟的空闲状态电平由CPOL位控制。当CPOL位置一,SCK引脚保持高电平在空闲状态下,当CPOL位清零,则SCK引脚则保持低电平。
数据在第一个时钟边沿被锁存。若CPHA位为零,SCK时钟的第一边沿(CPOL位为一就是上升沿,为零时就是下降沿)进行数据位采样。若CPHA位为一,SCK时钟的第二边沿(CPOL位为一就是上升沿,为零时就是下降沿)。
CPOL 和CPHA 的组合选择数据捕捉的时钟边沿。 注意:1、主模式和从模式必须配置成相同的时序模式。 | |
2、在必须将SPI 禁止,必须清除SPE 位,在改变CPOL/CPHA 位之前。 |
10
3、数据帧格式决定发送或接受的数据长度,由SPI_CR1寄存器的DFF位选择。
4、SCK的空闲状态必须和SPI_CR1寄存器指定的极性一致(CPOL为零时,空闲时应下拉SCK为低电平,为一时,SCK为高电平)。
3.2 SD 卡的软件设计
SD卡的寄存器,主要用于存储SD卡自身的一些信息。向SD卡发送相应的命令就可以读取SD卡的寄存器。
SD卡指令,具有一定的格式在其发送的时候。有6字节组成。
驱动设计: 因为此设计中采用的是SD卡的SPI总线,所以SD卡的驱动是基于SPI的驱动是基础上的。SPI最重要的函数: 写函数
voidSpi_Write(uint8 chr) 和读函数charSpi_Read()。下面是SD卡驱动最重
要的几个函数的实现: |
2.初始化函数:
功能描述:初始化SD卡,使用CMD1,成功则返回0x00,失败则返回0x01Char SD_Init(),此函数在SD卡执行完复位函数后开始执行。目的就是向SD卡发送CMD1,然后检测SD卡是否进入工作状态。
3.写扇区函数:
将buffer指向的512个字节的数据写入到SD卡的addr扇区功能描述:
中,addr参数指扇区地址,buffer指向数据缓冲区的指针,成功则返回0x00,失败返回0x01.
4.读扇区函数:
11
功能描述:读取addr扇区的512个字节到buffer指向数据缓冲区。addr
参数指扇区地址,buffer指向数据缓冲区的指针,成功则返回0x00,失败返
回0x01.
3.2 MP3 软解码
3.2.1方案选择
方案一:此方案采用软解MP3,直接用软件解码。节约了硬件成本,但代码
复杂,编程难度较高,工作量极大,而且对控制器的处理速度和资源要求都比较
高。
方案二:此方案采用硬解MP3,直接用音频解码芯片解码。它使用高性能的
VS1003MP3 解码芯片,功能强大而且价格便宜,VS1003支持MP3、WAV、WMA、MIDI
等诸多音频格式,音质可与市场上中档MP3播放器相媲美。
由于PCM1770 芯片仅仅只是进行D/A 转换,并不支持硬件解码,且为了挑战 |
考虑定点实现。该算法可运行在任意32位定点处理器上,并完全使用C语言编
码,可选择用优化的汇编指令替换某些代码段。HelixMP3 解码器提供对
MPEG-1、MPEG-2和MPEG-2.5的第3层( Layer3)支持。它支持可变位速率、
恒定位速率,以及立体声和单声道音频格式。有关实现和特性的详细信息,访问
HelixMP3 解码器网站:https://datatype.helixcommunity.org/Mp3dec。
3.3 时 钟
3.3.1 实现的基本功能
1. 闰年的判断。如果年份不能被四整除就是平年。不能同时被四和一百整
除,则是闰年。既能被四整除,也能被一百整除,还能被四百整除的也是闰年,
12
否则是平年。
2. 判断日期是否合法,年月日时分秒小于零不合法,月日时分秒都不能超过最大值,合法之后在判断是否是闰年,若为闰年,则判断二月是否满足要求。
3.对时间进行设置,可以很据自己的需求调节时间,闹钟的话就需要设置不同的时间,时间到了,就播放处一段音乐。
下面是闰年算法的部分代码:
/*闰年算法*/
if((year_number % 4 == 0) &&( year_number % 100 != 0) ||(year_number % 400 == 0) )
{
if((month_number== 1) || (month_number == 3) || (month_number == 5) || (month_number== 7) || (month_number == 8) || (month_number == 10) || (month_number == 12) )
{ | if( month_number == 12) | |
| ||
month_number = 1; | //月份加一 |
day_number = 1; //天数为一
year_number++;
}
}
3.4 固件库的使用
固件库的使用很简单,先初步熟悉一下固件,通过里面提供的函数来配置微控制器并实现一些简单的分立功能。此函数库包括了微控制器所有外设的性能特征,以及每个外设的应用实例和驱动描述,同时此函数库是由程序、数据结构和宏组成的固件函数包。有了此固件库后,用户可以轻松应用每一个外设还不需要
13
深入掌握许多细节,在一定程度上给用户带来了很大的方便,节省了大量的程序编写时间,也因此大大降低了开发成本。
3.5 嵌入式操作系统UCOSII
Ucosii是Micrium公司提供的,不是一个完整的实时操作系统,只是一个具有可移植、可裁剪、可固化、抢占式多任务的实时内核。其源码开放,非常适合于系统开发,从而适合于多种微处理器、数字处理芯片及微控制器。它的绝大部分源码都是ANSI_C编写的,CPU硬件相关的部分都是用汇编编写,并压缩到最低限度以便于移植到其他的CPU上。
Ucosii由核心、CPU的移植、任务处理、任务同步与通信、时间处理五部分组成。
1、核心部分(OSCore.c):这部分是操作系统的核心,包括系统初始化,如void OSInit (void);系统的运行、中断进出的前导、任务调度、事件处理、
时钟节拍等。 |
恢复。
4、任务同步与通信:此部分主要包括信号量、邮箱、邮箱队列,事件标志等部分。
5、时钟部分:在OSTime.c中,该系统中最小时钟单位是时钟节拍,也即timetick,任务延时等都在这里完成。
14
第四章系统测试与开发
4.1 搭建开发环境
4.1.1 安装JLINK驱动
JLINK是SEGGER公司推出的,为了支持仿真ARM内核芯片的JTAG仿真器。是学习开发RAM最好的开发工具,同时与IAR,Keil等编译环境完美连接,操作起来更加方便易学。
本设计就需要用到JLINK下载和调试程序,在此之前应该先安好JLINK的驱动。下载JLINK驱动后,直接双击驱动文件Setup_JLINKRAM_V486B.exe,然后根据提示进行安装即可。安好后,需要检查是否安装成功。把JLINK(如下图)
插到电脑上USB接口,然后在我的电脑\管理\设备管理器\通用串行总线控制器
中看到一个J-Link driver,表明驱动安装成功。
4.1.2 安装MDK
MDK指的是KeilMDK,也称MDK-ARM、uVision4等。KeilMDK 软件为基于Cortex-M、Cortex-R4、ARM7、ARM9处理器设备提供了一个完整的开发环境。KeilMDK 简单易学而且功能非常强大,
是学习嵌入式非常好的开发工具。前面有过介绍。
4.2 硬件测试
4.2.1 按键中断测试
此部分测试是通过四个按键分别控制四个LED灯,若每个按键对应的每个灯都能亮则按键部分测试成功。
15
//外部中断设置
voidEXTI_Configuration(void)
{
EXTI_InitTypeDefEXTI_InitStruct;
GPIO_EXTILineConfig(GPIO_PortSourceGPIOD,GPIO_PinSource3); GPIO_EXTILineConfig(GPIO_PortSourceGPIOG,GPIO_PinSource7); GPIO_EXTILineConfig(GPIO_PortSourceGPIOG,GPIO_PinSource13); GPIO_EXTILineConfig(GPIO_PortSourceGPIOG,GPIO_PinSource14); GPIO_EXTILineConfig(GPIO_PortSourceGPIOG,GPIO_PinSource15);
EXTI_InitStruct.EXTI_Mode= EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger= EXTI_Trigger_Falling;
EXTI_InitStruct.EXTI_Line= EXTI_Line3 | EXTI_Line7 | EXTI_ Line13| EXTI_Line14 | EXTI_Line15;
EXTI_InitStruct.EXTI_LineCmd= ENABLE;
EXTI_Init(&EXTI_InitStruct);
}
//中断优先级设置 |
NVIC_InitStruct.NVIC_IRQChannel= EXTI3_IRQn;
/*抢占优先级设定*/
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority= 1;
/*副优先级设定*/
NVIC_InitStruct.NVIC_IRQChannelSubPriority= 1;
NVIC_Init(&NVIC_InitStruct );
//下面还有EXTI15_10_IRQn及EXTI9_5_IRQn的配置,为了简便此处就省略。
}
在stm32f10x_it.c中加入按键触发后LED灯的状态。
如:
/*中断服务程序*/
VoidEXTI9_5_IRQHandle(void)
{
EXTI_ClearITPendingBit(EXTI_Line5);
} | GPIO_SetBits(GPIOD,GPIO_Pin_3); |
|
|
16
4.2.3 LCD 测试
LCD的测试,就是简单的在LCD上画一个圆,若能显示出来则测试通过。下
面就是部分代码:
voidLCD_configuration(void)
{
LCD_BL_Pin_Config();
Delay(20);
LCD_BL_Cmd(ENABLE);
STM3210E_LCD_Init();
LCD_SetTextColor(Red);
}
voidLCD_BL_Pin_Config(void)
{
GPIO_InitTypeDefGPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitStruct.GPIO_Pin= GPIO_Pin_8;
GPIO_InitStruct.GPIO_Mode= GPIO_Mode_Out_PP;
GPIO_InitStruct.GPIO_Speed= GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct); |
else
{
GPIO_ResetBits(GPIOA,GPIO_Pin_8);
}
}
4.3软件测试
4.3.1 FATFS 文件系统移植测试
FATFS源代码的获取,可以到官网下载。
1、解压文件会得到两个文件夹,一个是doc文件夹,这里是FATFS的一些使用
文档和说明,以后在文件编程的时候可以查看该文档。另一个是src文件夹,里
面就是我们所要的源文件。
17
2、建立一个STM32的工程,为方便调试,我们应重载printf()底层函数实现串口打印输出。可以参考已经建立好的printf()打印输出工程:
3、在已经建立好的工程目录User文件夹下新建两个文件夹,FATFS和
SPI_SD_Card,FATFS用于存放FATFS源文件,SPI_SD_Card用于存放SPI的驱动文件。
4、将ff.c添加到工程文件夹中,并新建diskio.c文件,在diskio.c文件中实现五个函数:
DSTATUSdisk_initialize (BYTE);//SD 卡的初始化
DSTATUSdisk_status (BYTE);//获取SD卡的状态,这里可以不用管 DRESULTdisk_read (BYTE, BYTE*, DWORD, BYTE);//从SD卡读取数据 DRESULTdisk_write (BYTE, const BYTE*, DWORD,BYTE);//将数据写入SD 卡,若该文件系统为只读文件系统则不用实现该函数
DRESULTdisk_ioctl (BYTE, BYTE, void*);//获取SD卡文件系统相关信息
文件可上网下载。 |
if(res!= FR_OK){
printf("open file error : %d\n\r",res);
}else{
res = f_write(&fdst, textFileBuffer, sizeof(textFileBuffer),&bw);
if(res == FR_OK){
printf("write data ok! %d\n\r",bw);
}else{
printf("write data error : %d\n\r",res);
}
f_close(&fdst);/*关闭文件,必须执行,否则数据无法写入SD卡中*/}
还有读文件测试,这里就不一一写出来啦。
4.3.2. UCOSII 操作系统移植 |
|
18
下载地址:http://micrium.com/page/downloads/ports/st/stm32 解压缩后得到如下:
|
任务切换时的寄存器切换。
BSP:与单板配置相关的代码,主要是单板工作频率的配置和获取。App:应用程序代码示例。
2、文件目录:Libraries、MDK-Proj不变;
uCOS新增加uCOS源码;App改为uCOS的App源码。
19
Micrium\Software\uCOS-II\Ports\ARM-Cortex-M3\Generic\IAR
|
图4-3 工程文件展示图
3、工程目录结构:
Bsp、Source、Arch 新增加uCOS 源码; |
OS_CPU_PendSVHandler和OS_CPU_SysTickHandler,改过来即可。
5、汇编文件修改
由于官方提供的汇编文件,是基于IAR的开发环境,而我们使用的MDK开发环境,所支持的汇编语言的书写规则稍有不同的。所以,要对关键的汇编文件进行修改,主要是os_cpu_a.asm文件。
(1)、PUBLIC----------- EXPORT
(2)、RSEGCODE:CODE:NOROOT(2) 指定了下面使用的内容是代码段,属性是可执行的,并以2字节形式对齐的。
改成:AREA |.text|, CODE, READONLY
ALIGN | |
20
依据自己的实际情况,编写系统之上的应用程序。完成自己的任务和定制系统的相关配置。主要的文件:app.capp_cfg.c includes.h。App.c文件中,完成主函数的功能,并加载自己使用的任务。
在bsp.cbsp.h 两个文件中,根据开发板的实际情况,加入初始化系统时钟相关的函数。并根据自己任务的实际情况,进行时钟的配置。
os_dbg.c
#define OS_COMPILER_OPT __root
改为
#define OS_COMPILER_OPT //__root
os_cfg.h
#defineOS_APP_HOOKS_EN 1
改为
#defineOS_APP_HOOKS_EN 0
void BSP_IntDisAll (void) |
{ //CPU_IntDis(); }
4.4 系统总体测试与调试
此部分主要是把各模块的代码给串起来,拼到一起,把程序通过JLINK下载到开发板上然后再运行。最后的调试阶段最是复杂。每完成一小块的功能后,就立马调试,确保无误后再写下一段代码。在keil软件内还可以加断点调试,还有单步调试、跳过整个函数调试,这些都给我们调试带来了很大的方便。另外,我们还可以借助串口进行调试,这种调试在ucosii中用的较多,因为我们不知道哪个任务先开始执行,哪个任务后执行,串口调试正好可以解决这个困难,我们可以在每个任务中通过串口输出一句话”我是任务一“、”我是任务二“等来测试,此方法在嵌入式中经常被用到。
21
致谢
本次论文是在雷迎科导师的悉心指导下完成的,从最初的选题到论文的完成
我的导师付出了很大的心血与精力,老师帮我们找到一些相关的资料用来帮助我
们解答在写论文时遇到的疑惑,导师的知识很渊博,在我们遇到不会的或者有疑
惑的地方都能及时的帮助我们,衷心的感谢我的导师。
在本文的完成过程中,一直得到了电子电气工程学院领导和老师们的热情帮
助和指导。从论文选题、课题研究到学位论文完成的这些过程中,都有着他们每
一个人的一份辛勤汗水。在此谨向他们表示我最诚挚的谢意和感激之情。
在这个论文研究的过程中,得到了很多同学和导师的帮助和关心。遇到不懂
的地方就会及时向他们请教,再重新梳理自己的思路。对我的论文帮助起到了很
大的作用,对于他们的支持和帮助表示诚挚的谢意!
最后,我向给予我帮助和支持的领导、老师、同学和朋友再次表达我衷心的 |
22
参考文献
[1]Labrosse Jean J.,UC/OS一Il--源码公开的实时嵌入操作系统,(邵贝贝译),中国电力出版社,2001年
[2]冉明等,基UC/OS一II的嵌入式系统的设计,冉明等,微机发展,2004.8
[3]谭浩强,C程序设计(第二版),清华大学出版社,1999.12
[4]uC/OS环境下的C语言编程,北京单片机开放网,www.bimcu.com
[5]杜春雷.ARM体系结构与编程.北京:清华大学出版社,2003.7.14
[6]ARM公司《ARMArchiteture ReferenceM annual》2000
[7]STM32F103增强型系列数据手册
[EB/OL].http://www.mcudata.com/Webmaster/STMdanpianji/2009/0513/1405.html,2009-05-13/2011-03-01.
[8] FAT32 文件系统详解.pdf |
23
24