基于CortexM3和μCOSⅡ的嵌入式系统毕业设计论文.docx
《基于CortexM3和μCOSⅡ的嵌入式系统毕业设计论文.docx》由会员分享,可在线阅读,更多相关《基于CortexM3和μCOSⅡ的嵌入式系统毕业设计论文.docx(29页珍藏版)》请在冰豆网上搜索。
基于CortexM3和μCOSⅡ的嵌入式系统毕业设计论文
本科生毕业论文
基于Cortex-M3和μC/OS-Ⅱ的嵌入式系统
研究
院(系)物理与电气信息工程学院
专业电子信息工程
研究方向嵌入式系统硬件研究
2013年5月18日
摘要
随着电子技术的飞速发展,嵌入式系统已经广泛渗透到人们生活当中,其实嵌入式系统实际上是“嵌入式计算机系统”的简称,它是相对于计算机系统而言的。
本文以嵌入式系统发展作为引入,介绍嵌入式stm32的种类及功能,嵌入式系统各个领域的应用,嵌入式系统不仅仅是个简单的系统操作,需要外围设备的搭建和软件的构建相互结合的产品,需要实时的操作系统μC/OS-Ⅱ的移植到芯片上。
介绍了stm32硬件结构和描述了如何搭建外围电路,所能实现的基本功能,例如以太网、串口、ADC转换、EEPROM等等
关键字:
嵌入式;stm32;μC/OS-Ⅱ;以太网;硬件结构;
Abstract
withtherapiddevelopmentofelectronictechnology,embeddedsystemshavebeenwidelyinfiltratedintopeople'slives,infact,embeddedsystemisactually"embeddedcomputersystem"referredto,itiswithrespecttothecomputersystem.Inthispaper,astheintroductiontoembeddedsystemdevelopment,introducesthetypesandfeaturesofembeddedSTM32,embeddedsystemsapplicationsinvariousfields,theembeddedsystemisnotonlyasimpleoperatingsystem,tobuildtheperipheralequipmentandsoftwaretobuildacombinationproduct,needtheoperatingsystemμC/OS-Ⅱtransplantreal-timetochip.IntroducedthehardwarestructureofSTM32anddescribeshowtobuildtheexternalcircuit,thebasicfunctioncanberealized,suchasEthernet,serialport,ADCconversion,EEPROMetc.
Keywords:
embeddedsystem;STM32;μC/OS-Ⅱ;Ethernet;hardwarestructure;
第一章前言
1.1什么事嵌入式系统
嵌入式系统(EmbeddedSystem)也称嵌入式计算机系统。
听到这个名字,我们很快联想到了计算机,也就是说嵌入式系统是计算机的一种演化过来的,因此在学习和理解嵌入式系统概念上,必须先了解计算机的基本概念。
我们先简单了解一下计算机,一个完整的计算机系统,它包括硬件和软件两部分,如图1-1所示。
软件是编程指令与存储数据的集合,而硬件则是执行指令和处理数据的平台,都是我们日常可以见到的。
计算机的硬件系统主要由CPU、存储器、外部设备的计算机总线组成。
软件则包括系统软件和应用软件两部分,操作系统属于系统软件的组成部分[1]。
图1-1系统构成
1.2嵌入式系统的发展与应用
早起计算机由电子管组成,由美国宾夕法尼亚大学研究的。
当时的计算机体积比较庞大,质量笨重并且不易携带,灵活性不高,主要用于大量的计算任务。
随着社会和科技的不断发展,不久晶体管计算机的出现,尤其是集成电路在计算机中得到应用,新型计算机体积越来越小、功能越来越完善,性能越来越强,除了数值计算外,还具有图像处理,快速存储实、信息处理、自动控制等功能。
将这些功能集成到一个专门应用设备中,可显著提高设备的性能。
此时嵌入式系统应运而生。
起初嵌入式系统的发展,因为计算机是个昂贵的电子设备,所以应用的领域仅限于军事、工业控制等重要地方。
随着微处理器技术的迅速发展,计算机集成度越来越高,在性能提高的同时,计算机也变得越来越小,越来越价廉,嵌入式系统也进入快速发展时期。
在科技技术时代,现代社会向着数字化和信息技术化及智能化发展,嵌入式系统将发挥举足轻重的地位。
在今后的日常生活中,嵌入式系统不仅存在于电视,洗衣机,冰箱,手机,它有可能是在我们的日常生活用品,如衣服、鞋子、背包等。
也可以配备一个计算机系统。
1.3嵌入式系统的组成
大部分嵌入式系统都是针对特定场合和功能定制的,因此彼此之间在功能、性能、体系结构、外观等方面肯定存在很大的不同。
从计算机原理角度看,嵌入式系统包括硬件和软件两部分组成。
如图1-2所示。
硬件是嵌入式系统基本的物质基础,它建立在软件系统之上并且提供了系统软件运行的物理平台和通信接口。
软件是计算机系统中与硬件同等重要的一部分,它包括程序、相关代码及其它操作说明和指令[1]。
图1-2系统组成
第二章嵌入式系统的分类
2.1按处理器位宽分类
按处理器位宽可将嵌入式系统分为4位、8位、16位和32位系统。
一般情况下,位宽越大性能和功能越多,整个系统越完善。
2.2按有无操作系统分类
现代通信计算机,操作系统是必不可少的软件系统。
在嵌入式系统中则有两种情况:
分有操作系统和无操作系统。
在有操作系统的情况下,嵌入式系统的任务管理、内存管理、设备管理、文件管理等都有操作系统完成,并且操作系统为应用软件提供丰富的编程接口。
在一些功能单一的嵌入式系统中,如基于8051和F020单片机系统,硬件平台简单,系统不需要支持复杂的显示、通行协议、文件管理、多任务管理等功能,这种情况下没有必要运行操作系统。
2.3按实时性分类
根据实时性要求,可将嵌入式系统分为硬实时系统和软实时系统两类。
在硬实时系统中,系统可以保证在最坏情况下得到服务时间,即对事件响应时间的截止期限必须得到满足。
在这样的系统中,如果一个事件在规定时间期限内没能处理完,或者延迟处理,则会导致致命的系统错误。
在软实时系统中,任务能够得到满足的时间处理,得到系统的时间也能够在截止期限前得到处理。
但系统能不能保证时刻都能满足这样的条件,当截止期限条件偶尔没得到满足时,并不会给整个系统带来致命的系统错误。
2.4按应用类分类
消费类电子产品,过程控制类产品,通信、信息类产品,智能仪器、仪表产品,航空航天设备与武器系统,公共管理与安全产品,生物、医学微电子产品等等[1].
第三章STM32F103单片机概述
3.1stm32简介
STM32系列产品是ST公司推出的一系列的性价比较高的单片机,专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARMCortex-M3内核。
按性能分成两个不同的系列:
STM32F103“增强型”系列和STM32F101“基本型”系列。
增强型和基本型主要区分在时钟频率上,增强型系列时钟频率达到72MHz,是同类产品中性能最高的产品;基本型时钟频率为36MHz。
两个系列都内置32K到128K的闪存,不同的是SRAM的最大容量和外设接口的组合。
时钟频率72MHz时,从闪存执行代码。
3.2stm32f103vet功能介绍
我们先从STM32内部说起,CPU采用的是72MHZ,1.25DMips/MHz,在周期存储器中是0等待时间,具有单周期乘法和除法功能。
存储器从32K字节至128K字节的闪存程序存储器,从6K字节至20K字节的SRAM.。
首先多的就是I/O接口,我们用的是100个引脚的,具有80个I/O口还是多功能双向5V兼容的,他们还可以映射到16个外部中断,并且2个12位的模数转换器具有双采样和保持功能,内部还自带了一个温度传感器,因为STM32属于ARM的低端产品,但是比其他的单片机高级,所以功能比较多,定时器就多大7个多,有16位的定时器3个,当定时器多大4个的时候,就具有捕获输出比较PWM或脉冲计数的通道,不仅定时器多,通信接口也多,有三种通信接口,USART接口、SPI同步串行接口、还有CAN接口和USB2.0全速接口。
最重要的是,有DMA控制器,支持内部和外部的数据存储,这样调用数据时可以不直接经过CPU[2],如图3-1所示。
3.3I/O端口
STM32芯片允许I/O引脚被配置为多种模式(需要软件进行配置),比如通用输入或输出,被称为通用GPIO(General-purposeI/O)。
而GPIO引脚被分为GPIOA、GPIOB……GPIOG不同的组,每组端口分为0~15共16个不同的引脚。
每个GPIO端口有两个32位配置寄存器,两个32位数据寄存器,一个32位置位复位寄存器,还有一个16位复位寄存器和一个32位锁定寄存器。
图3-1结构图
3.4I/O模式和速率的匹配
STM32的GPIO有多种模式,模拟输入、浮空输入、复用开漏输出、复用推挽输出、上拉/下拉输入、开漏输出、推挽输出,八种模式。
有三种速率配置,分别是2MHZ、10MHZ、50MHZ,输出速率[2]。
这个速率是对I/O端口的驱动电路的响应速度,而不是输出信号,该输出信号的速度与程序有关。
通过选择不同速率,输出驱动模块的选择也不同,以达到最佳的噪声控制和降低功耗的目的。
这八个模式,要根据具体的操作来选取要配置的模式,当想要点亮LED灯的时候,选择的是输出模式;当要进行串口通信时,TX和RX引脚要配置成复用推挽输出模式和浮空输入模式。
这样要根据具体的功能来配置I/O端口。
第四章嵌入式硬件电路设计
4.1Cortex-M3供电模块设计
Cortex-M3是一个低功耗模式的32位单片机,不像以往我们熟悉的8051和F020单片机都是有5V供电的,他们只需要用一个USB线接到电脑USB接口上就可以正常的工作,然而,Cortex-M3是一个2.0至3.6V供电的高速处理器,我们选择的3.3V供电,这样既不太高也不太低,同样我们也需要一个USB线,虽然是输出5V的电压,我们只需要给它降压到3.3V就可以了,需要一个3.3V稳压芯片就可以供电。
为了使输出电压更好的稳定输出分别在稳压芯片前后两端加上了去耦电容过滤掉噪声和毛刺[3]。
如图4-1
图4-1供电模块
4.2流水灯及独立按键复位电路设计
我们起初学的单片机,如8051和80c51F020,最开始做得实验就是有关LED灯的实验,格式各样的流水灯以及单独按键控制流水灯的形式,控制LED等得点亮和熄灭就是控制单片机引脚的输出状态,但是想要点亮LED灯有两种办法,一种是拉电流模式,另一种是灌电流模式。
我们采用的是罐电流方式的。
也就是通过3.3V的电源经过限流电阻,使其电流流入发光二极管,点亮LED。
然而,拉电流就是相反的[3],如图4-2所示。
既然有了流水灯,就缺不了控制流水灯的花样,按键就是通过断开和连接引脚输出的高到底电瓶和对单片机内部产生中断服务请求,由于嵌入式Corter-M3内部含有多个中断源,也就是I/O引脚的复用功能。
每当Corter-M3程序走到死循环和待机状态时,我们需要对其上电从新启动,使其所有的程序都回到初始化转头,在能够正常的工作,我们只需要加上一个复位的按键,就可以解决问题,避免了断电和上电的步骤。
复位功能是由于电容的充放电的原来完成的,这样我们只需要在按键的地方加上一个电容就可以了,如图4-3所示。
图4-2LED灯图4-3电路按键及复位电路
既然有了流水灯,就缺不了控制流水灯的花样,按键就是通过断开和连接引脚输出的高到底电瓶和对单片机内部产生中断服务请求,由于嵌入式Corter-M3内部含有多个中断源,也就是I/O引脚的复用功能。
每当Corter-M3程序走到死循环和待机状态时,我们需要对其上电从新启动,使其所有的程序都回到初始化转头,在能够正常的工作,我们只需要加上一个复位的按键,就可以解决问题,避免了断电和上电的步骤。
复位功能是由于电容的充放电的原来完成的,这样我们只需要在按键的地方加上一个电容就可以了。
如图4-3所示。
4.3ADC转换电路
我们日常生活中有很多的模拟量,如电压、压力、光强、温度等等,都是无法直接读出来的,为了更方便的对这些模拟量准确的数值,我们就需要把这些模拟量,转换成数字量,使其更好的读数和观察。
本文是以STM32F103VET6核心芯片扩展的外围电路,Corter-M3内嵌了3个12位的ADC,每个ADC共用多达18外部通道,可测量16个外部和2个内部信号源,并且可以实现单词或多次扫描转换。
这样就比其他的单片机方便多了,就不用在外接有关ADC转换的芯片了,只需要搭载一个模拟输入量既可以了。
该芯片内部结构是采用逐次逼近型模拟数字转换器。
该电路设计的是参考接地的,即Vref-=0V,而参考电压正极的范围为2.4V图4-4ADC采样电路
4.4串口通信
我们已经把流水灯和ADC的硬件电路设计完成了,在程序执行过程中我们可以通过点亮一个LED灯来显示代码执行的状态,然而ADC转换就不能够直接的表现出来,这样我们想要通过某些办法,显示在电脑上就可以直观的检测到数字量的变化,那么这时串口通信就起到直观重要的作用了。
该电路主要芯片是MAX3232CSE,搭载这个电路其实很简单,按照数据手册就可以了,外部需要四个0.1uF的电容,并且内部具有ESD保护。
STM32的PA10引脚的复用功能为USART1的Rx接到J1的第二个引脚,而PA9引脚的复用功能为USART1的Tx接到J1的第三个引脚上,这样接法和PC机的串口接法一样,就是使用两头都是母头的交叉线。
如图4-5所示。
串口线主要分为两种:
直通线和交叉线;
交叉线:
两个串口,5和5相连,2和3相连,3和2相连。
直通线:
两个串口,5和5相连,2和2相连,3和3相连[4]。
如图4-6所示。
图4-5串口电路
图4-6交叉线和直通线
4.5I2C-EEPROM电路设计
I2C总线是Philips公司推出的一种串行总线,是具备多主机系统所需要的包括总线裁决和高低速器件同步功能的高性能串行总线。
I2C总线只有两根双向信号线,一根是SDA数据线,一根是SCL时钟线。
所有连接到I2C总线上器件的数据线都接到SDA上,各器件的始终线都接到SCL上。
图4-7I2C总线基本结构
I2C总线是一个多主机的总线,它可以有一个或多个主机,主机控制着总线上的运行状态,主机的主要功能是发起始信号、发时钟信号和发结束信号的器件。
I2C总线的两根双向信号SDA和SCL,他们均要通过一个上拉电阻(约10K左右)接到正电源上,当总线处在空闲状态的时候,这两根线都处于高电平。
连接到总线上的器件,输出级必须是漏极开路或者集电极开路,等到某一个器件输出低电平的时候,都将会使其中线上的信号变为点电平,这样可以检测到有信号的变化,因为我们设置的SDA和SCL线处于线“与”的关系,另外一个原因是器件间的数据传输能够达到同步作用[4]。
图4-7所示。
串行EEPROM是目前单片机应用系统使用较普遍的存储器,其优点是体积小、功耗低、占用I/O口线少,性价格比高。
带有I2C总线接口的EEPROM芯片常用的是,我们选用的是AT24C系列的,主要型号和容量有:
AT24C01:
128字节、AT24C02:
256字节、AT24C04:
512字节、AT24C08:
1K字节、AT24C16:
2K字节。
我们选用的是AT24C02芯片,改芯片有固定地址部分是1010,A0、A1、A2引脚接到高、低电平后得到确定的3位编码,形成的7位编码即为该器件的地址码。
图4-8所示。
图4-8EEPROM电路
4.6CAN总线设计
CAN是ControllerAreaNetwork的缩写,可以代表控制器区域网络系统国际标准化的串行通信协议的总线,进行数据传输。
为了适应“量”的需要和减少线束,通过多个局域网,数据高速通信量大”。
CAN总线是一种多主方式的串行通讯总线,还具备抗电磁干扰的能力,并能测量、产生的任何错误。
CAN总线主要特点是低成本,传输距离远(长达10Km),传输速率数据最高时速可达1Mbit/s,可根据报文的ID地址决定接收或屏蔽该报文,发送的信息遭到破坏后,可自动重发,当产生的错误比较严重时,可以退出总线的功能。
CAN总线能够使用多种物理介质传输,例如同轴电缆,双绞线,光纤等,信号使用查分电压传送信号,两条信号线被称为CAN_H和CAN_L,静态时均是2.5V左右,CAN_H状态表示为逻辑1,也叫“隐性”,CAN_状态表示逻辑0,也称“显性”。
此时通常电压为:
CAN_H=3.5V,CAN_L=1.5V.如图4-9。
我们采用CAN的告诉收发器TJA1050,TJA1050可以为总线提供差动的发送功能,也可以为总线提供差动的接受功能。
两端个需要加上一个120欧姆的电阻,主要用于远距离传输时的阻抗匹配和增强EMC(电磁兼容)性能和消除电路中信号的反射等干扰。
图4-9CAN总线设计图
4.7以太网电路设计
以太网(Ethernet)局域网是计算机网络技术。
IEEE802.3标准由IEEE以太网标准的发展。
它指定的物理层连接,信号和媒体接入层协议。
以太网是最常见的局域网技术。
它在很大程度上取代了其他局域网标准。
以太网的标准拓扑总线拓扑结构,快速以太网(100Base-T,1000BASE-T标准)来减少冲突,最大程度的增加,网络的速度和效率,最大程度,使用交换机连接到网络和组织,使以太网拓扑结构已经成为一个星型.
我们利用ENC28J60,,主要有7个功能模块组成:
1.SPI接口、;2.控制寄存器3.双端口RAM缓冲器;4.判优器;5.总线接口,对通过SPI接收的数据和命令进行解析;6.MAC(MediumAccessControl)模块,符合IEEE802.3标准的MAC逻辑;7.PHY(物理层)模块,对模拟数据进行编码和译码。
该器件还支持其他模块,例如振荡器、片内稳压器、电平变换器和系统控制逻辑[5]。
图4-10所示。
图4-10以太网电路
同样需要一个网络变压器,我们采用的是HR911105A脉冲变压器。
它应具有2KV以上的电压隔离性能,防静电干扰。
两个变压器均需要额外的两个50欧姆的电阻和一个0.01uFd的电容与特定端相连。
ENC28J60的内部模拟电路需要在RBIASA引脚与地之间外接一个2.4K的电阻。
每个VDD和VSS引脚对都应该连接一个0.1uF的陶瓷旁路电容,这些电容应尽可能靠近引脚。
需要相对高的电流才能驱动双绞线接口,因此所有电缆应尽可能短,并且可以减少电阻损耗。
图4-11所示。
图4-11网络接口
第五章操作系统μC/OS-Ⅱ概要
5.1μC/OS-Ⅱ特性与功能介绍
μC/OS-Ⅱ嵌入式操作系统是由Tean.J.Labrosse开发的,从μC/OS~μC/OS-Ⅱ,经过十几年的发展,已经在世界范围内得到了广泛的应用,其功能在不断完善,受到嵌入式系统领域开发者的青睐。
μC/OS-Ⅱ具有以下的主要特性:
1)源代码公开
2)具有很好的可移植性
3)可固化
4)根据需要,可裁剪
5)占先式和多任务也
6)可确定性、系统服务、中断管理、稳定性与可靠性等[7]
5.2STM32单片机上的移植
μC/OS-Ⅱ移植主要需要修改三个文件,在一个微处理器平台上移植μC/OS-Ⅱ只需要修改OS_CPU.H,OS_CPU_A.ASM和OS_CPU_C.C这三个文件。
5.2.1内核头文件(OS_CPU.H)
我们在改变OS_CUP.H文件是首先要定义;数据类型、处理器相关代码、声明函数原型
全局变量OS_CPU_GLOBALS和OS_CPU_EXT允许我们是否使用全局变量。
数据类型,大多数Cortex-M3编译器中,short是16位,int是32位,尽管包含了浮点数,但μC/OS-Ⅱ中并没用到,M3是32位,所以堆栈的数据类型OS_STK设置32位,而M3的状态寄存器xPSR是32位。
typedefunsignedcharBOOLEAN;
typedefunsignedcharINT8U;
typedefsignedcharINT8S;
typedefunsignedshortINT16U;
typedefsignedshortINT16S;
typedefunsignedintINT32U;
typedefsignedintINT32S;
typedeffloatFP32;
typedefdoubleFP64;
typedefunsignedintOS_STK;
typedefunsignedintOS_CPU_SR;
5.2.2临界代码段
临界段,就是不可被中断的代码段,也就是说,为了某一段代码的顺利执行需要临时关闭一些中断,等待这段代码执行完之后在开启中断服务。
例如常见的入栈出栈等操作就不可被中断。
μC/OS-Ⅱ是一个实时内核,需要关闭中断进入开启中断退出林阶段。
μC/OS-Ⅱ通过定义了两个宏来关中断和开中断OS_ENTER_CRITICAL()、OS_EXTI_CRITICAL().
#defineOS_CRITICAL_METHOD3
#defineOSENTER_CRITICAL(){cpu_sr=OS_CPU_SR_Save();}
#defineOS_EXIT_CRITICAL(){OS_CPU_SR_Restore(cpu_sr)}
事实上,总共有3中开关中断的方法,根据不同的处理器选用不同的方法。
大部分情况下,选用第三种方法。
5.2.3栈的增长方向
按我们常理来看一般的栈增长方向是由低到高,而STM32的栈生长方向是个例外,它由高地址向低地址增长的,因此OS_STK_GROWTH定义为1.
#defineOS_STK_GROWTH1
5.2.4其他函数声明
在OS_CPU.H中,我们还声明了其它的使用函数,但是这几个函数都是在OS_CPU_A.ASM中实现的。
voidOSCtxSw(void);//用户切换
voidOSIntCtxSw(void);//中断任务切换
voidOSStartHighRdy(void);//在操作系统第一次启动调用切换
voidOS_CPU_PendSVHandler(void);//用户中断处理
5.2.5与CPU相关的C函数和钩子函数(OS_CPU_C.C)
移植μC/OS-Ⅱ时,我们要写10个简单的C函数:
9个钩子函数和1个任务堆栈结构初始化函数。
钩子函数,是指那些插入到某些函数中扩展这些函数功能的函数,钩子函数为第三方软件人员开发并提供扩充软件功能的入口点。
为了系统功能,μC/OS-Ⅱ提供大量的钩子函数,用户不需要修改μC/OS-Ⅱ内核代码程序,只需要向钩子函数添加代码就可以扩充μC/OS-Ⅱ的功能。
OSInitHookBegin(void)
OSInitHookEnd(void)
OSTaskCreateHook(OS_TCB*ptcb)
O