嵌入式系统原理与工程实践-基于STM32F10x系列全套课件_第1页
嵌入式系统原理与工程实践-基于STM32F10x系列全套课件_第2页
嵌入式系统原理与工程实践-基于STM32F10x系列全套课件_第3页
嵌入式系统原理与工程实践-基于STM32F10x系列全套课件_第4页
嵌入式系统原理与工程实践-基于STM32F10x系列全套课件_第5页
已阅读5页,还剩366页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第1章初识嵌入式系统目录1嵌入式系统发展历史与现状2嵌入式系统定义 3嵌入式系统组成 4嵌入式系统的特点 5嵌入式系统应用领域 6嵌入式处理器与嵌入式操作系统简介 7嵌入式系统未来发展趋势 1.1嵌入式系统发展历史与现状无操作系统阶段简单操作系统阶段实时操作系统阶段面向Internet阶段1.2嵌入式系统定义根据IEEE(国际电气和电子工程师协会)的定义,嵌入式系统是“控制、监视或者辅助设备、机器和车间运行的装置”。devicesusedtocontrol,monitor,orassisttheoperationofequipment,machineryorplants目前,国内一个普遍被认同的定义是:以应用为中心、以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。1.3嵌入式系统组成硬件层嵌入式微处理器精简指令集系统(ReducedInstructionSetComputer,RISC)

复杂指令集系统CISC(ComplexInstructionSetComputer,CISC)。存储器包含Cache、主存和辅助存储器通用设备接口和I/O接口嵌入式系统中常用的通用设备接口有A/D、D/A;I/O接口有RS-232接口、Ethernet、USB、音频接口、VGA视频输出接口、I2C、SPI、IrDA等中间层硬件层和软件层之间为中间层,也称为硬件抽象层(HardwareAbstractLayer,HAL)或板级支持包(BoardSupportPackage,BSP)。它将系统上层软件与底层硬件分离开来,使得系统的底层驱动程序与硬件无关,上层软件开发人员无须关心底层硬件的具体情况,根据BSP层提供的接口即可进行开发。系统软件层系统软件层由实时多任务操作系统(Real-timeOperationSystem,RTOS)、文件系统、图形用户接口(GraphicUserInterface,GUI)、网络系统及通用组件模块组成。RTOS是嵌入式应用软件的基础和开发平台。应用软件层应用软件层是由基于RTOS开发的应用程序组成,用来实现对被控对象的控制功能。功能层是面向被控对象和用户的,为方便用户操作,往往需要提供一个友好的人机界面。对于一些复杂的系统,在系统设计的初期阶段就要对系统的需求进行分析,确定系统的功能,然后将系统的功能映射到整个系统的硬件、软件和执行装置的设计过程中,称之为系统的功能实现。1.4嵌入式系统的特点嵌入式系统资源受限嵌入式系统通常专用于某一特定应用领域,其硬件资源不会像普通计算机一样丰富,MCU的处理能力也比不上通用CPU。嵌入式系统开发需要专用工具和特殊方法嵌入式系统不像通用计算机那样有了计算机就可以进行应用开发。其芯片本身不具备开发功能,必须要有一套与该MCU相配套的开发工具和开发软件。嵌入式系统要求较高可靠性和稳定性嵌入式系统与具体应用有机地结合在一起,与产品关系密切,升级换代也是和具体产品同步进行。而应用于一些关键性产品的嵌入式系统要求具有很高的可靠性和稳定性。嵌入式系统有实时约束嵌入式系统有比较严格的实时性要求,对于外部事件的发生要能够及时的响应。嵌入式系统通常极其关注成本在大多数情况下,需要注意的成本是系统成本。如果使用高集成度的微控制器,就能节省许多印刷电路板面积,并能使用功率更小的电源,从而节约相当多的成本。嵌入式系统大多要求低功耗许多嵌入式系统往往工作时间比较长,但是又无法像通用计算机那样有充足的电源供应,低功耗方式就成为嵌入式系统解决这对矛盾的有效途径。嵌入式系统专用性很强嵌入式系统通常是用在特定应用领域,如嵌入在手机、电冰箱、空调、各种机械设备、智能仪器仪表中起核心作用,功能是专用的。嵌入式系统技术含量高嵌入式系统是一个技术密集、资金密集、高度分散、不断创新的知识集成系统。其产品技术含量高,涉及多种学科,不容易开发,因此也不容易形成技术垄断。嵌入式系统具有很长生命周期嵌入式系统比通用计算机系统生命周期长,升级换代比通用计算机慢。1.5嵌入式系统应用领域工业控制交通管理 信息家电 家庭智能管理系统 POS网络及电子商务环境监测机器人巨大的市场计算机应用的普及、互联网技术的实用以及纳米微电子技术的突破,正有力推动着21世纪工业生产,商业活动科学试验和家庭生活等领域自动化和信息化进程。嵌入式产品的巨大商机--全过程自动化产品制造、大范围电子商务活动、高度协同科学实验以及现代化家庭起居。你接触的每一样东西将装有芯片和嵌入式软件。创新的机遇通用计算机产业是垄断的。嵌入式系统与技术是一个分散的工业,充满竞争、机遇与创新。没有哪一个系列的处理器和操作系统能够垄断全部市场即便在体系结构上存在着主流,但各不相同的应用领域决定了不可能有少数公司,少数产品垄断全部市场。因此嵌入式系统领域的产品和技术,必然是高度分散的,留给各个行业的中小规模高技术公司的创新余地很大。嵌入式处理器与嵌入式操作系统嵌入式系统硬件嵌入式系统软件硬实时和软实时硬实时和软实时的区别在于对外界的事件作出反应的时间。硬实时系统:绝对不能错过事件处理的时限。软实时系统:允许发生错过时限。硬实时系统和软实时系统实现的区别主要是在选择调度算法上。对于软实时系统,选择基于优先级调度的算法足以满足软实时系统的需求,而且可以提供高速的响应和大的系统吞吐量;对硬实时系统来说,需要使用的算法就应该是调度方式简单,反应速度快的实时调度算法。嵌入式微处理器1.ARM/StrongARM2.MIPS3.PowerPC4.x865.68K/ColdFire嵌入式操作系统国外著名的实时操作系统 国内著名的实时操作系统 操作系统选择国外著名的实时操作系统VxWorksQNXPalm

