STM32单片机应用与全案例实践(第2版)课件 第5、6章 串口(USART)及其应用、同步串行接口总线SPI与I2C_第1页
STM32单片机应用与全案例实践(第2版)课件 第5、6章 串口(USART)及其应用、同步串行接口总线SPI与I2C_第2页
STM32单片机应用与全案例实践(第2版)课件 第5、6章 串口(USART)及其应用、同步串行接口总线SPI与I2C_第3页
STM32单片机应用与全案例实践(第2版)课件 第5、6章 串口(USART)及其应用、同步串行接口总线SPI与I2C_第4页
STM32单片机应用与全案例实践(第2版)课件 第5、6章 串口(USART)及其应用、同步串行接口总线SPI与I2C_第5页
已阅读5页,还剩72页未读 继续免费阅读

下载本文档

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

文档简介

第5章

串口(USART)及其应用1串行通信串行通信,同步/异步串行通信,USART/UARTSTM32的USART原理及其应用要领STM32有多达5个USART,数量多、功能强串行通信的配置STM32串口设置配置,常用的UART函数,串口助手串口通信应用实例收发轮询方式,收发中断方式,空闲中断方式234USART及其应用1串口通信嵌入式系统中的通信同步/异步串行通信USART/UART嵌入式系统中的通信嵌入式设备之间或嵌入式设备与外部设备之间常常要进行信息交换和数据传输,这个过程就是通信。1.内部通信嵌入式系统通常由多个硬件模块或组件组成,这些硬件模块或组件之间需要进行内部通信以实现协同工作。例如,一个嵌入式系统可能包括微控制器、传感器、执行器等多个模块,它们之间通过总线、中断或其他通信方式进行信息传递,以实现系统的整体功能。2.外部通信嵌入式系统通常需要与外部设备进行通信,以获取外部信息、控制外部设备或与其他系统进行交互。外部通信包括串口通信、网络通信、无线通信等。3.传感器与控制器通信嵌入式系统中经常涉及传感器与控制器之间的通信。通信可以是模拟信号的传输,也可以是数字信号的传输。4.网络通信对于连接到网络的嵌入式系统,网络通信变得至关重要,它包括以太网、Wi-Fi、蓝牙等通信方式。5.总线通信内部组件之间的通信一般通过总线进行,它可传输地址、数据和控制信号,从而协调各个组件的工作。USART及其应用2串口通信嵌入式系统中的通信同步/异步串行通信USART/UART同步/异步串行通信异步通信和同步通信是两种不同的通信方式,它们在数据传输的时序和同步性上有明显的区别。1.异步通信(1)与时序无关:在异步通信中,数据的传输不依赖严格的时序同步。(2)起始位和停止位:异步通信使用起始位和停止位来标识每个数据帧。(3)波特率:异步通信中,波特率是一个关键的参数,它指定了每秒传输的比特数。由于没有共享的时钟信号,发送端和接收端需要事先约定相同的波特率。(4)用途:异步通信常用于距离相对较短和速率较低的通信,例如串口通信。2.同步通信(1)时序同步:同步通信要求发送端和接收端在时序上保持同步。(2)时钟同步:发送端和接收端共享相同的时钟信号,以确保数据的传输时序一致。(3)速率同步:在同步通信中,不同设备之间的时钟速率要匹配一致,以保证数据的准确传输。(4)应用:同步通信通常用于高速数据传输和长距离通信,例如以太网通信、并行总线通信等。UART是异步通信的代表,而以太网、SPI、I2C等通信协议则是同步通信的代表。USART及其应用3串口通信嵌入式系统中的通信同步/异步串行通信USART/UARTUSART/UARTUSART和UART的主要区别在于,USART支持同步和异步通信,而UART仅支持异步通信。UART(UniversalAsynchronousReceiverTransmitter)即通用异步收发器,是一种用于串行通信的协议,它分为物理层和协议层。UART通常用于与外部设备进行串行通信,数据通过引脚逐位进行传输,以实现数据的发送与接收。在UART通信中,发送端产生的不同长度的时间间隔决定了数据的传输速率,即波特率。1.物理层1)引脚定义2)电压特性3)物理接口4)USB转串口模块2.串行通信协议的协议层1)帧结构2)波特率3)奇偶校验4)流控制。3.协议应用串行通信协议可应用于简单的点对点通信,也可应用于较为复杂的多点通信,如Modbus、RS-485等。USART及其应用4STM32的USART的原理及其应用要领STM32之USART的概述STM32之USART的基本原理STM32之USART的应用要领STM32之USART的初始化配置USART是UniversalSynchronous/AsynchronousReceiver/Transmitter的简称翻译成中文即为:通用同步/异步串行接收/发送器它具有全双工通用同步/异步串行收发能力。该接口是一个高度灵活的串行通信设备。STM32的USART模块分USART、UART两种:大容量STM32F103,有多达5个串口,前三个为USART,后两个则为UART,即:USART1,USART2,USART3,以及UART4、UART5区别呢?►全双工操作(相互独立的接收数据和发送数据)►独立的高精度波特率发生器,不占用定时器►支持5、6、7、8和9位数据位,1或2位停止位的串行数据帧结构►由硬件支持的奇偶校验位发生和检验►数据溢出检测;帧错误检测►包括错误起始位的检测噪声滤波器和数字低通滤波器►三个完全独立的中断,TX发送完成、TX发送数据寄存器空、RX接收完成►支持多机通信模式;支持倍速异步通信模式USART及其应用5STM32的USART的原理及其应用要领STM32之USART的概述STM32之USART的基本原理STM32之USART的应用要领STM32之USART的初始化配置两种通信方式————串行通信(分为单工、半双工、全双工)传输原理:数据按位顺序传输。优点:占用引脚资源少缺点:速度相对较慢——并行通信传输原理:数据各个位同时传输。优点:速度快缺点:占用引脚资源多串行通信的通信方式——

