毕业设计(论文)基于嵌入式平台的智能化家居系统设计.doc
目 录基于嵌入式平台的智能化家居系统设计- 1 -一、设计题目- 1 -二、设计要求- 1 -三、设计作用与目的- 1 -四、所用设备及软件- 2 -五、系统设计方案- 2 -5.1 系统总体设计- 2 -5.2 系统工作原理- 3 -六、系统硬件设计- 3 -6.1 系统整体设计- 3 -6.2 各单元电路设计- 3 -6.2.1 STM32最小系统的设计- 4 -6.2.2电源设计- 5 -6.2.3 环境监测电路设计- 6 -6.2.4 GSM通信电路设计- 7 -6.2.5 照明设备和家用电器控制电路设计- 8 -6.2.6 窗帘控制电路设计- 9 -6.2.7语音播放电路设计- 10 -七、 系统软件设计- 11 -7.1 模块化编程思想彰显出其独特的优越性- 11 -7.2 系统程序设计- 12 -7.2.1 主程序流程设计- 12 -7.2.2 子程序设计- 13 -7.3 C/OS-II的移植- 17 -7.3.1 熟悉C/OS-II文件结构- 17 -7.3.2 将文件移入STM32工程- 18 -7.3.3 修改STM32中断向量表- 19 -八、仿真调试分析- 19 -8.1 系统硬件调试- 19 -8.2 系统软件及联机调试- 20 -8.2.1 主控程序调试- 20 -8.2.2 短消息发送调试- 20 -九、设计中的问题及解决方法- 21 -十、嵌入式系统学习心得- 21 -十一、参考文献- 23 -基于嵌入式平台的智能化家居系统设计一、设计题目基于嵌入式平台的智能家居系统设计二、设计要求基于嵌入式智能家居控制系统主要由系统服务器、家庭控制器(各种模块)、各种路由器、电缆调制解调器头端设备CMTS、交换机、通讯器、控制器、无线收发器、各种探测器、各种传感器、各种执行机构、打印机等部分组成。设计重点完成基于嵌入式系统平台的家居控制中心设备的结构、功能。系统采用SM8952AC25P、MT8870、TC35 modem和各类家居传感器设计制作一款智能家居控制系统样机。系统使用UC/OS-II嵌入式系统。系统设计主要包括:系统硬件的设计与调试和控制软件的编写与调试。本次基于嵌入式的智能化家居系统的设计,选择高性能的STM32F103RBT6为核心的控制芯片,植入C/OS-II实时操作系统。设计围绕智能家居中的智能照明、电动窗帘、背景音乐、安防报警、远程控制等方面以STM32F103RBT6为硬件开发平台,为设计具有实用性高、性价比高的智能化产品做市场调研,为在智能家居方向发展提供科技展望理念。本系统设计主要包括智能照明控制电路、电动窗帘控制电路、家用电器控制电路、环境监测电路、安防报警电路、远程控制电路和单片机集中控制与人机对话部分。其中,智能照明控制电路包括对多地、多个照明设备的同时或分开控制;电动窗帘控制电路则是根据需求自动控制窗帘,主要是通过控制电机的正反转来实现;家用电器控制电路主要是控制是否需要开启电器设备,包括电视、音乐播放器、空调等等;环境监测电路主要通过传感器获取室内温度、湿度、烟雾浓度等;安防报警电路主要对室内防盗等提供技术保障;远程控制电路包括用户在外地通过手机或者互联网对家中相应设备实现控制与信息交流等;单片机集中控制与人机对话部分主要是将各部分信息收集到单片机进行集中处理,根据户主需求,执行相应的控制命令与操作,实现人机对话等。三、设计作用与目的通过本次基于STM32和C/OS-II的智能家居控制系统,熟悉并初步掌握STM32和C/OS-II的编程与实际应用。了解智能家居的发展历程与前景,熟悉智能家居的常见控制系统的组成与控制对象。加深对嵌入式概念的理解以及对相关知识的掌握,使自己的系统设计提升一个等级,朝着科技发展前沿靠近,学会分析嵌入式未来的发展趋势以及其在控制系统中正在扮演或即将扮演的重要角色。基于STM32和C/OS-II的智能化家居系统的设计,初步了解智能家居的发展动态。高性能的STM32单片机和C/OS-II即将在智能家居中承担重要角色。通过本次设计,有效的提高了对STM32和C/OS-II的认识,更是了解了智能家居是物质生活发展的必然趋势。同时必将推动物联网的发展进程,使得物联网产业存在于各个角落。四、所用设备及软件本系统设计完全依赖个人计算机,从调研过程到设计报告,所有的工作都是在计算机的帮助下完成的,所以计算机是必备工具。同时随着智能手机的发展,手机功能也在不断完善与改进,有些手机软件同样也能完成个人计算机能完成的部分功能,也在本设计中占据一定地位。系统设计主要使用到的软件有Keil MDK-ARM、Proteus、C/OS-II等。五、系统设计方案5.1 系统总体设计基于STM32和C/OS-II的智能化家居控制系统,主要包括智能照明控制电路、电动窗帘控制电路、家用电器控制电路、环境监测电路、安防报警电路、远程控制电路和单片机集中控制与人机对话部分。具体人机对话部分还包括红外发送与接收,语音输出提示等。除此之外,系统的电源由220V交流电经电源模块转换为3.3V直流电和12V直流电,再经过SPX29300稳压芯片转换为5V和3.30V的不同电压等级,这里的3.30V为语音芯片供电;整个系统为了减少外部干扰对STM32的影响,都采用了光耦隔离,STM32是3.3V的工作电压,所以需要两个不同的3.3V电源;另外完成远程控制的GSM模块供电电压为4V,故使用SPX29302芯片得到4V的GSM供电电压。整个系统总体结构框图如图5.1所示。STM32控制中心红外遥控照明灯控制窗帘控制语音提示电器控制人体感应模块环境温度检测图5.1 系统结构框图5.2 系统工作原理整个系统结构如图5.1所示,围绕不同的控制模块,通过STM32将各个部分联系在一起。整个系统工作原理主要是通过遥控对STM32发出控制指令,单片机收到指令后执行相应的操作;环境温度检测电路主要采用DS18B20对室内进行温度采集后直接给单片机进行处理;人体感应部分采用热释电红外感应模块,主要用于防盗过程中对室内的监控,同时增加有G600模块完成短信的远程提示与控制功能;家电控制和照明灯控制主要是单片机控制相应的固态继电器来驱动家用电器的通断,根据不同的家电选择不同的固态继电器,功率要求高的家用电器采用单片机控制光电耦合器,再驱动继电器来控制接触器来实现控制;窗帘控制则是利用单片机控制电机的驱动芯片来控制电机的正反转,同时窗帘的位置由接近开关来识别;语音提示功能则是实现整个系统中的每个部分的操作语音提示,利用WT588D语音芯片通过D类功放模块连接喇叭。六、系统硬件设计6.1 系统整体设计系统硬件设计主要包括电源电路、STM32最小系统电路、环境监测电路、照明灯和家用电器控制电路、电动窗帘控制电路、GSM通信电路和语音播放电路。电源部分直接由AC220V(50Hz/60Hz)转换得到DC3.3V、DC12V,再由DC12V经稳压芯片得到DC5V和DC4V等不同电压等级的电源,为STM32和各个功能模块供电。STM32的最小系统是完成系统工作的最低硬件配置,程序的下载使用J-Link下载器,支持JTAG和SW两种下载模式。环境检测电路包括对室内环境温度的检测,遥控的检测以及窗帘闭合的位置检测等。照明灯与家用电器的控制电路主要是控制某些照明灯或者某些家用电器的的开与关,单片机的控制纯属开关量控制,该部分电路要求较高的是控制部分与执行部分元器件的合理选择,器件的使用更要考虑到照明灯或家用电器设备的使用功率。电动窗帘控制电路就是控制直流电机的启动、停止和该电机的正反转,设计选择了专门的H桥电机驱动芯片L298N。GSM通信电路主要工作在住户不在家时的远程控制和信息交流,采用目前较为普遍应用的G600无线通信模块。语音播放电路包括控制语音芯片WT588D来经过功放模块播放语音或者是音乐,该部分功能模块的加入给人一种温馨的感觉,使得人机对话不再是单纯的文字、图片等形式。6.2 各单元电路设计任何系统都是由各个单元电路构成的,或者说系统的设计是完成了不同功能模块的整合。所以对一个系统的分析与设计,也就是对各单元电路的分析与设计。图6.1 STM32最小系统6.2.1 STM32最小系统的设计单片机最小系统,或者称为最小应用系统,是指用最少的元件组成的单片机可以工作的系统基本应用单元。STM32的最小系统包括电源提供,时钟管理,重置控制,启动模式的设置和调试管理。设备由2.0V到3.6V的操作电压(VDD),为提高ADC的转换精度,ADC还要有一个独立的电源供应,它可以被单独过滤,且不受PCB噪音的干扰,一个单独的VDDA引脚上的ADC电压输入是可用的。VSSA引脚提供一个被隔离的接地输入,当VREF-可用时,它必须被绑定到VSSA。100引脚的封装为了保证更好的低电压输入精度,可以连接一个单独的外部参考电压ADC输入到VREF+,VREF+的电压范围为2.0V到VDDA。64个引脚以及更少引脚的封装,VREF+和VREF-是不可用的,它们在内部被连接到一个ADC电压提供源(VDDA)并接地(VSSA)。值得注意的是,如果ADC被使用,VDD的范围必须被控制在2.4V到3.6V之间。如果ADC没有被使用,VDD的范围为2V到3.6V。VDD引脚必须连接带外部稳定电容器,包括五个100nF的陶瓷电容器和一个电解电容(最小4.7uF,最大10uF)。VBAT引脚必须连接到外部电池(1.8V<VBAT<3.6V),如果没有外部电池,这个引脚必须被连接到带100nF陶瓷电容器的VDD电压上。VDDA引脚必须被连接到两个外部稳定电容器(10nF陶瓷电容器和1uF电解电容)。另外STM32有一个完整的POR/PDR电路,它允许2V电压以上的适当操作,只要VDD低于特定的阀值VPOR/PDR,则设备将一直处于复位模式,而不需要外部重置电路。外部晶振电路的优点就是能产生非常精确的主时钟,晶振电路的两个电容,推荐使用高质量的范围在5pF到25pF之间的陶瓷电容。两个电容通常具有相同的值。晶体制造商通常确定一个电容值,该值为两个电容的组合。STM32的启动模式由BOOT0和BOOT1这两个模式选择引脚控制。具体控制方式如表6.1所示。表6.1 启动模式配置BOOT模式选择引脚启动模式别名备注BOOT1BOOT0X0用户闪存用户闪存被选作启动区01系统内存系统内存被选作启动区11嵌入式SRAM嵌入式SRAM被选作启动区这些选择的别名表明每种启动模式的相关的物理存储器。BOOT引脚的值在重置后SYSCLK的第四个上升沿时被锁定,在重置后,有用户决定是如何设置BOOT1和BOOT0引脚,来选择需要的启动模式。主机/目标接口是将主机连接到目标板的硬件设备,系统采用J-Link下载器,支持JTAG和SW两种下载模式。6.2.2 电源设计 系统STM32的工作电压为3.3V,加上外部其它功能模块所需的电压等级不相同,分别还用到4V、5V、12V电压等级。家庭用电为AC220V,直接通过两个专门的电源模块的到DC12V和DC3.3V。由于提高系统对外界的抗干扰能力,采用了电源隔离技术,微处理器采用了一个独立的电源,与其它功能模块之间的连接采用光电耦合器进行隔离。由于外部功能模块需要3.3V、4V、5V和12V等级的电源,所以外部5V的电源和微处理器的电源是不同的,为了区分这两个电源,原理图中使用3.3V和3.30V来区分不同的电压等级。为了得到不同的电压,可以使用专用的三端稳压芯片SPX9300-3.3、SPX9300-5.0以及 SPX29302可调电压电路从DC12V的电源模块得到4V的电压。每个电源等级还配置了一个电源指示灯便于观察。电源供电部分电路原理图如图6.3所示。图6.2 电源电路6.2.3 环境监测电路设计环境监测电路包含两个窗帘的接近开关的检测、红外遥控的接收,如图6.4所示。在家庭防盗系统部分控制电路还有一个热释电人体感应模块检测电路,如图6.5所示。图6.4中电路原理图包含232通信接口,方便与PC机的连接与控制。图6.3 环境监测与232通信电路(一)接近开关接近开关也叫近接开关,又称无触点行程开关,它除可以完成行程控制和限位保护外,还是一种非接触型的检测装置,用作检测零件尺寸和测速等,也可用于变频计数器、变频脉冲发生器、液面控制和加工程序的自动衔接等。特点有工作可靠、寿命长、功耗低、复定位精度高、操作频率高以及适应恶劣的工作环境等。 (二)红外遥控技术远程遥控技术又称为遥控技术,是指实现对被控目标的遥远控制,在工业控制、航空航天、家电领域应用广泛。红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备特别是家用电器广泛采用,并越来越多的应用到计算机系统中。 (三)热释电人体感应热释电红外传感器是一种能检测人或动物发射的红外线而输出电信号的传感器。早在1938年,有人提出过利用热释电效应探测红外辐射,但并未受到重视,直到六十年代,随着激光、红外技术的迅速发展,才又推动了对热释电效应的研究和对热释电晶体的应用。热释电晶体已广泛用于红外光谱仪、红外遥感以及热辐射探测器,它可以作为红外激光的一种较理想的探测器。热释电红外开关是BISS0001配以热释电红外传感器和少量外接元器件构成的被动式红外开关。它能自动快速开启各类白炽灯、荧光灯、蜂鸣器、自动门、电风扇、烘干机和自动洗衣机等装置,是一种高技术产品。特别适用于企业,宾馆、商场、库房及家庭的过道、走廊等敏感区域,或用于安全区域的自动灯光、照明和报警系统。(四)RS232通信随着计算机在工业的广泛应用,控制局域网络也深入应用到各行各业之中。现行的诸多控制系统,若采用单机控制方式已越来越难以满足设备控制的要求,因为往往所控制的设备只是整个系统的一个基本单元,它既需要外部输入一些必要的信息,同时,也需要向外部输出自身的运行参数和状态。所有这些,都要求我们采用控制网络技术,将众多设备有机地连成一体,以保证整个系统安全可靠地运行。目前,在国内应用的现场总线中,RS-485RS-422使用最为普遍。当用户要将基于标准的RS-232接口设备,如PC机,连接至由RS-485RS-422构成的通讯网络时,则必须作RS-232和RS-485RS-422之间的电平转换。6.2.4 GSM通信电路设计全球移动通讯系统(Global System of Mobile communication)就是众所周知的GSM,是当前应用最为广泛的移动电话标准。全球超过200个国家和地区超过10亿人正在使用GSM电话。GSM标准的无处不在使得在移动电话运营商之间签署“漫游协定”后用户的国际漫游变得很平常。GSM 较之它以前的标准最大的不同是它的信令和语音信道都是数字式的,因此GSM被看作是第二代(2G)移动电话系统。这说明数字通讯从很早就已经构建到系统中,GSM是一个当前由3GPP开发的开放标准。GSM模块和STM32的连接电路图如图6.5所示。图6.4 GSM模块接线图6.2.5 照明设备和家用电器控制电路设计照明灯与家用电器的控制电路主要是控制某些照明灯或者某些家用电器的的开与关,单片机的控制纯属开关量控制,该部分电路要求较高的是控制部分与执行部分元器件的合理选择,器件的使用更要考虑到照明灯或家用电器设备的使用功率。照明设备一般可以选择固态继电器足够,但是较大功率的家用电器,固态继电器就不能满足这样的需求,得外接继电器驱动较大功率的电器。本次系统设计给出了两个照明控制电路,两个家用电器驱动电路,实际应用过程中,远远不止两个电路接口,电路的控制只需要STM32一个I/O口而已,故在实际引用中只需预留I/O口即可。电路控制如图6.6所示。图6.5 照明电路和电器控制电路6.2.6 窗帘控制电路设计电动窗帘的智能控制,主要是控制两个电动机的正反转,选取了专门的H桥电机驱动芯片L298N来驱动该两个电机。图6.6 窗帘控制电机驱动电路图L298N是专用驱动集成电路,属于H桥集成电路,与L293D的差别是其输出电流增大,功率增强。其输出电流为2A,最高电流4A,最高工作电压50V,可以驱动感性负载,如大功率直流电机,步进电机,电磁阀等,特别是其输入端可以与单片机直接相联,从而很方便地受单片机控制。当驱动直流电机时,可以直接控制步进电机,并可以实现电机正转与反转,实现此功能只需改变输入端的逻辑电平。为了避免电机对单片机的干扰,本模块加入光耦,进行光电隔离,从而使系统能稳定可靠的工作。 6.2.7语音播放电路设计语音播放电路包括控制语音芯片WT588D来经过功放模块播放语音或者是音乐,该部分功能模块的加入给人一种温馨的感觉,使得人机对话不再是单纯的文字、图片等形式。WT588D语音芯片有DIP18,SSOP20和LQFP32的封装形式,根据外挂或者内置SPI-Flash的不同,播放时长也不同,支持2M32Mbit的SPI-Flash存储器,内嵌DSP高速音频处理器,处理速度快。内置13Bit/DA转换器,以及12Bit/PWM输出,音质好;PWM输出可直接推励0.5W/8扬声器,推挽电流充沛;支持DAC/PWM两种输出方式;支持加载WAV音频格式;USB下载方式,支持在线下载/脱机下载;即便是在WT588D语音芯片通电的情况下,也一样可以正常下载数据到SPI-Flash。支持MP3控制模式、按键控制模式、3×8按键组合控制模式、开口控制模式、一线串口控制模式、三线串口控制模式以及三线串口控制I/O口扩展输出模式;三线串口控制模式切换到三线串口控制I/O口扩展输出模式只需发送数据就可以进行切换。切换后仍可把切换前的最后一工作状态带进切换后的模式工作;任意设定显示语音播放状态信号的BUSY输出方式;抗干扰性强,可应用在工业领域;220段可控制地址位,单个地址位最多可加载128段语音,地址位内的语音组合播放;支持对已加载语音播放试听;语音播放停止马上进入休眠模式,芯片转为完全停止状态;15种按键控制模式,任意一个按键可设定任意一种控制模式;配套WT588D Voice Chip上位机软件,接口简单,使用方便。能极大限度的发挥出WT588D语音单片机的各项功能;简单的单片机编写方式,摆脱以往复杂繁琐的汇编思维;单个芯片支持外挂多个存储器;最多可加载500段用于编辑的语音;芯片复位时间5ms;工作电压DC2.8V5.5V;静态休眠电流小于10uA;支持加载6K22KHz采样率音频。由此可见,WT588D语音芯片的优越性。D类功放指的是D类音频功率放大器(有时也称为数字功放),D类功放是放大元件处于开关工作状态的一种放大模式。无信号输入时放大器处于截止状态,不耗电。工作时,靠输入信号让晶体管进入饱和状态,晶体管相当于一个接通的开关,把电源与负载直接接通。理想晶体管因为没有饱和压降而不耗电,实际上晶体管总会有很小的饱和压降而消耗部分电能。这种耗电只与管子的特性有关,而与信号输出的大小无关,所以特别有利于超大功率的场合。在理想情况下,D类功放的效率为100%,B类功放的效率为78.5%,A类功放的效率才50%或25%(按负载方式而定)。D类功放实际上具有开关功能,早期仅用于继电器和电机等执行元件的开关控制电路中。然而,开关功能(也就是产生数字信号的功能)随着数字音频技术研究的不断深入,用与Hi-Fi音频放大的道路却日益畅通。20世纪60年代,设计人员开始研究D类功放用于音频的放大技术,70年代Bose公司就开始生产D类汽车功放。一方面汽车用蓄电池供电需要更高的效率,另一方面空间小无法放入有大散热板结构的功放,两者都希望有D类这样高效的放大器来放大音频信号。其中关键的一步就是对音频信号的调制。图6.7 WT588D语音播放电路图七、 系统软件设计系统采用模块化编程,各部分相互独立又紧密联系。许多程序太长或太复杂,很难写在单一单元中。如果把代码分为较小的功能单元,将大大简化编程过程。模块化程序一般比单块程序容易编写、调试和修改。模块化编程方法类似于包含大量电路的硬件设计。器件或程序在逻辑上被分为多个“黑箱子”,这些黑箱子都有指定的输入和输出。只要把各个单元之间的接口定义好,各个单元的详细设计就可以独立进行了。7.1 模块化编程思想彰显出其独特的优越性第一,有效率的程序开发使用模块化方法可以更快地开发程序,因为较小的子程序比大程序更容易理解、设计和测试。定义好模块的输入和输出之后,程序员可以给模块提供需要的输入,通过检测输出来判断模块的正确性。然后由连接器把分立的模块连接、定位,生成一个单一的绝对地址的可执行的程序模块。最后,测试整个模块。第二,子程序可以重用为一个程序编写的代码经常可以用于其它的程序。在模块化编程中,可以把这些部分保存起来,以备将来使用。因为代码可以被重定位,所以保存的模块可以连接到满足其输入和输出要求的任意程序中。而在单块程序编程中,这样的部分深埋在整个程序中,不易被其它的程序使用。第三,便于调试和修改模块化程序一般比单块程序易于调试。因为精心定义了程序的模块接口,很容易把问题定位到特定的模块。一旦找到了有问题的模块,更正问题就相当容易了。模块化编程可以简化程序修改的工作。可以很有信心地把新的或调试过的模块连接到一个已有的程序,而不用更改程序的其余部分。7.2 系统程序设计7.2.1 主程序流程设计程序的执行有一个逻辑层次,C语言就是一些函数的组合,编程就是去编写一些函数以满足客观实际要求,在编写函数过程中的一些逻辑层次里面,有顺序、循环、跳转等等不同的控制逻辑。主程序主要完成所有外设、C/OS-II内核初始化,节拍设置,创建起始任务,启动多任务,最后无限等待,其主要函数流程图如图7.1所示。读AHB总线频率计算SysTick初值图7.1(b)节拍设置流程图入口写入SysTick初值返回多任务创建将自身挂起图7.1(c)起始任务创建流程图入口返回关总中断中断嵌套次数加1图7.1(d)Mystic中断函数流程图入口延时判断函数返回开中断退出中断函数设置时钟数值为0创建起始任务C/OS-II节拍设置初始化启动多任务所有外设初始化等待图7.1(a)主程序流程图C/OS-II内核初始化主函数开始主函数如下所示:int main(void)INT8U err;Init_All_Periph();/全部外设初始化OSInit();/初始化µC/OS内核 OS_CPU_SysTickInit( ); /µC/OS-II节拍设置OSTaskCreateExt(void (*)(void *) App_TaskStart, /创建起始任务(void * ) 0,(OS_STK * )&App_TaskStartStkAPP_TASK_START_STK_SIZE - 1,/分配起始任务的堆栈大小(INT8U ) APP_TASK_START_PRIO,/设置起始任务的优先级APP_TASK_START_PRIO,(OS_STK * )&App_TaskStartStk0,/堆栈起始地址APP_TASK_START_STK_SIZE,/堆栈大小(void*)0,OS_TASK_OPT_STK_CLR);Flag_Grp=OSFlagCreate(0x00,&err);/flags=0x00,表示事件标志组的初值。Sem=OSSemCreate(0);/对信号量的值,进行递增和递减的操作OSTimeSet(0);/设置系统当前的时钟数值为0 OSStart();/启动µC/OS-II多任务 while (1) ;7.2.2 子程序设计(一)初始化配置对于STM32来说,系统初始化配置要执行的操作包括时钟配置、I/O口(GPIO)配置、系统中断向量配置以及串口配置。初始化配置函数流程图如图7.2所示。调用的执行函数代码及功能说明如下所示:RCC_Configuration();/时钟配置GPIO_Configuration();/GPIO口配置NVIC_Configuration();/系统中断向量配置USART1_Configuration();/串口1配置开始时钟配置GPIO口配置系统中断向量配置标志位清除结束图7.2 初始化配置函数流程图USART2_Configuration();/串口2配置USART_ClearFlag(USART1,USART_FLAG_TC); /清除标志位,否则第1位数据会丢失USART_ClearFlag(USART2,USART_FLAG_TC);/清除标志位,否则第1位数据会丢失其中时钟配置函数为:/*函数功能:系统时钟配置,使能外设时钟*/void RCC_Configuration(void)SystemInit();/调用系统初始化函数初始化STM32RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO | RCC_APB2Periph_USART1, ENABLE );RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2|RCC_APB1Periph_TIM2| RCC_APB1Periph_TIM3, ENABLE);GPIO口配置:每个GPIO端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR,GPIOx_ODR),一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32 位锁定寄存器(GPIOx_LCKR)。GPIO端口的每个位可以由软件分别配置成多种模式。每个I/O端口位可以自由编程,然而I/0端口寄存器必须按32位字被访问(不允许半字或字节访问)。GPIOx_BSRR和GPIOx_BRR寄存器允许对任何GPIO寄存器的读/更改的独立访问;这样,在读和更改访问之间产生IRQ时不会发生危险。GPIO基本设置:GPIOMode_TypeDef GPIO mode(定义及偏移地址),包括:GPIO_Mode_AIN = 0x0,/模拟输入GPIO_Mode_IN_FLOATING = 0x04,/悬空输入GPIO_Mode_IPD = 0x28,/下拉输入GPIO_Mode_IPU = 0x48,/上拉输入GPIO_Mode_Out_OD = 0x14,/开漏输出GPIO_Mode_Out_PP = 0x10,/推挽输出GPIO_Mode_AF_OD = 0x1C,/开漏复用GPIO_Mode_AF_PP = 0x18,/推挽复用GPIO输入输出速度选择:typedef enum GPIO_Speed_10MHz = 1, GPIO_Speed_2MHz, GPIO_Speed_50MHzGPIOSpeed_TypeDef;#define IS_GPIO_SPEED(SPEED) (SPEED = GPIO_Speed_10MHz) | (SPEED = GPIO_Speed_2MHz) | (SPEED = GPIO_Speed_50MHz)串口配置:void USART1_Configuration(void)USART_InitTypeDef USART_InitStructure;USART_InitStructure.USART_BaudRate= 115200 ;/串口波特率设置USART_InitStructure.USART_WordLength= USART_WordLength_8b;USART_InitStructure.USART_StopBits= USART_StopBits_1;USART_InitStructure.USART_Parity= USART_Parity_No ;USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode= USART_Mode_Rx | USART_Mode_Tx;USART_Init(USART1, &USART_InitStructure);USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); USART_Cmd(USART1, ENABLE); /打开串口1void USART2_Configuration(void)USART_InitTypeDef USART_InitStructure;USART_InitStructure.USART_BaudRate= 9600 ;/串口波特率设置USART_InitStructure.USART_WordLength= USART_WordLength_8b;USART_InitStructure.USART_StopBits= USART_StopBits_1;USART_InitStructure.USART_Parity= USART_Parity_No ;USART_InitStructure.USART_HardwareFlowControl= USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode= USART_Mode_Rx | USART_Mode_Tx;USART_Init(USART2, &USART_InitStructure);USART_Cmd(USART2, ENABLE);USART_ITConfig(USART2, USART_IT_RXNE, DISABLE); (二)起始任务C/OS-II的任务创建,首先要创建起始任务。起始任务代码及相应说明如下所示:void App_TaskStart (void *p_arg)(void)p_arg;/传递变量为空,防止编译错误App_TaskCreate( );/开始创建多任务 while(1)OSTaskSuspend(OS_PRIO_SELF);/最高优先任务挂起7.3 C/OS-II的移植嵌入式操作系统中应用较为广泛的、源代码开放的C/OS-II在STM32芯片上的移植过程。首先要了解与熟悉C/OS-II源代码文件的结构,并分析C/OS-II 实时系统的内核结构,知道C/OS-II 中的任务、事件等基本概念以及C/OS-II 对任务和事件的基本操作。并根据实际应用介绍了本次移植用到的STM32F103RB系列微处理器并简要描述了该微处理器内核Cortex-M3的结构和编程模型以及部分本次移植用到的STM32F013RB系列微处理器的外设。然后在此基础上分析了C/OS-II在 STM32F103 系列芯片上的移植,并详细地介绍了C/OS-II 需要移植的各个部分代码的流程图、结构及其编写。7.3.1 熟悉C/OS-II文件结构C/OS-II需要移植的文件目录结构框图如图7.3所示,它们被打包放在同一个根目录文件夹里面。C/OS-II的内核结构图如图7.4所示,与处理器相关的文件(os_cpu.h)、 (os_cpu_a.asm)、(os_cpu_c.c)、(os_cpu_c.c)在移植的过程中,需要自己修改代码,但是这里的代码已经针对STM32微处理器进行了修改,所以只需直接移植。C/OS-II与处理器无关的代码os_core.c os_flag.cos_mbox.c ox_mem.cos_mutex.cos_q.cos_sem.cos_task.cos_time.cos_tmr.cos_dbg.cucos_ii.h用户应用程序C/OS-II与应用层有关代码app_cfg.hos_cfg.hUcos_Include.h与处理器相关的代码,移植修改os_cpu.hos_cpu_a.asmos_cpu_c.ccpu_a_asm图7.4 C/OS-II内核结构Source文件夹os_core.cos_flag.cos_mbox.cox_mem.cos_mutex.cos_q.cos_sem.cos_task.cos_time.cos_tmr.cucos_ii.hPorts文件夹os_cpu.hos_cpu_a.asmos_cpu_c.cos_dbg.ccpu_a.asmuC-CPU文件夹app_cfg.hos_cfg.hUcos_Include.h根目录文件夹需要移植的文件图7.3 C/OS-II移植文件目录结构框图7.3.2 将文件移入STM32工程编译平台:MDK软件建议将C/OS-II中与处理器无关的代码文件(除了os_dbg.c文件)加入到STM32工程中新建的一个管理文件夹里面(如取名为:uCOS_II/Source),如图7.5所示;将C/OS-II中与处理器相关的代码文件(包括os_dbg.c文件)也加入到STM32工程中新建的另一个管理文件夹里面(如取名为:uCOS_II/Port)如图7.6所示;将C/OS-II