OSWindowsCELynxOS嵌入式LinuxμC/OS国内著名的实时操作系统Delta

OSHopenOSEEOSHBOS操作系统选择类型性能PalmOSWindowsCE3.0嵌入式Linux大小核心几十千字节,整个嵌入式环境也不大核心为占500KB的ROM和250KB的RAM。整个WindowsCE操作系统包括硬件抽象层(HAL,HardwareAbstractionLayer)、WindowsCEKernel、User、GDI、文件系统和数据库,大约共1.5MB核心从几十KB到500KB,整个嵌入式环境最小在100KB左右,并且以后还将更小可开发定制可以方便地开发定制用户开发定制不方便,受Microsoft公司限制较多用户可以方便地开发定制,可以自由地卸装用户模块,不受任何限制互操作性可操作性强互操作性较强,WindowsCE可通过OEM的许可协议用于其他设备互操作性很强实用性比较好比较好很好适用的应用领域应用领域较广,特别适用于掌上电脑的开发应用领域较广,WindowsCE是为新一代非传统的PC设备而设计的,这些设备包括掌上电脑、手提电脑以及车载电脑由于Linux内核结构及功能等原因,嵌入式Linux应用领域非常广泛,特别适用于进行信息家电的开发1.7嵌入式系统未来发展趋势网络互联成为必然趋势。精简系统内核、算法、降低功耗和软硬件成本。提供友好的多媒体人机界面。思考与拓展什么是嵌入式系统?嵌入式系统的一般组成结构是怎样的?请从产业发展规律说说为什么嵌入式系统在过去十年间得到迅猛发展而成为关注的重点?列举嵌入式产品,并据此说明嵌入式系统的特点。结合身边的嵌入式电子产品如手机、数码相机、机顶盒等,说明从底层硬件到上层应用软件,试分析一般嵌入式系统的组成主要分为哪几个部分,并写出各部分所完成的功能。第2章ARM、Cortex-M3及STM32简介目录1ARM及Cortex-M32STM32系列微控制器3STM32F1系列主流微控制器2.1ARM及Cortex-M3ARM是32位嵌入式微处理器的行业领先提供商,推出各种各样基于通用架构的处理器,这些处理器具有高性能和行业领先的功效,而且系统成本也有所降低。经典处理器应用程序处理器SecurCore处理器嵌入式处理器32位ARM指令集基于RISC原理,其中包括:大型统一寄存器文件加载/存储架构简单寻址模式

此外,ARM架构还包括某些可改进代码密度和性能的其他主要特性:可组合使用转换与算术或逻辑运算的指令用于优化程序循环的自动递增和自动递减寻址模式加载和存储多个指令以使数据吞吐量最大化几乎所有指令都采取条件执行的方式以使执行吞吐量最大化ARM处理器体系结构分类Cortex-M3组件图ARMCortex-M3具有以下优势或特点:三级流水线+分支预测哈佛结构内置嵌套向量中断控制器(NVIC)支持位绑定操作支持串行调试(SWD)内核支持低功耗模式高效的Thumb216/32位混合指令集32位硬件除法和单周期乘法支持存储器非对齐访问定义了统一的存储器映射极高的性价比2.2STM32系列微控制器ARMCortex-M的MCU系列产品STM微控制器产品系列2.3STM32

F1系列主流微控制器STM32F1系列包含五个产品线,引脚、外设和软件均兼容。超值型STM32F10024MHzCPU,具有电机控制和CEC功能基本型STM32F10136MHzCPU,具有高达1MB的FlashSTM32F10248MHzCPU具备USBFS增强型STM32F10372MHzCPU,具有高达1MB的Flash、电机控制、USB和CAN互联型STM32F105/10772MHzCPU,具有以太网MAC、CAN和USB2.0OTGSTM32F1系列产品

STM32F103xx系列产品

STM32F10x功能模块

STM32F10x内部结构

STM32F10x内部结构集成嵌入式Flash和SRAM存储器的ARMCortexTM-M3内核嵌入式Flash存储器和RAM存储器可变静态存储控制器(FSMC)嵌套矢量中断控制器(NVIC)外部中断/事件控制器(EXTI)时钟和启动Boot模式电源供电方案电源管理电压调节低功耗模式

STM32F10x片上外设DMARTC(实时时钟)和备份寄存器独立看门狗窗口看门狗SysTick定时器通用定时器(TIMx)基本定时器TIM6和TIM7高级控制定时器(TIM1和TIM8)I2C总线通用同步/异步收发器(USART)