——同步通信:带时钟同步信号传输。SPI,IIC通信接口,一个时钟周期只传1bit信号——异步通信:不带时钟同步信号。UART(通用异步收发器),单总线,要求波特率匹配1/5常见的串行通信接口————UART ----TXD、RXD、GND——单总线 ----DQD18B20还记得吗?——SPI ----SCK、MISO、MOSI——I2C ----SCL、SDAUSART及其应用6STM32的USART的原理及其应用要领STM32之USART的概述STM32之USART的基本原理STM32之USART的应用要领STM32之USART的初始化配置USART(UART)通信接口形式————TTL——RS-232C2/5TTL电平RS-232C电平USART及其应用7STM32的USART的原理及其应用要领STM32之USART的概述STM32之USART的基本原理STM32之USART的应用要领STM32之USART的初始化配置5路USART的引脚关系——UART常采用三线制通信方式,三条线分别为RXD(数据接收线)、TXD(数据发送线)和GND(地线)。通信双方采取交叉连线的方式,即一方的TXD线与另一方的RXD线连接,二者的GND线连接起来以形成信号回路。3/5USART及其应用8STM32的USART的原理及其应用要领STM32之USART的概述STM32之USART的基本原理STM32之USART的应用要领STM32之USART的初始化配置USART(UART)的结构示意图————输入输出、硬件流控——波特率发生器——移位寄存器——多缓冲区与DMA4/5STM32之USART结构简图USART及其应用9STM32的USART的原理及其应用要领STM32之USART的概述STM32之USART的基本原理STM32之USART的应用要领STM32之USART的初始化配置波特率——串行通信速度的表示单位——波特率(BaudRate)与比特率波特率——码元传输速率单位,他说明单位时间传输了多少个码元。单位:Baud比特率——每秒传输二进制代码位数。单位:bit/s——举例说明1)如果在数字传输过程中,用0V表示数字0,5V表示数字1,那么每个码元有两种状态0和1。每个码元代表一个二进制数字。此时的每秒码元数和每秒二进制代码数是一样的,这叫两相调制,波特率等于比特率2)如果在数字传输过程中,0V、2V、4V和6V分别表示00、01、10和11,那么每个码元有四种状态00、01、10和11.每个码元代表两个二进制数字。此时的每秒码元数是每秒二进制代码数的一半,这叫四相调制,波特率等于比特率一半——波特率允许最大误差:5%5/5STM32之USART典型的波特率——2400、9600、19200、57600、115200、230769、461538、923076、2250000、4500000(4.5M/s)USART及其应用10STM32的USART的原理及其应用要领STM32之USART的概述STM32之USART的基本原理STM32之USART的应用要领STM32之USART的初始化配置USART应用步骤——非DMA方式第一步:波特率等串口通信模式配置第二步:串口涉及的GPIO引脚的配置——RX配置成GPIO_Mode_IN_FLOATING——TX配置成GPIO_Mode_AF_PP第三步:USART中断配置第四步:接收或者发送数据第五步:数据处理1/4STM32固件库USART相关的主要函数————USART_Init()——初始化USARTx串口——USART_Cmd()——使能USARTx串口——USART_ITConfig()——使能USARTx串口中断——USART_SendData()——发送一个字节数据——USART_ReceiveData()——从串口接收一字节数据如果采用中断方式(中断接收或中断发送,或者两者都采用中断),则还需要涉及到中断文件stm32f10x_it.c中的以下串口中断函数:——USARTx_IRQHandler()——中断函数USART及其应用11STM32的USART的原理及其应用要领STM32之USART的概述STM32之USART的基本原理STM32之USART的应用要领STM32之USART的初始化配置USAR初始化及其举例————打开时钟——GPIO、USARTx、AFIO如果是UART1,则挂在APB2桥上,因此采用RCC_APB2PeriphClockCmd()进行初始化,其余的UART2~5均挂在APB1上——GPIO初始化——配置UART相关属性通过结构体USART_InitTypeDef来确定。USART_BaudRate:波特率,视具体设备而定USART_WordLength:字长USART_StopBits:停止位USART_Parity:校验方式USART_HardwareFlowControl:硬件流控制USART_Mode:单/双工——使能串口1/2USART及其应用12STM32的USART的原理及其应用要领STM32之USART的概述STM32之USART的基本原理STM32之USART的应用要领STM32之USART的初始化配置举例——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_Tx|USART_Mode_Rx;USART_Init(USART1,&USART_InitStructure);USART_Cmd(USART1,ENABLE);2/2USART及其应用13串口通信配置串口配置解析常用的UART函数串口重定向串口调试助手配置USART外设在Connectivity选项卡中,选择USART1或其他USART外设,在USART配置选项中,启用USART外设并进行相应的配置,如图5.3所示。USART及其应用14串口通信配置串口配置解析常用的UART函数串口重定向串口调试助手配置USART外设启用串口中断,如图5.4所示。USART及其应用15串口通信配置串口配置解析常用的UART函数串口重定向串口调试助手配置USART外设设置相应的引脚PA9、PA10分别为复用推挽和浮空输入模式,如图5.5所示。USART及其应用16串口通信配置串口配置解析常用的UART函数串口重定向串口调试助手常用的UART函数在STM32的HAL库中,与UART相关的函数较多,包括初始化、发送、接收等功能函数。以下列举常用的UART函数及其功能描述,并给出应用示例。1.UART初始化函数(1)函数原型。HAL_StatusTypeDefHAL_UART_Init(UART_HandleTypeDefhuart);(2)功能描述:初始化UART外设。(3)应用范例。UART_HandleTypeDefhuart1;//初始化UART1huart1.Instance=UART1;huart1.Init.BaudRate=9600;huart1.Init.WordLength=UART_WORDLENGTH_8B;huart1.Init.StopBits=UART_STOPBITS_1;huart1.Init.Parity=UART_PARITY_NONE;huart1.Init.Mode=UART_MODE_TX_RX;huart1.Init.HwFlowCtl=UART_HWCONTROL_NONE;huart1.Init.OverSampling=UART_OVERSAMPLING_16;HAL_UART_Init(&huart1);USART及其应用17串口通信配置串口配置解析常用的UART函数串口重定向串口调试助手常用的UART函数在STM32的HAL库中,与UART相关的函数较多,包括初始化、发送、接收等功能函数。以下列举常用的UART函数及其功能描述,并给出应用示例。2.UART发送数据函数(1)函数原型。HAL_StatusTypeDefHAL_UART_Transmit(UART_HandleTypeDefhuart,uint8_tpData,uint16_tSize,uint32_tTimeout);(2)功能描述:发送数据。(3)应用范例。uint8_tdata[]="Hello,UART!";HAL_UART_Transmit(&huart1,data,sizeof(data),HAL_MAX_DELAY);USART及其应用18串口通信配置串口配置解析常用的UART函数串口重定向串口调试助手常用的UART函数在STM32的HAL库中,与UART相关的函数较多,包括初始化、发送、接收等功能函数。以下列举常用的UART函数及其功能描述,并给出应用示例。3.UART接收数据函数(1)函数原型。HAL_StatusTypeDefHAL_UART_Receive(UART_HandleTypeDefhuart,uint8_tpData,uint16_tSize,uint32_tTimeout);(2)功能描述:接收数据。