STM32F10x片上外设串行外设接口(SPI)总线(I2S)安全数字输入输出接口(SDIO)控制器局域网(CAN)通用串行总线(USB)通用输入/输出(GPIO)模数转换器(ADC)数模转换器(DAC)温度传感器串行线JTAG调试端口(SWJ-DP)思考与拓展常见的基于ARM的单片机有哪些系列?单片机有哪些系列?各自有什么特点?请用最简洁的方式阐述STM32单片机的基本组成和基本工作原理。简述Cortex-M3内核的主要技术特性与结构。Cortex-M3是否支持ARM指令?采用哪种指令集架构?Cortex-M3内核有几种工作模式?并叙述。画出Cortex-M3内核体系结构。STM32内部集成的外设模块通常有哪些?STM32系列单片机有哪些外设接口模块?第3章STM32开发工具目录1硬件开发环境2RealViewMDK软件开发环境3实战任务:建立第一个嵌入式工程3.1硬件开发环境本书基于ALIENTEKMiniSTM32开发板进行学习实战。MiniSTM32采用的STM32F103RCT6芯片引脚图3.2RealViewMDK软件开发环境RealViewMDK(MicrocontrollerDevelopmentKit)ARM公司2007年推出的嵌入式开发工具包括µVisionIDE开发环境(德国Keil公司)RealViewRVCT编译器(ARM公司)用来开发基于ARM核MCU的嵌入式应用程序集两者优势,适合不同层次的开发者使用专业的应用程序开发工程师嵌入式软件开发入门者RealViewMDK特点支持ARM7、ARM9、Cortex-M3自动配置启动代码集成Flash烧写Simulation设备仿真性能分析包括外围接口固件库(FirewareLibrary)与ARMADS编译器比较,性能提高20%以上RealView编译工具集面向ARM技术的编译器中,能够提供最佳性能的一款编译工具能生成优化的32位ARM指令集16位的Thumb指令集最新的Thumb-2指令集完全支持ISO标准C和C++生成的代码密度高、容量最小、性能高的µVisionIDE一个窗口化的软件开发平台为广大单片机及嵌入式开发者所熟悉集成了功能强大的源代码编辑器丰富的设备数据库高速CPU及片上外设模拟器高级GDI接口Flash编程器完善的开发工具手册设备数据手册用户向导3.3实战任务:建立第一个嵌入式工程(1)新建一个保存工程的文件夹(2)点击RealViewMDK的下拉菜单:Project–>NewμvisionProject,然后将目录定位到新建文件夹“exp4-1-demo”之下。本书将工程命名为“demo”,点击保存。(3)命名并保存新工程之后,将弹出一个选择CPU的界面,选择芯片型号。因为采用的芯片型号为STM32F103RCT6,所以此处选择:STMicroelectronics–STM32F1-Series–STM32F103–STM32F103RC,最后点击OK即完成选型。(4)点击OK,弹出ManageRun–TimeEnvironment对话框。(4)点击OK,弹出ManageRun–TimeEnvironment对话框。这是RealViewMDK5新增的一个功能,在这个界面中可以添加需要的组件,从而构建开发环境,此处本书省略过于详细的介绍,因此直接点击Cancel。(5)在工程目录下面,复制STM32F10x_FWLib文件夹,该文件夹是ST官方提供的库函数源码文件。库内包含两个文件夹,.inc文件夹保存的是源文件,.src文件夹保存的是头文件。(6)在工程文件夹下面创建一个新的文件夹,命名为CORE,打开官方固件库包,将文件core_cm3.c和文件core_cm3.h复制到CORE下面去。然后将startup_stm32f10x_hd.s文件复制到CORE下面。(7)在工程目录下,新建文件夹并命名为USER,将以下3个文件:stm32f10x.h、system_stm32f10x.c、system_stm32f10x.h,复制到USER目录之下。然后将例程中原工程USER文件夹下的以下4个文件:main.c、stm32f10x_conf.h、stm32f10x_it.c、stm32f10x_it.h,复制到USER目录下面。(8)同样的,将例程工程中的HARDWARE、SYSTEM两个文件夹复制到工程下。(9)前8个步骤已成功将所需的固件库相关文件复制到了工程目录下。接下来将这些文件添加到工程中去。右键点击Target1,选择ManageComponents。也可直接点击图标。(10)选择ProjectTargets,将Target名字修改为Led,然后在Groups一栏删掉一个SourceGroup1,建立三个Groups:USER、CORE、FWLIB。然后点击OK。点击OK后,可在左侧界面查看Target的名字以及Groups的具体情况。(11)向Groups里面添加需要的文件。按照步骤10的方法,右键点击demo,选择ManageComponents,然后选择需要添加文件的Group,第一步选择FWLIB,然后点击右边的AddFiles,定位到刚才建立的目录STM32F10x_FWLib/src下面,将里面所有的文件选中(Ctrl+A),点击Add,然后点击Close。可以看到,Files列表下面包含了刚才添加的文件。(12)将Groups定位到CORE和USER下面,添加需要的文件。这里,CORE下面需要添加的文件为core_cm3.c、startup_stm32f10x_hd.s。USER目录下面需要添加的文件为main.c、stm32f10x_it.c、system_stm32f10x.c。同理,将SYSTEM、HARDWARE文件夹下的文件也添加进工程。最后点击OK,回到工程主界面。(13)编译工程。在编译之前,首先要选择编译中间文件的存放目录。方法是点击魔术棒。如果不设置Output路径,那么默认的编译中间文件存放目录就是自动生成的Objects目录和Listings目录。(14)配置头文件的搜索路径,也就是头文件目录。需要注意的是,对于任何一个工程,都需要把工程中引用到的所有头文件的路径全部包含进来。回到工程主菜单,点击魔术棒,跳出一个菜单。(14)配置头文件的搜索路径,也就是头文件目录。需要注意的是,对于任何一个工程,都需要把工程中引用到的所有头文件的路径全部包含进来。回到工程主菜单,点击魔术棒,跳出一个菜单。点击c/c++选项,然后点击IncludePaths右边的按钮,弹出一个添加path的对话框,将目录添加进去。注意,通常查找的范围仅限于一级目录,所以如果一级目录下还有子目录,path一定要定位到最后一级子目录。然后点击OK。(15)配置全局的宏定义变量。定位到c/c++选项卡,在Define输入框中填写“STM32F10X_HD,USE_STDPERIPH_DRIVER”。(16)此时,工程模板建立完毕,为了能在编译后生成.hex文件,需要进行如下的设置:点击魔术棒,进入配置菜单,选择Output。然后勾选三个选项。其中CreateHEXfile可编译生成.hex文件,BrowserInformation则可以查看变量和函数定义。(17)至此,工程模板建立起来,可以编写程序、实现某个特定的功能。输入代码后,可以进行软件仿真。在软件仿真前,先检查开发环境配置。打开Target选项卡,确认内容。主要检查芯片型号和晶振频率,其他选项一般按默认设置即可。(18)确认了芯片型号以及外部晶振频率(8.0MHz)之后,软件仿真的硬件环境也就随之基本确定下来了。接下来,点击Debug选项卡。在Debug选项卡中,选择UseSimulator,即使用软件仿真;选择Runtomain(),即跳过汇编代码,直接跳转到main函数开始仿真。设置下方的两个DialogDLL分别为DARMSTM.DLL和TARMSTM.DLL,对应的Parameter均为-pSTM32F103RC,用于设置支持STM32F103RC的软硬件仿真。最后点击OK,完成设置。(19)点击Debug菜单的Start/StopDebugSession选项,进入调试状态。通过调试状态界面可观察各个寄存器的状态。(20)I/O仿真。点击Peripherals菜单中的GeneralPurposeI/O选项,打开I/O观察窗口。(21)串口仿真。首先停止调试,点击Peripherals菜单中的USARTs选项,打开USART1窗口。点击View菜单中的SerialWindows选项,可查看UART1串口。(22)逻辑分析仪仿真。停止运行程序,点击View菜单中的AnalysisWindows选项,打开虚拟逻辑分析仪窗口。点击设置按钮,设置虚拟逻辑分析仪。(23)打开串口下载软件,选择CH340对应的串口,在工程Object目录下,选择要下载的可执行程序demo.hex。点击“开始编程”按钮,可以看到程序下载的相关信息。思考与拓展什么是STM32最小系统?请设计一个STM32最小系统。STM32的启动模式有几种?BOOT引脚有几个?分别如何设置?STM32单片机程序下载的方式有哪些?各自有哪些要求?STM32的软件开发环境有哪几种?各自有什么特点?KEILMDKARM开发环境下,如何进行软件仿真调试?建立Test工程并导入一例程主程序,编译并软件仿真观察其输出。ST固件库中,函数的命名规则有哪些特点?第4章嵌入式系统设计方法目录1生命周期2嵌入式系统开发项目生命周期3嵌入式系统项目开发流程4.1生命周期产品生命周期产品全生命周期项目生命项目技术生命项目企业生命周期4.2嵌入式系统开发项目生命周期可以把嵌入式系统的开发看作对一个项目的实施;项目的生命周期一般分为识别需求、提出解决方案、执行项目和结束项目4个阶段;结束项目执行项目提出解决方案识别需求投入人力时间识别需求是项目生命周期的最初阶段,主要任务是确认需求,分析投资收益比,研究项目的可行性,分析所需条件;风险分析制定系统规范需求风险时间风险资金风险项目管理风险系统功能系统限制系统开发资源识别需求提出方案向客户提交标书、介绍解决方案,赢得项目合同,既要展示实力又要合理报价;如果竞标成功则签定合同,厂商开始承担项目成败的责任;系统规划系统设计规划分析预估项目进程设计系统架构寻找适当方案提出方案执行项目由项目经理负责,细化方案,制定计划,协调人力和其他资源,监控进展,分析项目偏差;系统实现系统测试从硬件做起从驱动程序移植开始做起从现成平台做起功能测试集成测试系统测试执行项目环境测试出货测试系统测试系统测试环境测试系统调试结束项目主要包括移交工作成果,帮助客户实现商务目标;系统交接给维护人员;结清各种款项;售后服务项目讨论结束项目问题:功能、性能要求价格、开发周期等约束设计:

选择折衷分析比较计算评价嵌入式系统方法工具嵌入式系统设计

4.3

嵌入式系统的开发流程嵌入式系统是软硬件综合体:硬件架构上以嵌入式处理器为中心,配置存储器、I/O设备、通信模块等必要的外设;软件部分以软件开发平台为核心,向上提供应用编程接口(API);嵌入式系统中,软件和硬件紧密配合,协调工作,共同完成系统预定的功能;自上而下的数字系统设计方法由上而下是一个正统的设计方式,也就是说,所有的设计皆是遵循系统工程的流程来进行;由下而上表示一个系统是由已经有的基础(或组件)为起点,开始往上延伸,最后将系统完成;

需求分析规格说明书系统结构设计构件设计测试由上而下由下而上项目开发流程系统结构设计系统需求分析模具结构设计硬件构件设计软件构件设计系统集成系统测试产品规格说明书需求分析与规格说明需求分析需求分析的内容评价标准需求分析的描述例:GPS移动地图的需求规格说明规格说明的目标规格说明书的描述例:GPS系统规格说明书内容作用使用户和设计者有效交流、沟通,明确设计目标设计者-设计什么?有哪些要求?用户-将得到的系统是什么样的?目标形成需求文档内容功能性需求做什么?输入,输出,功能,……非功能性需求其他属性可靠性,速度,功耗,成本,大小,重量,设计时间,……需求分析与规格说明例:GPS移动地图的需求名称CPS移动地图目的为驾驶者提供的用户级移动地图输入一个电源按钮,两个控制按钮输出逆光LCD,显示400×600像素分辨率功能使用5种接收器的GPS系统;三种用户可选的分辨率总是显示当前的经纬度性能0.25s内即可更新一次屏幕生产成本100美元功耗100mW物理尺寸和重量不大于2×16m2,12盎司(约340g)体系结构设计硬件体系结构软件体系结构设计硬件构件和软件构件

体系结构描述告诉设计者需要什么样的构件。构件设计使构件和体系结构与规格说明一致。构件通常既包括硬件,如FPGA和电路板等,又包括软件模块。一些构件是现成的,例如,CPU在任何情况下都是一个标准构件,同样,还有存储器芯片和很多其他构件。有时,设计者必须自己设计一些构件,即使使用标准集成电路,也必须设计连接它们的印刷线路板。同时,很有可能要进行大量的定制编程。当然,建立嵌入式软件模块时,设计者必须用自己的专业技能确保系统实时性良好,并且在允许的范围内不占用更多的存储空间。目标系统构思模块的行为描述系统规范描述软硬件划分性能评估硬件综合、接口综合、软件编译软硬件集成软硬件协同仿真系统评估与设计验证有效性检查软硬件划分软硬件接口部分接口合成硬件部分软件部分硬件实现及优化软件实现及优化硬件综合软件综合网表可执行软件系统仿真和测试软硬件集成系统集成系统集成:把系统的软件、硬件集成在一起,进行调试,发现并改进构件设计过程中的错误;集成可分两步:在宿主机上模拟集成(软集成)在目标机上集成各构件设计阶段尽可能地按阶段组装系统和相对独立地测试系统功能;如果每次只对一部分模块排错,很可能更容易发现和识别简单的错误;系统测试系统测试:对系统进行测试,看是否满足规格说明书中给定的功能要求;选择测试实例:功能测试极限情况测试、边界测试、异常测试、错误测试、随机测试、性能测试覆盖测试语句测试、判定或分支覆盖、条件覆盖灰盒测试思考与拓展请归纳整理嵌入式系统开发全流程中涉及的知识领域,并思考哪些是属于嵌入式系统初学者应该掌握的关键技能。嵌入式系统设计中有哪些矛盾需要设计者和开发者解决?第5章存储器与总线结构目录1STM32系统结构2STM32内核(Cortex-M3)的结构3STM32存储器结构4启动配置5实战任务5-1:存储器相关代码分析5.1STM32系统结构STM32的系统结构5.2STM32内核(Cortex-M3)的结构Cortex-M3模块结构5.3STM32存储器结构Cortex-M3存储器映射结构STM32的存储器地址空间