(3)应用范例。uint8_trxData[10];HAL_UART_Receive(&huart1,rxData,sizeof(rxData),HAL_MAX_DELAY);USART及其应用19串口通信配置串口配置解析常用的UART函数串口重定向串口调试助手常用的UART函数在STM32的HAL库中,与UART相关的函数较多,包括初始化、发送、接收等功能函数。以下列举常用的UART函数及其功能描述,并给出应用示例。4.UART中断接收回调函数(1)函数原型。__weakvoidHAL_UART_RxCpltCallback(UART_HandleTypeDefhuart);(2)功能描述:中断接收完成回调函数,用户可重写该函数(同名函数)以处理接收完成事件,因为它是弱函数(__weak函数)。(3)应用范例。voidHAL_UART_RxCpltCallback(UART_HandleTypeDefhuart){//自定义处理接收完成的相关函数体内容}USART及其应用20串口通信配置串口配置解析常用的UART函数串口重定向串口调试助手常用的UART函数在STM32的HAL库中,与UART相关的函数较多,包括初始化、发送、接收等功能函数。以下列举常用的UART函数及其功能描述,并给出应用示例。5.UART中断发送回调函数(1)函数原型。__weakvoidHAL_UART_TxCpltCallback(UART_HandleTypeDefhuart);(2)功能描述:中断发送完成回调函数,用户可重写该函数以处理发送完成事件。(3)应用范例。voidHAL_UART_TxCpltCallback(UART_HandleTypeDefhuart){//处理发送完成事件}USART及其应用21串口通信配置串口配置解析常用的UART函数串口重定向串口调试助手串口重定向串口重定向是指将标准输入输出流(通常使用printf和scanf函数进行串口输入、输出)通过某种方式重定向到指定的串口设备,这样在通信程序中就可直接使用C语言的标准库函数printf()和scanf()实现发送和接收。在嵌入式系统中,这样的操作常常用于通过串口与外部设备的通信,例如用计算机进行调试或与其他嵌入式设备进行数据交换。在5.3.1节生成的工程的基础上加入串口重定向部分的代码,可以实现串口重定向功能。(1)引用C标准输入输出头文件。/*Includes------------------------------------------------------------------*/include"main.h"include<stdio.h>/*Privateincludes----------------------------------------------------------*/USART及其应用22串口通信配置串口配置解析常用的UART函数串口重定向串口调试助手串口重定向串口重定向是指将标准输入输出流(通常使用printf和scanf函数进行串口输入、输出)通过某种方式重定向到指定的串口设备,这样在通信程序中就可直接使用C语言的标准库函数printf()和scanf()实现发送和接收。在嵌入式系统中,这样的操作常常用于通过串口与外部设备的通信,例如用计算机进行调试或与其他嵌入式设备进行数据交换。(2)重定向。/*USERCODEBEGINPFP*/int__io_putchar(intch){uint8_tc=ch;HAL_UART_Transmit(&huart1,&c,1,100);returnch;}/*USERCODEENDPFP*/USART及其应用23串口通信配置串口配置解析常用的UART函数串口重定向串口调试助手串口重定向串口重定向是指将标准输入输出流(通常使用printf和scanf函数进行串口输入、输出)通过某种方式重定向到指定的串口设备,这样在通信程序中就可直接使用C语言的标准库函数printf()和scanf()实现发送和接收。在嵌入式系统中,这样的操作常常用于通过串口与外部设备的通信,例如用计算机进行调试或与其他嵌入式设备进行数据交换。(3)在while语句中加入如下测试代码。/*USERCODEBEGINWHILE*/while(1){/*USERCODEBEGIN3*///HAL_UART_Transmit(&huart1,"123",3,1000);printf("123123\r\n");/*USERCODEEND3*/}/*USERCODEENDWHILE*/USART及其应用24串口通信配置串口配置解析常用的UART函数串口重定向串口调试助手串口调试助手串口调试助手是一种用于串口通信调试的工具,通常是一个图形化的软件应用程序。它能够监视串口数据的发送和接收,提供实时的数据显示,并支持一些调试功能,如数据的发送、接收、保存、清空缓冲区等,是嵌入式系统开发中不可或缺的工具,用于调试和验证串口通信的正确性和稳定性。串口调试助手有多个,如“串口小精灵”等,用户可通过关键词“串口调试助手”“串口调试工具”等进行搜索下载。USART及其应用25串口应用实例串口收发轮询方式串口收发中断方式串口空闲中断方式串口收发轮询方式1.轮询方式的一般步骤串口收发轮询(查询)方式是一种串口通信的实现方式,其中数据的发送和接收是通过轮询的方式进行的。在这种方式下,系统通过不断查询串口状态来确定是否可以进行数据的发送或接收,而不依赖中断或DMA等机制。在串口收发轮询方式中,通常包括以下几个步骤。(1)初始化串口。在系统启动时,需要进行串口的初始化,设置波特率、数据位、停止位等参数。(2)发送数据。当需要发送数据时,系统通过轮询(查询)串口的状态,检查发送缓冲区是否为空。如果发送缓冲区为空,系统将待发送的数据写入发送缓冲区,并等待数据发送完成。(3)接收数据。当需要接收数据时,系统通过轮询(查询)串口的状态,检查接收缓冲区是否有数据。如果接收缓冲区非空,系统将读取接收缓冲区中的数据。(4)轮询周期。上述发送和接收过程被包含在一个循环中重复进行,这个循环的周期可由系统的主循环控制,以调节轮询周期。USART及其应用26串口应用实例串口收发轮询方式串口收发中断方式串口空闲中断方式串口收发轮询方式2.轮询方式的特点(1)优点。①实现简单。轮询方式相对于中断或DMA方式,实现较为简单,不需要考虑中断服务函数或DMA配置。②适用于简单场景。在一些简单的嵌入式系统中,轮询方式足以满足通信需求。(2)缺点。①轮询效率低。轮询方式会占用系统的主循环时间,降低了系统的实时性和效率。②无法实现异步操作。无法实现异步的数据传输,可能导致系统响应速度较慢。③串口收发轮询方式适用于一些对实时性要求不高、系统相对简单的应用场景。在对实时性要求较高、需要异步操作的情况下,采用中断或DMA方式将更为合适。当然,选择哪种方式通常取决于具体应用需求和系统的复杂程度。USART及其应用27串口应用实例串口收发轮询方式串口收发中断方式串口空闲中断方式串口收发中断方式1.基本流程以下是串口收发中断方式的基本流程。(1)初始化串口。在系统启动时,需要进行串口的初始化,设置波特率、数据位、停止位等参数。(2)配置中断。使能串口的接收和发送中断,通常包括接收缓冲区非空中断(RXNE)和发送缓冲区空中断(TXE)。(3)发送数据。当需要发送数据时,系统将待发送的数据写入发送缓冲区,并启动发送操作。当发送缓冲区空闲时,触发发送中断,通过中断服务程序(ISR)继续发送剩余数据。(4)接收数据。当串口接收到数据并存入接收缓冲区中时,触发接收中断。中断服务程序从接收缓冲区中读取数据,并进行相应的处理。(5)中断服务程序。中断服务程序是一段特殊的代码,它会在中断发生时被执行。在串口通信中,中断服务程序负责处理接收和发送中断,确保数据能够及时地被处理或发送。USART及其应用28串口应用实例串口收发轮询方式串口收发中断方式串口空闲中断方式串口收发中断方式2.中断方式的特点(1)优点。①异步处理。中断方式允许系统异步地进行串口数据的收发,提高了系统的实时性和效率。②适用于复杂场景。中断方式适用于对实时性要求较高,同时系统较为复杂的应用场景。(2)缺点。①实现相对复杂。与轮询方式比较,中断方式的实现相对复杂,需要考虑中断服务程序的编写和中断优先级的配置。②系统开销大。频繁地触发中断可能会增加系统开销。USART及其应用29串口应用实例串口收发轮询方式串口收发中断方式串口空闲中断方式串口空闲中断方式串口空闲中断方式是一种在串口通信中常用的方式,它基于串口的空闲线状态进行中断触发。相对于普通的中断方式,串口空闲中断方式可以更灵活地处理接收数据,减少了接收数据的延迟,其时序参见图5.1。以下对串口空闲中断方式与普通中断方式进行简要对比。USART及其应用30串口应用实例串口收发轮询方式串口收发中断方式串口空闲中断方式串口空闲中断方式普通中断方式:(1)中断触发条件:中断在接收寄存器非空或发送寄存器可用时触发。(2)中断处理:需要不断地检查接收寄存器的状态,当接收寄存器非空时立即处理接收到的数据。(3)接收延迟:中断是在接收寄存器非空时触发的,可能存在一定的接收延迟,尤其在数据包的末尾。空闲中断方式:(1)中断触发条件:中断在检测到串口空闲线状态时触发。(2)中断处理:中断服务程序可以更灵活地处理接收到的数据,在数据包的末尾触发中断,减少接收延迟。(3)接收延迟:更适合处理不定长度的数据包,能够更及时地触发中断,减少接收延迟。USART及其应用31串口应用实例串口收发轮询方式串口收发中断方式串口空闲中断方式串口空闲中断方式空闲中断的实现:在STM32等嵌入式系统中,空闲中断通常通过配置串口空闲中断的使能,并在中断服务程序中进行接收数据的处理。总结:普通中断方式:适用于定长数据包的场景;中断在接收寄存器非空或发送寄存器可用时触发。空闲中断方式:适用于不定长数据包的场景,可减少接收延迟;中断在检测到串口空闲线状态时触发。中断方式的选择取决于具体的应用场景和数据传输的特点。USART及其应用32两个USART的通信(STM32与PC、STM32与GSM)项目设计要求与GSM模块串行通讯协议及其设计程序算法与程序框架具体代码分析GSM模块——短信接收与发送STM32的USART3的TX、RX、GND分别与SIM800L模块的RXD、TXD、GND三线制形式连接本例使用的SIM800L模块的电源电压为4V(1A),不能超过4.2V,否则会烧毁模块,因此要做相应处理2/2淘宝上很多,但一定要注意电源处理哦USART及其应用33两个USART的通信(STM32与PC、STM32与GSM)项目设计要求与GSM模块串行通讯协议及其设计程序算法与程序框架具体代码分析工程模版中的4个文件————stm32f10x_it.h、stm32f10x_it.c——main.c——stm32f10x_conf.h重点讨论GSM模块的程序设计————初始化GSM模块——短信发送——短信接收处理(这部分被包含在主函数中)1/4不同的GSM模块,支持的运营商和AT指令系统会有差异,这一点要引起重视USART及其应用34两个USART的通信(STM32与PC、STM32与GSM)项目设计要求与GSM模块串行通讯协议及其设计程序算法与程序框架具体代码分析——初始化GSM模块2/4熟悉AT指令很关键USART及其应用35两个USART的通信(STM32与PC、STM32与GSM)项目设计要求与GSM模块串行通讯协议及其设计程序算法与程序框架具体代码分析——短信发送的流程图3/4接收到对方应答符号‘>’后,必须立即发送短信,例如:“IamOK”

,然后加上结束符“CTRL+Z”(即十六进制值0x1a)USART及其应用36两个USART的通信(STM32与PC、STM32与GSM)项目设计要求与GSM模块串行通讯协议及其设计程序算法与程序框架具体代码分析——主函数的流程图(包含短信接收)4/4向设定手机发送欢迎信息收到有效短信(“ON”或“OFF”),则点亮或关闭LED,并回送响应短信USART及其应用37两个USART的通信(STM32与PC、STM32与GSM)项目设计要求与GSM模块串行通讯协议及其设计程序算法与程序框架具体代码分析GSM初始化——1/3voidGSM_SMSInit(void){SendString(USARTmy2,(u8*)("ATE0\r"));

//关闭回显,否则会回送发的AT指令delay_nms(1000);SendString(USARTmy2,(u8*)("ATE0\r"));delay_nms(1000); //两次是为了稳妥,一次即可

RxCount2=0;//清接收缓冲区,等待接收新的应答EmptyRxBuffer2(Max);SendString(USARTmy2,(u8*)("AT\r"));//发送握手while(hand(RxBuffer2,(u8*)("OK"))!=1);//等待应答

RxCount2=0;EmptyRxBuffer2(Max);SendString(USARTmy2,(u8*)("AT+CNMI=2,2\r"));

//新消息来时直接发送到串口while(hand(RxBuffer2,(u8*)("OK"))!=1);//等待应答}大部分AT指令需要回车符结束,大部分AT指令有OK回送USART及其应用38两个USART的通信(STM32与PC、STM32与GSM)项目设计要求与GSM模块串行通讯协议及其设计程序算法与程序框架具体代码分析GSM发送短信——对方号码,发送内容。发送成功返回12/3SMSSend(u8*num,u8*text){u8cmgs[30]=“AT+CMGS=\”11111111111\“\r”;//手机号码u8i;for(i=9;i<20;i++)cmgs[i]=*num++;//填入实际的11位长号RxCount2=0;EmptyRxBuffer2(Max);SendString(USARTmy2,(u8*)(cmgs));//发送该指令while(hand(RxBuffer2,(u8*)(">"))!=1);//等待应答

for(i=0;*text!='\0';i++)//设置要发送的TEXT短信{TxBuffer2[i]=*text++;}TxBuffer2[i]='\x1a';//ctrl+Zi++;TxBuffer2[i]='\0';//字符串结束RxCount2=0;EmptyRxBuffer2(Max);SendString(USARTmy2,(u8*)(TxBuffer2));//发送该指令while(hand(RxBuffer2,(u8*)("OK"))!=1);//等待应答return1;}USART及其应用39两个USART的通信(STM32与PC、STM32与GSM)项目设计要求与GSM模块串行通讯协议及其设计程序算法与程序框架具体代码分析GSM短信接收处理——在主函数中3/3if(hand(RxBuffer2,(u8*)("ON"))==1){D2_ON; //执行点亮LED命令DFHM(RxBuffer2,buf);//提取应答中的对方号码SMSSend(buf,(u8*)("Yourcommandisexecuted,D2hasbeenONnow!"));//向对方回送短信}——提取应答中的对方手机号码11位//这里采用绝对地址抽取的方式,最好是采用查找特征子//串的方式//参数:rec为应答字符串,buf为存储抽取的电话号码voidDFHM(u8*rec,u8*buf){u8i;for(i=12;i<23;i++,buf++)//每条短信信息的第12字节开始是手机号码*buf=rec[i];}USART及其应用40本章归纳与小结中断的概念及其优先级串行接收溢出及其处理GSM的AT指令STM32的串口溢出问题——串口状态寄存器(USART_SR)中的位3为ORE,即:溢出错误(overrunerror)——0:没有溢出错误——1:检测到溢出错误在RXNE=1的条件下,也就是上次数据还没有读走,串口接收寄存器又接收了一个字节的数据并准备往RDR寄存器转移的时候,会由硬件将这个位置1如果向USART_ICR寄存器的ORECF位写1,可以清除这个标志如果USART_CR1寄存器中的RXNEIE位或EIE位是1,就会产生中断请求①

当这个位被置1,RDR寄存器中的数据不会丢,但移位寄存器中的数据(那个新的)就会被丢弃。如果在多缓冲区通讯时EIE位是1,并且ORE标志被置1的话,就会同步引起一个中断请求②

如果USART_CR3寄存器中的OVRDIS位是1,那么ORE这个位就会被长期的强制为零(即取消溢出检测功能)USART及其应用41本章归纳与小结中断的概念及其优先级串行接收溢出及其处理GSM的AT指令GSM模块的AT指令——GSM的AT指令较多,而且有不同的版本。但是大多数GSM模块均支持最基本的AT指令在程序设计中,要注意AT指令的有效性和兼容性问题本例在短信接收处理时,采用直接送串口方式,可以简化处理流程在向GSM模块发送指令前,一定要先握手——向GSM模块发送”AT\r”指令并等待GSM应答如果应答“OK”,则表示GSM模块处于正常工作状态,可以向其发送AT指令否则,则说明GSM不能接受指令USART及其应用42我们一起做个游戏——STM32中串口通信的程序设计有哪些要点?谢谢你!USART及其应用43STM32单片机应用与全案例实践——同步串行接口总线SPI与I2C44同步串行接口总线SPI与I2C——学习目标STM32的I2C总线1STM32的I2C总线的应用要领2硬件I2C与软件I2C3STM32的I2C和SPI的应用实例5重点——SPI、I2C接口的特性、初始化与接收发送操作难点——SPI、I2C接口的具体应用(可靠性和容错性)STM32的SPI4STM32单片机应用与全案例实践——同步串行接口总线SPI与I2C45同步串行接口总线SPI与I2C——STM32的I2C及其应用要点I2C总线的概况——1——I2C总线的基本特性1——I2C即IIC,为“Inter-IntegratedCircuit”(集成电路总线)的缩写——它由飞利浦半导体公司在八十年代初设计出来的——它是一种高性能的同步串行总线。基本的I2C总线规范于20年前发布,其数据传输速率最高为100Kbits/s,采用7位寻址后增强为快速模式(400Kbits/s)和10位寻址,以满足更高速度和更大寻址空间的需求近来又增加了高速模式,其速度可达3.4Mbits/s——I2C总线保持其向下兼容性——I2C串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。所有I2C总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。各设备连接到总线的输出端时必须是漏极开路(OD)输出或集电极开路(OC)输出。各设备的SDA是“与”关系,SCL也是“与”关系——主从式通信方式——所谓主机是指启动数据的传送(发出启动信号)、发出时钟信号以及传送结束时发出停止信号的设备。被主机寻访的设备称为从机为了进行通讯,每个接到I2C总线的设备都有一个唯一的地址STM32单片机应用与全案例实践——同步串行接口总线SPI与I2C46同步串行接口总线SPI与I2C——STM32的I2C及其应用要点I2C总线的概况——2——SPI与I2C总线的区别1I2C的数据输入输出用的是一根线,而SPI的数据输入与输出是分开的由于上述原因,采用I2C时CPU的端口占用更少由于I2C的数据线是双向的,所以隔离比较复杂,而SPI则比较容易。所以,系统内部通信可用I2C,若要与外部通信则最好用SPI带隔离(可以提高抗干扰能力)I2C和SPI都不适合长距离传输STM32单片机应用与全案例实践——同步串行接口总线SPI与I2C47同步串行接口总线SPI与I2C——STM32的I2C及其应用要点I2C总线的概况——3——I2C总线的工作原理——11I2C总线上可以挂多个设备,每个I2C设备都有固定的地址。只有当I2C两条线上传输的地址值等于某个I2C设备的地址时,该I2C设备才作出响应数据传输后,必须要有应答信号(响应信号)。数据是从最高位开始传输数据传输前必须有开始信号,传输结束后必须有结束信号——开始信号:处理器让SCL时钟保持高电平,然后让SDA数据信号由高变低就表示一个开始信号——停止信号:处理器让SCL时钟保持高电平,然后让SDA数据信号由低变高就表示一个停止信号——数据传输:SDA上传输的数据必须在SCL为高电平期间保持稳定——响应信号(ACK):处理器把数据发给外接I2C设备,如何知道I2C设备已经收到数据呢?这就需要外接I2C设备回应一个信号给处理器因为处理器发完8bit数据后就不再驱动总线了(SDA引脚由输出变输入),而SDA和SDL硬件设计时都有上拉电阻,所以这时候SDA变成高电平。那么在第8个数据位,如果外接I2C设备能收到信号的话,将在第9个周期把SDA拉低,这样处理器检测到SDA拉低就能知道外接I2C设备数据已经收到STM32单片机应用与全案例实践——同步串行接口总线SPI与I2C48同步串行接口总线SPI与I2C——STM32的I2C及其应用要点I2C总线的概况——3——I2C总线的工作原理——21——多机通信I2C总线是允许挂载多个设备的,如何访问其中一个设备而不影响其他设备呢?答案是——主机(发送发起方)通过发送寻址从机(接收方)的数据帧。下图为寻址从机(接收方)的数据帧的示意图——S表示起始,P表示停止,A表示响应,DATA表示一个字节数据,SLAVEADDRESS表示从机地址(7bit)+R/W(1bit,就主机而言,0表示写,1表示读)因为用7bit表示从地址,那么可以挂载的从设备数,理论上是27=128个,当然这还取决于驱动能力STM32单片机应用与全案例实践——同步串行接口总线SPI与I2C49同步串行接口总线SPI与I2C——STM32的I2C及其应用要点I2C总线的概况——3——I2C总线的工作原理——21——多机通信I2C总线是允许挂载多个设备的,如何访问其中一个设备而不影响其他设备呢?答案是——主机(发送发起方)通过发送寻址从机(接收方)的数据帧。下图为寻址从机(接收方)的数据帧的示意图——S表示起始,P表示停止,A表示响应,DATA表示一个字节数据,SLAVEADDRESS表示从机地址(7bit)+R/W(1bit,就主机而言,0表示写,1表示读)因为用7bit表示从地址,那么可以挂载的从设备数,理论上是27-1=128-1个,当然这还取决于驱动能力。其中地址00为广播地址器件类型由D7-D4共4位决定的,自定义地址码由D3-D1共3位组成,这也就是寻址码。为什么同一I2C总线上同一型号的I2C设备最多只能挂8片的原因。读写控制码:最低一位就是R/W位STM32单片机应用与全案例实践——同步串行接口总线SPI与I2C50同步串行接口总线SPI与I2C——STM32的I2C及其应用要点STM32的I2C总线的基本特点——1——STM32有多达2个硬件I2C2——STM32的I2C总线提供多主机功能,控制所有I2C总线特定的时序、协议、仲裁和定时——支持标准(100kHz)和快速(400kHz)两种模式,同时与SMBus2.0兼容。通过数据引脚(SDA)和时钟引脚(SCL)连接到I2C总线——可以开启或禁止中断——根据特定设备的需要,可以使用DMA以减轻CPU的负担——具有可编程的I2C地址检测,具有可响应2个从地址的双地址能力。产生和检测7位/10位地址和广播呼叫——有较为完备的状态和错误标志还记得7位吗?那么问题来了,10位又是啥东东?STM32单片机应用与全案例实践——同步串行接口总线SPI与I2C51同步串行接口总线SPI与I2C——STM32的I2C及其应用要点STM32的I2C总线的基本特点——2——关于STM32之I2C模块的传说2——不少开发者在开发STM32的I2C接口程序时,总是会出现程序卡顿在某一处的现象,网上搜索的结果可以证明这一点——于是很容易得出结论:STM32本身I2C接口很差劲、很复杂,不想AVR等8位机的I2C接口好用——很多开发者放弃使用STM32本身的I2C模块,而采用软件模拟的方式实现I2C通信——在此建议,不要使用软件模拟实现I2C的方式,要充分使用STM32本身的I2C功能,因为STM32至少有一个I2C模块。STM32的I2C模块有不尽完善的地方,但关键还是要对它的特性有清晰的把握如果在程序中加入有效的容错机制,例如总线状态判断、超时处理、应答机制,STM32的I2C模块及其库函数还是十分好用的你会不会也做人云亦云的那一个?STM32单片机应用与全案例实践——同步串行接口总线SPI与I2C52同步串行接口总线SPI与I2C——STM32的I2C及其应用要点STM32的I2C总线的应用要点——1——STM32的I2C硬件接口编程时要注意的ABC3——把I2C的中断优先级提升到最高。对STM32系统而言,它最优选的I2C工作模式是中断或者DMA,或者两者的结合,而不是查询方式(POLLING)——把多于2个字节的发送与接收封装成利用DMA收发的函数,而把一个字节的接收和发送单独封装为一个POLLING(轮询)函数——在寻址某一I2C设备时,要先检查总线状态,如果状态为忙,则等待指定时间,如果超时,则说明I2C总线被死锁挂起。这时要采用一定的措施,让被寻址方结束当前内部的工作,退出总线死锁以恢复总线。主设备在对从设备进行操作前先和从设备握手是很好的防守编程模型——不要让I2C工作在88kHz的频率上(有人已用实验证明这个速度容易出现问题,不过作者没有实验证明)。在满足需要的情况下,不建议使用高速度,而采用较低速度,例如:100kHz即可——STM32之I2C的硬件接口负责实现满足I2C总线的规约,而应用程序则必须利用I2C控制寄存器和I2C的事件标志组合实施通信相关的工作:接收、发送和其它相关处理,在发送或接收完成后一定要查询并清除相关标志STM32单片机应用与全案例实践——同步串行接口总线SPI与I2C53同步串行接口总线SPI与I2C——STM32的I2C及其应用要点STM32的I2C总线的应用要点——2——I2C总线死锁原因及其解决办法3查阅ST的STM32的官方手册可知,在I2C_CR1寄存器中有一个Softwarereset位,即SWRST位。该位可以在出错或死锁时,用于复位STM32的I2C外设模块的I2C控制器在低功耗的STM32L0xx系列的用户指南中也提到可以用PE位复位熟悉套路很重要啊!否则,只能回农村STM32单片机应用与全案例实践——同步串行接口总线SPI与I2C54同步串行接口总线SPI与I2C——STM32的I2C及其应用要点STM32的I2C总线的应用要点——3——STM32的I2C发送程序流程3①检测I2C总线是否空闲②按I2C协议发出起始信号③发出7位器件地址和写模式④发送要写入的存储区首地址⑤用页写入方式或字节写入方式写入数据(多字节在这里循环)⑥清除应答标志⑦发出停止信号器件内地址(寄存器地址)用单字节循环也可以写入多字节。只是速度会慢点STM32单片机应用与全案例实践——同步串行接口总线SPI与I2C55同步串行接口总线SPI与I2C——STM32的I2C及其应用要点STM32的I2C总线的应用要点——4——STM32的I2C接收程序流程3①检测I2C总线是否空闲②按I2C协议发出起始信号③发出7位器件地址和写模式(伪写)④重新使能STM32的I2C外设模块,以清除相应事件标志EV6⑤发出要读取的存储区首地址⑥重发起始信号⑦发出7位器件地址和读模式⑧接收并应答————第一种情况:如果是单字节接收,则不应答,发送停止信号,读取1字节数据——第二种情况,如果是多字节接收,则最后一个字节不需应答,读取数据,最后一个字节接收前发送停止信号器件的寄存器地址(发送方)STM32单片机应用与全案例实践——同步串行接口总线SPI与I2C56硬件I2C与软件I2C硬件I2C是指STM32内置的I2C外设模块。软件I2C是指通过软件模拟实现的I2C功能。1硬件I2C设备配置流程在STM32上,使用I2C外设需要进行相关的初始化和配置工作,以满足具体应用的需求。通过HAL库提供的高级API,开发者能够更便捷地实现I2C通信功能。STM32单片机应用与全案例实践——同步串行接口总线SPI与I2C57硬件I2C与软件I2C接口函数及其应用以下是HAL库中部分典型的I2C相关函数的格式和应用范例。21.I2C初始化函数函数原型:HAL_StatusTypeDefHAL_I2C_Init(I2C_HandleTypeDefhI2C);应用范例:I2C_HandleTypeDefhI2C;if(HAL_I2C_Init(&hI2C)!=HAL_OK){Error_Handler();}STM32单片机应用与全案例实践——同步串行接口总线SPI与I2C58硬件I2C与软件I2C接口函数及其应用以下是HAL库中部分典型的I2C相关函数的格式和应用范例。32.I2C配置时钟和GPIO引脚函数函数原型:HAL_StatusTypeDefHAL_I2C_MspInit(I2C_HandleTypeDefhI2C);应用范例:voidHAL_I2C_MspInit(I2C_HandleTypeDefhI2C){//初始化时钟和GPIO引脚

//...}STM32单片机应用与全案例实践——同步串行接口总线SPI与I2C59硬件I2C与软件I2C接口函数及其应用以下是HAL库中部分典型的I2C相关函数的格式和应用范例。43.I2C主从模式配置函数函数原型:HAL_StatusTypeDefHAL_I2C_Master_Init(I2C_HandleTypeDefhI2C);HAL_StatusTypeDefHAL_I2C_Slave_Init(I2C_HandleTypeDefhI2C);应用范例:I2C_HandleTypeDefhI2C;...if(HAL_I2C_Master_Init(&hI2C)!=HAL_OK){Error_Handler();}STM32单片机应用与全案例实践——同步串行接口总线SPI与I2C60硬件I2C与软件I2C接口函数及其应用以下是HAL库中部分典型的I2C相关函数的格式和应用范例。54.I2C数据传输函数函数原型:HAL_StatusTypeDefHAL_I2C_Master_Transmit(I2C_HandleTypeDefhI2C,uint16_tDevAddress,uint8_tpData,uint16_tSize,uint32_tTimeout);HAL_StatusTypeDefHAL_I2C_Master_Receive(I2C_HandleTypeDefhI2C,uint16_tDevAddress,uint8_tpData,uint16_tSize,uint32_tTimeout);应用范例:I2C_HandleTypeDefhI2C;uint8_tdata_to_send=0xAA;uint8_tdata_received;if(HAL_I2C_Master_Transmit(&hI2C,device_address,&data_to_send,1,HAL_MAX_DELAY)!=HAL_OK){Error_Handler();}if(HAL_I2C_Master_Receive(&hI2C,device_address,&data_received,1,HAL_MAX_DELAY)!=HAL_OK){Error_Handler();}STM32单片机应用与全案例实践——同步串行接口总线SPI与I2C61硬件I2C与软件I2C接口函数及其应用以下是HAL库中部分典型的I2C相关函数的格式和应用范例。65.I2C中断和错误处理函数函数原型:voidHAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDefhI2C);voidHAL_I2C_ErrorCallback(I2C_HandleTypeDefhI2C);应用范例:voidHAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDefhI2C){//数据传输完成回调}voidHAL_I2C_ErrorCallback(I2C_HandleTypeDefhI2C){//错误处理代码}STM32单片机应用与全案例实践——同步串行接口总线SPI与I2C62硬件I2C与软件I2C接口函数及其应用以下是HAL库中部分典型的I2C相关函数的格式和应用范例。76.I2CDMA传输函数函数原型:HAL_StatusTypeDefHAL_I2C_Master_Transmit_DMA(I2C_HandleTypeDefhI2C,uint16_tDevAddress,uint8_tpData,uint16_tSize);HAL_StatusTypeDefHAL_I2C_Master_Receive_DMA(I2C_HandleTypeDefhI2C,uint16_tDevAddress,uint8_tpData,uint16_tSize);应用范例:I2C_HandleTypeDefhI2C;uint8_tdata_to_send=0xAA;uint8_tdata_received;if(HAL_I2C_Master_Transmit_DMA(&hI2C,device_address,&data_to_send,1)!=HAL_OK){Error_Handler();}if(HAL_I2C_Master_Receive_DMA(&hI2C,device_address,&data_received,1)!=HAL_OK){Error_Handler();}STM32单片机应用与全案例实践——同步串行接口总线SPI与I2C63硬件I2C与软件I2C接口函数及其应用以下是HAL库中部分典型的I2C相关函数的格式和应用范例。87.I2C7位和10位地址模式配置函数函数原型:HAL_StatusTypeDefHAL_I2C_Enable10bitAddrMode(I2C_HandleTypeDefhI2C);HAL_StatusTypeDefHAL_I2C_Disable10bitAddrMode(I2C_HandleTypeDefhI2C);应用范例:I2C_HandleTypeDefhI2C;if(HAL_I2C_Enable10bitAddrMode(&hI2C)!=HAL_OK){Error_Handler();}STM32单片机应用与全案例实践——同步串行接口总线SPI与I2C64硬件I2C与软件I2C接口函数及其应用以下是HAL库中部分典型的I2C相关函数的格式和应用范例。98.I2C中断状态清除函数函数原型:HAL_StatusTypeDefHAL_I2C_ClearError(I2C_HandleTypeDefhI2C);应用范例:I2C_HandleTypeDefhI2C;if(HAL_I2C_ClearError(&hI2C)!=HAL_OK){Error_Handler();}STM32单片机应用与全案例实践——同步串行接口总线SPI与I2C65硬件I2C与软件I2C接口函数及其应用以下是HAL库中部分典型的I2C相关函数的格式和应用范例。109.I2C自定义错误回调函数函数原型:voidHAL_I2C_ErrorCallback(I2C_HandleTypeDefhI2C);应用范例:voidHAL_I2C_ErrorCallback(I2C_HandleTypeDefhI2C){//自定义错误处理代码}STM32单片机应用与全案例实践——同步串行接口总线SPI与I2C66硬件I2C与软件I2C在STM32F103上通过软件模拟I2C通信协议实现I2C功能,需要通过GPIO口模拟I2C的时钟线(SCL)和数据线(SDA)。1教材6.3.3是一个简单的软件I2C初始化和数据传输的示例代码。使用的GPIO引脚:GPIOA_PIN_8对应SCL,GPIOA_PIN_9对应SDA。注意,此处使用开漏模式,因此务必在SCL和SDA上加合适的上拉电阻。一般而言,I2C速率越高,上拉电阻越小,功耗越大,故常选4.7kΩ的电阻。STM32单片机应用与全案例实践——同步串行接口总线SPI与I2C67同步串行接口总线SPI与I2C——STM32的SPI及其应用要点SPI是个啥东东SPI是串行外设接口(SerialPeripheralInterface)的缩写,它是一种高速的、全双工同步通信总线,四线接口,它简单易用,如今越来越多的芯片集成了这种通信协议SPI以主从方式工作。这种模式通常有一个主设备和一个或多个从设备,一般需要4根线,单向传输时则只需要3根线。它们分别是——SDI(数据输入) ——主入从出——SDO(数据输出) ——主出从入——SCLK(时钟) ——由主设备产生——CS(片选,多芯片时) ——由主设备控制的从设备使能信号1SPI的工作原理——串行通讯协议数据是一位一位传输的。由SCLK提供时钟脉冲,SDI、SDO则基于此脉冲完成数据传输数据输出通过SDO线,数据在时钟上升沿或下降沿时改变,在紧接着的下降沿或上升沿被读取,完成一位数据传输;输入的原理也是如此。这样,通过8次时钟信号的改变(上沿和下沿为一次),就可以完成8位数据的传输2STM32单片机应用与全案例实践——同步串行接口总线SPI与I2C68同步串行接口总线SPI与I2C——STM32的SPI及其应用要点SPI的特点和特性——主设备通过对SCLK时钟线的控制可以完成对通讯的控制,因此允许随时暂停通信——SPI的数据输入和输出线独立,所以允许同时完成数据的输入和输出(双向)——不同的SPI设备的实现方式不尽相同,主要是数据改变和采集的时间不同,在时钟信号上沿或下沿采集有不同定义,具体请参考相关器件的文档——SPI接口的一个缺点:有指定的流控制,没有应答机制确认是否接收到数据——SPI接口只适用于短距离通信3STM32单片机应用与全案例实践——同步串行接口总线SPI与I2C69同步串行接口总线SPI与I2C——STM32的SPI及其应用要点STM32之SPI总线的基本特性STM32有多达3个SPI模块SPI1的4根引脚MISO、MOSI、SCK(CLK)、CSN(CS)分别对应的引脚为GPIOA的:PA6、PA7、PA5、PA4——3线全双工同步传输,8或16位传输帧格式选择——主或从操作,8个模式波特率分频系数,SPI速度达到了18MHz主模式和从模式均可以由软件或硬件进行NSS管理:主/从操作模式的动态改变——可编程的时钟极性和相位,可编程的数据顺序——触发中断的专用发送和接受标志:SPI总线忙状态标志——支持可靠通信的硬件CRC——NSS(从设置选择),这是一个可选的管脚,用来选择主/从设置,他的功能是用来作为片选管脚,让主设备可以单独的与特定从设备通讯,避免数据线上的冲突。从设备的NSS管脚可以由主设备当做一个标准的IO来驱动,一旦被使能SSOE位,NSS管脚也可以作为输出管脚,并在SPI设置为主模式时拉低,此时所有NSS管脚连接到主设备NSS管脚的SPI设备,会检测到低电平,如果他们被设置NSS硬件模式,就会自动进入从设备状态4STM32单片机应用与全案例实践——同步串行接口总线SPI与I2C70同步串行接口总线SPI与I2C——STM32的SPI及其应用要点STM32之SPI总线的使用

温馨提示

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

评论

0/150

提交评论