不同类型的STM32的SRAM起始地址都是0x20000000,终止地址都是0x20000000与其固定的容量之和。作用是存取各种动态的输入输出数据、中间计算结果以及与外部存储器交换的数据和暂存数据。设备断电后,SRAM中存储的数据就会丢失。Cortex-M3存储器映像包括两个位段(bit-band)区。这两个位段区将别名存储器区中的每个字映射到位段存储器区中的一个位,在别名存储区写入一个字具有对位段区的目标位执行读—改—写操作的相同效果。在STM32F10x里,外设寄存器和SRAM都被映射到一个位段区里,允许执行单一位段的写和读操作。别名区中的字对应位带区的位的映射公式如下:bit_word_addr

=bit_band_base+(byte_offset×32)+(bit_number×4)STM32的SRAM

STM32的Flash,严格说应该是Flash模块。该Flash模块包括:Flash主存储区、Flash信息区以及Flash存储接口寄存器区。3个组成部分分别在0x00000000~0xFFFFFFFF不同的区域。STM32的Flash块(Block)名称块基地址大小主存储区

扇区0(Page0)0x08000000~0x080003FF1K扇区1(Page1)0x08000400~0x080007FF1K扇区2(Page2)0x08000800~0x08000BFF1K扇区3(Page3)0x08000C00~0x08000FFF1K扇区4(Page4)0x08001000~0x080013FF1K………………扇区31(Page31)0x08007C00~0x08007FFF1K信息区系统存储区(SystemMemory)0x1FFFF000~0x1FFFF7FF2K选项字节区(OptionBytes)0x1FFFF800~0x1FFFF80F16存储接口寄存器区访问控制寄存器(FLASH_ACR)0x40022000~0x400220034密钥寄存器(FLASH_KEYR)0x40022004~0x400220074选项密钥寄存器(FLASH_OPTKEYR)0x40022008~0x4002200B4状态寄存器(FLASH_SR)0x4002200C~0x4002200F4控制寄存器(FLASH_CR)0x40022010~0x400220134地址寄存器(FLASH_AR)0x40022014~0x400220174保留(Reserved)0x40022018~0x4002201B4选项字节寄存器(FLASH_OBR)0x4002201C~0x4002201F4写保护寄存器(FLASH_WRPR)0x40022020~0x4002202345.4启动配置STM32F10x有三种启动模式,可通过BOOT[1:0]引脚选择。

根据选定的启动模式,主闪存存储器、系统存储器或SRAM可以按照以下方式访问:从主闪存存储器启动从系统存储器启动从内置SRAM启动

启动模式选择引脚启动模式说明BOOT1BOOT0X0主闪存存储器主闪存存储器被选为启动区域01系统存储器系统存储器被选为启动区域11内置SRAM内置SRAM被选为启动区域5.5实战任务5-1:存储器相关代码分析为了深入理解STM32F10x的存储器系统结构和外设配置,分析exp4-1-demo例程中的相关代码:(1)core_cm3.h

(2)stm32f10x.h

思考与拓展说明小端格式与大端格式的差别。Cortex-M3内核的存储器类型有什么?试画出Cortex-M3的存储器映射图,并说明存储器位操作区域的特点。写出STM32总线种类。STM32各总线的速率范围。试画出STM32F103系列的芯片的总线结构图。第6章复位与时钟控制目录1复位2时钟控制3SysTick定时器4实战任务6-1:代码分析(1)5实战任务6-2:代码分析(2)6实战任务6-3:设置系统时钟7实战任务6-4:利用SysTick实现精准延时6.1复位STM32F10x系列支持三种复位形式系统复位电源复位备份域复位。

除了时钟控制器的控制状态寄存器RCC_CSR中的复位标志位外,系统复位将所有寄存器设置为复位值。当发生以下任一事件时,产生一个系统复位:外部复位WWDG复位IWDG复位SW复位低功耗管理复位系统复位电源复位设置所有寄存器初始值,除了备份域。当以下事件之一发生时,产生电源复位:上电/掉电复位(POR/PDRreset)从待机模式(StandBy)中返回电源复位备份域复位仅影响备份区域。当以下事件之一发生时,产生备份域复位:软件复位,可由设置备份域控制寄存器(RCC_BDCR)控制。在VDD和VBAT两者掉电的前提下,VDD或VBAT上电将引发备份区域复位。备份域复位6.2时钟控制系统时钟(SYSCLK)可由以下3种时钟源驱动:内部高速振荡时钟(HSI)外部高速振荡时钟(HSE)PLL时钟设备有以下2种二级时钟源:40kHz低速内部RC振荡时钟(LSI)32.768kHz低速外部晶振时钟(LSE)6.2时钟控制RCC寄存器时钟控制寄存器(RCC_CR)

时钟配置寄存器(RCC_CFGR)

时钟中断寄存器(RCC_CIR)

APB2外设复位寄存器(RCC_APB2RSTR)APB1外设复位寄存器(RCC_APB1RSTR)AHB外设时钟使能寄存器(RCC_AHBENR)APB2外设时钟使能寄存器(RCC_APB2ENR)APB1外设时钟使能寄存器(RCC_APB1ENR)备份域控制寄存器(RCC_BDCR)控制/状态寄存器(RCC_CSR)RCC库函数RCC相关库函数存放在stm32f10x_rcc.h和stm32f10x_rcc.c两个文件中。其中,stm32f10x_rcc.h是头文件,存放相关的库函数声明、结构体和宏定义;stm32f10x_rcc.c是源代码文件,存放相关的库函数定义。如果在用户应用程序中要使用STM32F10x时钟系统相关库函数,需要将时钟系统相关库函数的头文件包含进来,该步骤要通过在用户应用程序文件开头添加#include"stm32f10x_rcc.h"语句,或在工程目录下的stm32f10x_conf.h文件中去除//#include"stm32f10x_rcc.h"语句前的注释符//来完成。RCC库函数RCC库函数中涉及的结构体如下:typedefstruct{__IOuint32_tCR;__IOuint32_tCFGR;__IOuint32_tCIR;__IOuint32_tAPB2RSTR;__IOuint32_tAPB1RSTR;__IOuint32_tAHBENR;__IOuint32_tAPB2ENR;__IOuint32_tAPB1ENR;__IOuint32_tBDCR;__IOuint32_tCSR;uint32_tRESERVED0;__IOuint32_tCFGR2;}RCC_TypeDef;RCC库函数常用的STM32F10x时钟系统相关库函数有:(1)uint8_tRCC_GetSYSCLKSource(void);功能:返回用作系统时钟的时钟源。注释:该函数输入参数无,输出参数无。返回值可以是以下取值之一:

若采用HSI作为系统时钟,则返回值为0x00;

若采用HSE作为系统时钟,则返回值为0x04;若采用PLL作为系统时钟,则返回值为0x08。RCC库函数(2)voidRCC_GetClocksFreq(RCC_ClocksTypeDef*RCC_Clocks);功能:返回不同芯片时钟的频率。注释:实际应用时,根据外部晶振的实际值,修改库函数中定义HSE_Value的宏的值,且该数值不能为分数。输入参数无,输出参数RCC_Clocks为指向结构体RCC_ClocksTypeDef的指针,包括了各个时钟的频率(单位均为Hz):

SYSCLK_Frequency:返回SYSCLK的频率;

HCLK_Frequency:返回HCLK的频率;PCLK1_Frequency:返回PCLK1的频率;PCLK2_Frequency:返回PCLK2的频率;

ADCCLK_Frequency:返回ADCCLK的频率。RCC库函数(3)voidRCC_AHBPeriphClockCmd(uint32_tRCC_AHBPeriph,FunctionalStateNewState);功能:使能或者

禁止AHB总线上的外设时钟。注释:该函数的输入参数为RCC_AHBPeriph和NewState,RCC_AHBPeriph用于指定被使能或禁止时钟的AHB外设,根据具体目标微控制器AHB总线上连接的外设模块;NewState用于设置AHB总线上指定外设时钟的新状态,可以取ENABLE或DISABLE,用于打开或关闭AHB总线上指定外设的时钟。该函数无输出参数,无返回值。RCC库函数(4)voidRCC_APB2PeriphClockCmd(uint32_tRCC_APB2Periph,FunctionalStateNewState);功能:使能或者禁止APB2高速总线上的外设时钟。注释:该函数的输入参数为RCC_APB2Periph和NewState。RCC_APB2Periph用于指定被使能或禁止时钟的APB2外设,根据具体目标微控制器APB2总线上连接的外设模块。NewState用于设置APB2总线上指定外设时钟的新状态,可以取ENABLE或DISABLE,用于打开或关闭AHB2总线上指定外设的时钟。该函数无输出参数,无返回值。RCC库函数(5)voidRCC_APB1PeriphClockCmd(uint32_tRCC_APB1Periph,FunctionalStateNewState);功能:使能或者禁止APB1总线上的外设时钟。注释:该函数的输入参数为RCC_APB1Periph和NewState。RCC_APB1Periph用于指定被使能或禁止时钟的APB1外设,根据具体目标微控制器APB1总线上连接的外设模块。NewState用于设置APB1总线上指定外设时钟的新状态,可以取ENABLE或DISABLE,用于打开或关闭AHB1总线上指定外设的时钟。该函数无输出参数,无返回值。RCC库函数voidRCC_DeInit(void);voidRCC_HSEConfig(uint32_tRCC_HSE);ErrorStatusRCC_WaitForHSEStartUp(void);voidRCC_AdjustHSICalibrationValue(uint8_tHSICalibrationValue);voidRCC_HSICmd(FunctionalStateNewState);

voidRCC_PLLConfig(uint32_tRCC_PLLSource,uint32_tRCC_PLLMul);

voidRCC_PLLCmd(FunctionalStateNewState);voidRCC_SYSCLKConfig(uint32_tRCC_SYSCLKSource);voidRCC_HCLKConfig(uint32_tRCC_SYSCLK);RCC库函数

voidRCC_PCLK1Config(uint32_tRCC_HCLK);

voidRCC_PCLK2Config(uint32_tRCC_HCLK);

voidRCC_ITConfig(uint8_tRCC_IT,FunctionalStateNewState);

voidRCC_USBCLKConfig(uint32_tRCC_USBCLKSource);

voidRCC_ADCCLKConfig(uint32_tRCC_PCLK2);

voidRCC_LSEConfig(uint8_tRCC_LSE);

voidRCC_LSICmd(FunctionalStateNewState);voidRCC_RTCCLKConfig(uint32_tRCC_RTCCLKSource);voidRCC_RTCCLKCmd(FunctionalStateNewState);RCC库函数

voidRCC_APB2PeriphResetCmd(uint32_tRCC_APB2Periph,FunctionalStateNewState);

voidRCC_APB1PeriphResetCmd(uint32_tRCC_APB1Periph,FunctionalStateNewState);

voidRCC_BackupResetCmd(FunctionalStateNewState);

voidRCC_ClockSecuritySystemCmd(FunctionalStateNewState);

voidRCC_MCOConfig(uint8_tRCC_MCO);

FlagStatusRCC_GetFlagStatus(uint8_tRCC_FLAG);

voidRCC_ClearFlag(void);ITStatusRCC_GetITStatus(uint8_tRCC_IT);voidRCC_ClearITPendingBit(uint8_tRCC_IT);RCC初始化以8MHz外部HSE时钟为例,程序的时钟设置参数流程如下:(1)RCC_DeInit();(2)RCC_HSEConfig(RCC_HSE_ON);(3)HSEStartUpStatus=RCC_WaitForHSEStartUp();(4)RCC_HCLKConfig(RCC_SYSCLK_Div1);(5)RCC_PCLK2Config(RCC_HCLK_Div1);(6)RCC_PCLK1Config(RCC_HCLK_Div2);(7)RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9);(8)RCC_PLLCmd(ENABLE);(9)while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);(10)RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);(11)while(RCC_GetSYSCLKSource()!=0x08);6.3SysTick定时器SysTick是一个24位的系统节拍定时器(SystemTickTimer,SysTick),具有自动重载和溢出中断功能。SysTick定时器寄存器SysTick寄存器在core_cm3.h中定义的结构体如下:typedefstruct{__IOuint32_tCTRL;//Offset:0x000(R/W)SysTickControlandStatusRegister__IOuint32_tLOAD;//Offset:0x004(R/W)SysTickReloadValueRegister__IOuint32_tVAL; //Offset:0x008(R/W)SysTickCurrentValueRegister__IOuint32_tCALIB;//Offset:0x00C(R/)SysTickCalibrationRegister}SysTick_Type;SysTick定时器寄存器

SysTick定时器寄存器:

SysTick控制与状态寄存器(STCTRL)

SysTick重装值寄存器(STRELOAD)

SysTick当前计数值寄存器(STCURR)

SysTick校正值寄存器(STCALIB)SysTick库函数此处介绍的SysTick相关的库函数基于STM32F10x标准外设库的最新版本3.5,较之前的版本有较大的改动。该版本中,主要有两个SysTick相关库函数:SysTick_CLKSourceConfig(),在misc.c文件中定义;SysTick_Config(uint32_tticks),在core_cm3.h头文件中进行定义。voidSysTick_CLKSourceConfig(uint32_tSysTick_CLKSource);SysTick_Config(uint32_tticks);6.4实战任务6-1:代码分析(1)对STM32f10x时钟系统相关库函数进行阅读和分析。

1.RCC寄存器定义(stm32f10x.h)2.系统时钟频率定义(stm32f10x.c)/*#defineSYSCLK_FREQ_HSEHSE_VALUE*//*#defineSYSCLK_FREQ_24MHz24000000*//*#defineSYSCLK_FREQ_36MHz36000000*//*#defineSYSCLK_FREQ_48MHz48000000*//*#defineSYSCLK_FREQ_56MHz56000000*/#defineSYSCLK_FREQ_72MHz720000006.5实战任务6-2:代码分析(2)本小节的任务是对STM32f10x时钟系统启动过程相关代码进行阅读和分析。

通常情况下,时钟系统的函数调用顺序为startup_stm32f10x_hd.s

SystemInit()

SetSysClock()SetSysClockTo72()6.6实战任务6-3:设置系统时钟本小节的任务是掌握STM32f10x时钟系统设置的方法。

voidRCC_HSE_Configuration()//自定义系统时间(可以修改时钟){RCC_DeInit();//将外设RCC寄存器重设为缺省值

RCC_HSEConfig(RCC_HSE_ON);//设置外部高速晶振(HSE)if(RCC_WaitForHSEStartUp()==SUCCESS)//等待HSE起振{RCC_HCLKConfig(RCC_SYSCLK_Div1);//设置AHB时钟(HCLK)RCC_PCLK1Config(RCC_HCLK_Div2);//设置低速AHB时钟(PCLK1)

RCC_PCLK2Config(RCC_HCLK_Div1);//设置高速AHB时钟(PCLK2)

RCC_PLLConfig(RCC_PLLSource_HSE_Div2,RCC_PLLMul_9);//设置PLL时钟源及倍频系数

RCC_PLLCmd(ENABLE);//使能或者禁止PLL

while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET);//检查指定的RCC标志位设置与否,PLL就绪

RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);//设置系统时钟(SYSCLK)

while(RCC_GetSYSCLKSource()!=0x08);//返回用作系统时钟的时钟源,0x08:PLL作为系统时钟}}intmain()

{led_Init();

//LED端口初始化

RCC_HSE_Configuration(); //自定义系统时间,可修改分频

while(1)

{GPIO_SetBits(GPIOB,LED);

delay_ms(500); //精确延时为0.5s

GPIO_ResetBits(GPIOB,LED);

delay_ms(500); //精确延时为0.5s}}6.7实战任务6-4:利用SysTick实现精准延时本小节任务是,利用SysTick定时器实现精准延时,以本书采用的MiniSTM32为例,实现的功能是精准延时,控制系统板上两个LED灯闪烁。

1.调用SysTick_Config()函数实现第一种方法的编程要点是,调用SysTick_Config()函数设置计数器的重装载值。

SysTick_Delay_Ms()和SysTick_Delay_Us()分别实现n个1ms定时和n个1µs定时的功能。以SysTick_Delay_Ms()为例,其中的SysTick_Config(72000)定义了每间隔1ms触发一次SysTick定时器中断,当然,同时STCTRL寄存器的COUNTFLAG位会由0变为1,随后计数器又会从STRELOAD寄存器中取出72000开始递减,此时STCTRL寄存器的COUNTFLAG位会由1变为0,如此循环。基于这个特点,这里采用轮询STCTRL寄存器的COUNTFLAG位的方法以达到延时的目的。

2.调用中断处理函数实现另一种方法是调用中断处理函数。

代码实现的功能是:SysTick定时器每1ms产生一次SysTick中断,在中断处理函数中,只是简单的对毫秒总数递减,SysTick_Delay()阻塞在IT_Cnt!=0,超时后IT_Cnt为0,延时函数退出。

思考与拓展简述STM32F10x系列微控制器支持的三种复位形式。画出STM32复位电路,并简述复位电路的组成结构。分析STM32复位电路的工作原理。列出STM32的时钟源种类。简要画出并分析STM32的时钟树。概述STM32F103时钟配置的一般流程。简述SysTick定时器的作用。简述SysTick定时器的初始化方法。使用标准外设库编程的时候,需要调用哪个函数?重装值寄存器STRELOAD的值最大不可超过多少?思考与拓展以下是system_stm32f10x.c中关于定义系统时钟频率的程序段,如果系统时钟频率取24MHz,该程序段应如何修改?/*#defineSYSCLK_FREQ_HSEHSE_VALUE*//*#defineSYSCLK_FREQ_24MHz24000000*//*#defineSYSCLK_FREQ_36MHz36000000*//*#defineSYSCLK_FREQ_48MHz48000000*//*#defineSYSCLK_FREQ_56MHz56000000*/#defineSYSCLK_FREQ_72MHz72000000第7章GPIO及其应用目录1GPIO概述2AFIO3实战任务7-1:代码分析4实战任务7-2:LED控制7.1GPIO概述

通用输入/输出端口,通常简称为GPIO(GeneralPurposeInputOutput)。

端口号通常以大写字母命名,从“A”开始,依次类推。每个端口有16个I/O引脚,通常以数字命名,从0开始,直到15为止。例如,STM32F103RCT6芯片为64脚芯片,包括3个GPIO组,分别为GPIOA、GPIOB、GPIOC,同时每组GPIO口组有16个GPIO口。通常简略称为PAx、PBx、PCx,其中x为0~15。STM32F10x微控制器的I/O引脚除了通用功能外,还可以设置为一些片上外设的复用功能。GPIO内部结构GPIO工作模式GPIO支持4种输入模式和4种输出模式:GPIO_Mode_AIN模拟输入GPIO_Mode_IN_FLOATING浮空输入GPIO_Mode_IPD下拉输入GPIO_Mode_IPU上拉输入GPIO_Mode_Out_OD开漏输出GPIO_Mode_Out_PP推挽输出GPIO_Mode_AF_OD复用开漏输出GPIO_Mode_AF_PP复用推挽输出输入输出配置模式输入浮空/上拉/下拉配置:输入输出配置模式输出配置:输入输出配置模式模拟输入配置:GPIO寄存器在stm32f10x.h中定义的结构体如下:typedef

struct

{__IOuint32_tCRL;//端口配置低寄存器__IOuint32_tCRH;//端口配置高寄存器__IOuint32_tIDR;//端口输入寄存器__IOuint32_tODR;//端口输出寄存器__IOuint32_tBSRR;//端口位设置/清除寄存器__IOuint32_tBRR;//端口位清除寄存器__IOuint32_tLCKR;//端口配置锁存寄存器}GPIO_TypeDef;GPIO寄存器GPIO相关的库函数存放在stm32f10x_gpio.c和stm32f10x_gpio.h文件中。其中,stm32f10x_gpio.c作为源代码文件,用来存放GPIO库函数的定义;stm32f10x_gpio.h作为头文件,用来存放GPIO结构体和宏定义,以及GPIO库函数的声明。如果在用户应用程序中要使用STM32F10x的GPIO库函数,需要将GPIO库函数的头文件包含进来。该步骤可通过在用户应用程序文件开头添加#include“stm32f10x_gpio.h”语句,或在工程目录下的stm32f10x_conf.h文件中去除//#include“stm32f10x_gpio.h”语句前的注释符//来完成。GPIO库函数GPIO库函数中涉及的结构体如下:typedef

struct{ uint16_tGPIO_Pin;

GPIOSpeed_TypeDef

GPIO_Speed;

GPIOMode_TypeDef

GPIO_Mode;}GPIO_InitTypeDef;GPIO库函数常用的STM32F10xGPIO相关库函数有:(1)voidGPIO_DeInit(GPIO_TypeDef*GPIOx);功能:将GPIOx外设寄存器初始化为默认值。注释:该函数输入参数为GPIOx,输出参数无,返回值无。判断GPIOx具体为哪个端口,再通过操作RCC_APB2RSTR(APB2外设复位寄存器)对其寄存器进行复位。GPIO库函数(2)voidGPIO_Init(GPIO_TypeDef*GPIOx,GPIO_InitTypeDef*GPIO_InitStruct);功能:按照GPIO_InitStruct结构体变量所配置的参数来初始化GPIOx寄存器。注释:该函数的输出参数无,返回值无。输入参数为GPIOx和GPIO_InitStruct。GPIOx选择GPIO端口,x可以是A、B、C、D、E、F或G。GPIO_InitStruct指向结构体GPIO_InitTypeDef的指针。GPIO库函数(3)voidGPIO_SetBits(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);功能:指定GPIO端口的指定引脚置高电平。注释:该函数的输出参数无,返回值无。输入参数为GPIOx和GPIO_Pin。(4)voidGPIO_ResetBits(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);功能:指定GPIO端口的指定引脚置低电平。注释:该函数的输出参数无,返回值无。输入参数为GPIOx和GPIO_Pin。GPIO库函数(5)voidGPIO_Write(GPIO_TypeDef*GPIOx,uint16_tPortVal);功能:向指定GPIO端口写入数据。注释:该函数输出参数无,返回值无。输入参数为GPIOx和PortVal。PortVal指待写入GPIO端口的数据值。(6)uint8_tGPIO_ReadOutputDataBit(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);功能:读取指定GPIO端口的指定引脚的输出值。注释:该函数输入参数为GPIOx和GPIO_Pin。输出参数无,返回值为GPIO端口的指定引脚的输出值。GPIO库函数(7)uint16_tGPIO_ReadOutputData(GPIO_TypeDef*GPIOx);功能:读取指定GPIO端口的输出值。注释:该函数的输入参数为GPIOx。输出参数无,返回值为GPIO指定端口的输出值。(8)uint8_tGPIO_ReadInputDataBit(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);功能:读取指定GPIO端口的指定引脚的输入值。注释:该函数输入参数为GPIOx和GPIO_Pin。输出参数无,返回值为GPIO端口的指定引脚的输入值。GPIO库函数(9)uint16_tGPIO_ReadInputData(GPIO_TypeDef*GPIOx);功能:读取指定GPIO端口的输入值。注释:该函数的输入参数为GPIOx。输出参数无,返回值为GPIO指定端口的输入值。(10)voidGPIO_EXTILineConfig(uint8_tGPIO_PortSource,uint8_tGPIO_PinSource);功能:选择被用作外部中断/事件线的GPIO引脚。注释:该函数的输入参数有GPIO_PortSource和GPIO_PinSource。GPIO_PortSource取值范围为GPIO_PortSourceGPIOx,x为A~G。GPIO_PinSource取值范围为GPIO_PinSourceX,X为0~15。该函数输出参数无,返回值无。GPIO库函数(11)voidGPIO_PinRemapConfig(uint32_tGPIO_Remap,FunctionalState

NewState);功能:改变指定外设的复用引脚映射。注释:该函数的输入参数为GPIO_Remap和NewState。GPIO_Remap用作选择重映射的外设,该函数的输出参数无,返回值无。GPIO库函数voidGPIO_AFIODeInit(void);voidGPIO_StructInit(GPIO_InitTypeDef*GPIO_InitStruct);voidGPIO_WriteBit(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin,BitAction

BitVal);voidGPIO_PinLockConfig(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin);voidGPIO_EventOutputConfig(uint8_tGPIO

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论