项目6 串行通信设计与实现_第1页
项目6 串行通信设计与实现_第2页
项目6 串行通信设计与实现_第3页
项目6 串行通信设计与实现_第4页
项目6 串行通信设计与实现_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

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

文档简介

项目六串行通信设计与实现STM32串行通信基本知识异步通信在异步通信中,数据通常是以字符为单位组成字符帧传送的。字符帧由发送端一帧一帧地发送,每一帧数据是低位在前,高位在后,通过传输线被接收端一帧一帧地接收。字符帧也称为数据帧,由起始位、数据位、奇偶校验位和停止位等4部分组成,如下图所示。STM32串行通信基本知识同步通信同步通信是一种连续串行传送数据的通信方式,一次通信只传输一帧信息。信息帧和异步通信的字符帧不同,通常有若干个数据字符,如右下图所示。单同步字符帧格式:双同步字符帧格式:STM32串行通信基本知识串行通信的方式串行通信依数据传输的方向及时间关系可分为:单工、半双工和全双工。单工通信:通信线的一端接发送器,一端接接收器,数据只能按照一个固定的方向传送。STM32串行通信基本知识串行通信的方式串行通信依数据传输的方向及时间关系可分为:单工、半双工和全双工。半双工通信:系统的每个通信设备都由一个发送器和一个接收器组成,数据传送可以沿两个方向,但需要分时进行。STM32串行通信基本知识串行通信的方式串行通信依数据传输的方向及时间关系可分为:单工、半双工和全双工。全双工通信:系统的每端都有发送器和接收器,可以同时发送和接收,即数据可以在两个方向上同时传送。认识STM32的USART串口STM32拥有3路USART串口,串口资源丰富、功能强劲,其与传统的51单片机(或PC)的串口(UART)还有所区别。USART串口USART(通用同步/异步串行收发器)是一种能够把二进制数据按位(bit)传送的通信方式。STM32的USART串口采用了一种灵活的方法,使用异步串行数据格式进行外部设备之间的全双工数据交换。利用分数波特率发生器提供宽范围的波特率选择,并支持局部互连网LIN、智能卡协议和IrDASIRENDEC规范,还具有用于多缓冲器配置的DMA方式,可以实现高速数据通信。认识STM32的USART串口USART串口硬件连接USART串口是通过RX(接收数据串行输入)、TX(发送数据输出)和地3个引脚与其他设备连接在一起的。USART1串口的TX和RX引脚使用的是PA9和PA10;USART2串口的TX和RX引脚使用的是PA2和PA3;USART3串口的TX和RX引脚使用的是PB10和PB11;这些引脚默认的功能都是GPIO,在作为串口使用时,就要用到这些引脚的复用功能,在使用其的复用功能前,必须对复用的端口进行设置。STM32串口的相关寄存器分数波特率发生寄存器USART_BRRSTM32的USART串口是通过USART_BRR来选择波特率的。只用了低16位(12位整数和4位小数)。位15:4定义了USART分频器除法因子(USARTDIV)的小数部分;位3:0定义了USART分频器除法因子(USARTDIV)的小数部分。USART波特率与USART_BRR寄存器中的值USARTDIV关系如下: Tx/Rx波特率=其中:fPCLKx是给串口的时钟(PCLK1用于USART2、3、4、5,PCLK2用于USART1),USARTDIV是一个无符号的定点数。

STM32串口的相关寄存器控制寄存器USART_CR1,只用了低14位,高18位保留位13(UE)USART使能。0:USART分频器和输出被禁止;1:USART模块使能。位12(M)定义了数据字的长度。0:一个起始位、8个数据位、n个停止位;1:一个起始位、9个数据位、n个停止位。位6(TCIE)发送完成中断使能。0:禁止产生中断;1:当USART_SR中的TC为’1’时,产生USART中断。位5(RXNEIE)接收缓冲区非空中断使能。0:禁止产生中断;1:当USART_SR中的ORE或者RXNE为“1”时,产生USART中断。位3(TE)发送使能发送器。0:禁止发送;1:使能发送。位2(RE)接收使能。0:禁止接收;1:使能接收,并开始搜寻RX引脚上的起始位。STM32串口的相关寄存器数据寄存器USART_DR,只用了低9位位8:0(DR)是数据值,这9位包含了发送或接收的数据。USART_DR是由两个寄存器组成的,一个是用发送(TDR),一个是用接收(RDR),该寄存器兼具读和写的功能。TDR寄存器提供了内部总线和输出移位寄存器之间的并行接口;RDR寄存器提供了输入移位寄存器和内部总线之间的并行接口。当使能校验位(USART_CR1中PCE位被置位)进行发送时,写到MSB的值会被后来的校验位该取代。

当使能校验位进行接收时,读到的MSB位是接收到的校验位。STM32串口的相关寄存器状态寄存器USART_SR,只用了低10位位6(TC)是发送完成。0:发送还未完成;1:发送完成。位5(RXNE)是读数据寄存器非空。0:数据没有收到;1:收到数据,可以读出。位0(PE)是校验错误。0:没有奇偶校验错误;1:奇偶校验错误。在接收模式下,如果出现奇偶校验错误,硬件对该位置位,由软件序列对其清零(依次读USART_SR和USART_DR)。如果USART_CR1中的PEIE为“1”,则产生中断。任务13USART串口通信设计目标使用STM32的USART寄存器和库函数,通过USART串口发送数据和接收数据,实现串行通信的设计、运行与调试。任务要求利用STM32的USART1串口,计算机通过串口助手发送数据给STM32,STM32接收到数据后,通过接收数据串口中断来读取接收到的数据,然后将接收到的数据再通过串口发回计算机,LED闪烁表示系统正在运行。STM32串口的相关函数通常串口设置步骤可以有以下几个步骤:串口时钟使能,GPIO时钟使能;串口复位;GPIO端口模式设置;串口参数初始化;开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤);使能串口;编写中断处理函数。STM32串口的相关函数使能USART串口的时钟(前面已经介绍)USART1串口是挂载在APB2(高速外设)的外设,USART2和USART3串口是挂载在APB1(低速外设)的外设。使能USART1串口时钟的代码如下:RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);STM32串口的相关函数设置GPIO复用端口USART1串口TX和RX引脚使用PA9和PA10,默认功能是GPIO使能GPIOx的时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);TX用来发送数据,设置成复用功能的推挽输出(AF_PP) GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStructure);RX用来接收数据,设置成浮空输入(IN_FLOATING) GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA,&GPIO_InitStructure);STM32串口的相关函数串口复位串口复位是在USART_DeInit()函数中完成,USART1复位代码:

USART_DeInit(USART1);

//复位串口1初始化和使能串口初始化主要是配置串口的波特率、校验位、停止位和时钟等基本功能,是通过USART_Init()函数来实现的;串口使能函数USART_Cmd(),USART1串口使能代码:

USART_Cmd(USART1,ENABLE);STM32串口的相关函数数据发送和接收USART串口发送数据是通过USART_SendData()函数,来操作USART_DR寄存器发送数据的;向串口1发送数据代码如下:USART_SendData(USART1,USART_TX_BUF[t]);USART串口接收数据是通过USART_ReceiveData()函数,来操作USART_DR寄存器读取串口接收到的数据。读取串口1接收到的数据代码如下:Res=USART_ReceiveData(USART1);STM32串口的相关函数完成发送和接收数据的状态位通过读取串口的USART_SR状态寄存器,然后根据USART_SR的第5位(RXNE)和第6位(TC)的状态来判断。判断读寄存器是否非空(RXNE)。当RXNE位被置1时,说明串口已有数据接收到了,并可以读出来。代码如下:USART_GetFlagStatus(USART1,USART_FLAG_RXNE);判断发送是否完成(TC)。当该位被置1时,说明USART_DR内的数据已经发送完成了。代码如下:USART_GetFlagStatus(USART1,USART_FLAG_TC);STM32串口的相关函数开启串口响应中断串口接收到数据时(RXNE读数据寄存器非空),产生中断。例如开启USART1串口接收到数据中断的代码是://开启中断,接收到数据中断USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);串口在发送数据结束时(TC发送完成),产生中断。例如开启USART1串口发送完数据中断的代码如下:USART_ITConfig(USART1,USART_IT_TC,ENABLE);STM32串口的相关函数获取相应中断状态在使能了某个中断时,当该中断发生,就会设置状态寄存器中的某个标志位。在中断处理函数中,要判断该中断是哪种中断。例如,使能了USART1串口发送完成中断,当中断发生,便可以在中断处理函数中调用这个函数,来判断到底是否是串口发送完成中断,代码如下:USART_GetITStatus(USART1,USART_IT_TC);其返回值是SET,说明是发生了串口发送完成中断。STM32的USART1串口通信设计根据任务要求,

STM32的USART1串口通信过程如下:计算机通过串口助手发送数据给STM32;STM32接收到数据,就会进入接收数据串口中断,读取DR寄存器中接收到的数据;然后将接收到的数据,再通过串口发回计算机;最后还要LED闪烁,表示系统正在运行。编写usart.h头文件和usart.c文件usart.c文件主要包括支持printf函数代码、串口初始化函数和串口中断服务函数等。STM32的USART1串口通信代码,见源程序STM32串口通信设计与调试根据任务要求,

计算机通过串口助手发送数据给STM32;STM32接收到数据,就会进入接收数据串口中断,读取DR寄存器中接收到的数据;然后将接收到的数据通过串口发送回计算机新建USART工程将“任务12PWM输出控制”修改为“任务13串行通信”。在USER子目录下,把Timer­_pwm.uvprojx工程名修改为USART.uvprojx。在SYSTEM子目录下,新建一个usart子目录,该子目录是存放usart.c文件和usart.h头文件的。STM32串口通信设计与调试工程搭建、编译与调试把main.c主文件添加到工程里面,把ProjectTargets栏下的工程名修改为USART。在USART工程中,在SYSTEM组中添加usart.c文件,同时还要添加usart.h头文件以及编译文件的路径。完成了USART工程的搭建和配置后,单击Rebuild按钮对工程进行编译,生成USART.hex目标代码文件。若编译发生错误,要进行分析检查,直到编译正确。通过串口下载软件

完成USART.hex下载。STM32串口通信设计与调试工程搭建、编译与调试先用串口连接线把开发板串口1和计算机连接起来,然后在计算机上用“串口调试助手”或“超级终端”等工具向开发板发送字符,也会收到开发板发回的字符。技能训练基于寄存器的STM32串行通信设计如何利用STM32的USART相关寄存器来完成STM32串行通信设计与实现呢?参考任务13,完成基于寄存器的STM32串行通信设计编写usart.h头文件……#defineUSART_REC_LEN200 //定义最大接收字节数200#defineEN_USART1_RX1 //串口1接收:使能为“1”,禁止为“0”externu8USART_RX_BUF[USART_REC_LEN];//定义接收缓冲区,末字节为换行符externu16USART_RX_STA; //接收状态标记……技能训练基于寄存器的STM32串行通信设计编写usart.c头文件……RCC->APB2ENR|=1<<2; //使能PORTA口时钟RCC->APB2ENR|=1<<14; //使能串口时钟GPIOA->CRH&=0XFFFFF00F;//PA9、PA10设置位清零,其它位保持不变GPIOA->CRH|=0X000004B0; //配置PA9为复用推挽输出、PA10为浮空输入RCC->APB2RSTR|=1<<14; //复位串口1RCC->APB2RSTR&=~(1<<14); //停止复位USART1->BRR=mantissa; //波特率设置

USART1->CR1|=0X200C; //1位停止,无校验位……技能训练基于寄存器的STM32串行通信设计编写main.c主文件……

len=USART_RX_STA&0x3FFF; //得到此次接收到的数据长度

printf("\r\n您发送的消息为:\r\n\r\n");

for(t=0;t<len;t++)

{

USART1->DR=USART_RX_BUF[t]; //发送数据

while((USART1->SR&0X40)==0); //等待发送结束

} …………任务14基于DS18B20的温度采集远程监控设计目标使用STM32串口1,实现基于DS18B20的温度采集远程监控的串行通信。任务要求下位机使用DS18B20采集当前温度,并通过串口1将当前温度数据传输给上位机,同时LED1指示灯闪烁,表示系统正在运行;上位机通过串口1接收到温度数据后,在LED数码管上显示远程采集的温度数据,同时LED1指示灯闪烁,表示系统正在运行;LED数码管是按照有百位温度(零下温度)格式XXX.XXC或无百位温度格式XX.XXC显示温度,保留2位小数,温度显示格式会按照实际温度值自动变换。DS18B20温度传感器DS18B20具有微型化、低功耗、高性能、抗干扰能力强等优点,特别适合于构成多点温度测控系统,可直接将温度转化成串行数字信号进行处理DS18B20引脚功能DS18B20通过一个单线接口发送或接收信息,因此在单片机和DS18B20之间仅需一条连接线(加上地线)。DS18B20温度传感器DS18B20引脚功能DS18B20可以设置成两种供电方式,即寄生电源方式(即数据总线供电方式)和外部供电方式。采取寄生电源方式可以节省一根导线,但完成温度测量的时间较长。采用外部供电方式则多用一根导线,但测量速度较快。DS18B20温度传感器DS18B20内部结构及功能DS18B20内部结构框图DS18B20温度传感器DS18B20内部结构及功能64位光刻ROM光刻ROM的作用是使每一个DS18B20都各不相同,这样就可以实现一根总线上挂接多个DS18B20的目的。温度传感器DS18B20中的温度传感器可完成对温度的测量。以12位转化为例:用16位符号扩展的二进制补码读数形式提供,以0.0625℃/Bit形式表达,其中S为符号位。DS18B20温度传感器DS18B20内部结构及功能存储器DS18B20内部存储器包括一个高速暂存RAM和一个非易失性的可电擦除的EEPROM,后者存放高温度和低温度触发器TH、TL和配置寄存器。第一个字节的内容是温度的低八位第二个字节是温度的高八位第三个和第四个字节是TH、TL的易失性拷贝第五个字节是配置寄存器的易失性拷贝第六、七、八个字节用于内部计算第九个字节是冗余检验字节DS18B20温度传感器DS18B20内部结构及功能配置寄存器配置寄存器字节的各位低五位一直都是1,TM是测试模式位,用于设置DS18B20在工作模式还是在测试模式。在DS18B20出厂时该位被设置为0,用户不要去改动。R1和R0用来设置分辨率,DS18B20出厂时被设置为12位DS18B20温度传感器DS18B20应用特性采用单总线技术,在一根线上可以挂接多个DS18B20芯片;每只DS18B20具有一个独有的64位序列号,根据序列号访问对应的器件;低压供电,电源范围从3~5V,可以本地供电,也可以通过数据线供电;零待机功耗;测温范围为-55℃~+125℃,在-10℃~85℃范围内误差为±0.5℃;DS18B20的分辩率可由用户设置为9~12位;可编辑数据为9~12位,转换12位温度时间为750ms(最大);用户可自设定报警上下限温度;报警搜索命令可识别和寻址哪个器件的温度超出预定值;应用包括温度控制、工业系统、消费品、温度计或任何热感测系统。DS18B20通信协议DS18B20单线通信功能是分时完成的,它有严格的时序概念。对DS18B20的各种操作必须按照DS18B20通信协议进行,DS18B20通信协议主要包括初始化、ROM操作命令、存储器操作命令以及执行/数据。初始化与DS18B20之间的任何通信都要以初始化开始。初始化包括一个由主机发出的复位脉冲和跟随其后由从机发出的存在脉冲,存在脉冲是让主机知道DS18B20在总线上已做好操作的准备。DS18B20通信协议初始化主机首先发出一个480~960μs的低电平脉冲,然后释放总线变为高电平,并在随后的480μs时间内对总线进行检测。总线若有低电平出现,说明总线上有从机已做出应答;若无低电平出现,一直都是高电平,说明总线上无从机应答。从机DS18B20在一上电,就一直检测总线上是否有480~960μs的低电平出现。若有检测到,就在总线转为高电平后,等待15-60μs左右,将总线电平拉低60-240μs,发出响应的存在脉冲,通知主机本从机已做好准备;若没有检测到,就一直检测等待。DS18B20通信协议写操作写时序包括写0时序和写1时序。所有写时序至少需要60μs,且在2次独立的写时序之间至少需要1μs的恢复时间,写时序均起始于主机拉低总线。写1时:主机输出低电平,延时2μs,然后释放总线,延时60μs;写0时:主机输出低电平,延时60μs,然后释放总线,延时2μs。读操作单总线器件仅在主机发出读时序时,才向主机传输数据,在主机发出读数据命令后,必须马上产生读时序,以便从机能够传输数据。读时序需要60μs左右,每个读时序都由主机发起,至少拉低总线1μs。主机在读时序期间必须释放总线,并且在时序起始后的15μs之内采样总线状态。DS18B20通信协议ROM操作命令一旦主机检测到一个存在脉冲,它就可以发出5个ROM操作命令中的任一个命令,所有ROM操作命令都是8位的。如:DS18B20_Write_Byte(0xcc); //跳过读序列号的操作存储器操作命令成功执行了ROM操作命令后,便可以使用内存操作命令执行相应操作。主机可提供六种操作命令。如:DS18B20_Write_Byte(0x44); //启动DS18B20进行温度转换又如:DS18B20_Write_Byte(0xbe); //先发出读暂存器命令a=DS18B20_Read_Byte();//紧接着就可以读取温度转换结果的低8位LSBb=DS18B20_Read_Byte();//最后读取温度转换结果的高8位MSB温度采集远程监控实现分析任务要求实现分析在任务13的基础上,利用STM32F103ZET6、LED数码管及DS18B20单线数字温度传感器,设计一个基于DS18B20的温度采集远程监控系统。下位机使用DS18B20采集当前温度,并通过串口1将当前温度数据传输给上位机;上位机通过串口1接收到温度数据后,在4位LED数码管上显示远程采集的温度数据;4位LED数码管显示格式为:以XXX.X的格式显示温度,即保留1位小数;上位机和下位机的LED1指示灯闪烁,表示系统正在运行。温度采集远程监控实现分析温度采集远程监控电路是由上位机和下位机组成,主要涉及STM32F103ZET6最小系统、1路DS18B20温度采集电路、串行通信电路以及数码管显示电路等。数码管显示电路,使用了2个4位8段共阳数码管显示模块F3461BH,构成8位数码管显示。温度采集远程监控实现分析控制温度转换先利用指令CCH跳过读DS18B20序列号操作,然后利用指令44H启动DS18B20进行温度转换。控制DS18B20完成温度转换实现代码如下:voidDS18B20_Start(void){ DS18B20_Rst(); //DS18B20复位

DS18B20_Check(); //检测DS18B20是否存在

DS18B20_Write_Byte(0xcc); //跳过读序列号的操作 DS18B20_Write_Byte(0x44); //启动DS18B20进行温度转换}温度采集远程监控实现分析采集环境温度根据DS18B20通信协议,对DS18B20进行的每次操作,都必须通过如下3个步骤:每一次读写之前,都要对DS18B20进行复位(初始化);复位成功后,发送一条ROM操作命令;最后发送ROM操作命令,这样才能对DS18B20进行预定的操作。采集环境温度实现步骤先通过以上3个步骤完成温度转换;然后通过以上3个步骤完成读取温度值;最后将读取的温度值转换成实际温度值。温度采集远程监控实现分析采集环境温度读取DS18B20转换结果的关键代码DS18B20_Start(); //启动DS18B20转换DS18B20_Reset();

//DS18B20复位DS18B20_Check(); //检测DS18B20是否存在DS18B20_Write_Byte(0xcc); //发送跳过ROM命令DS18B20_Write_Byte(0xbe); //发送读取DS18B20转换结果命令a=DS18B20_Read_Byte(); //读取低8位温度值b=DS18B20_Read_Byte(); //读取高8位温度值,其中高5位是符号位temp=b;temp=(temp<<8)+a; //合并低8位温度值if((temp&0xf800)==0xf800) //判断高5位(符号位)是否都为1{temp=(~temp)+1; //若高5位都为1,即温度是零下多少度

value=temp*(-0.0625);}else{value=temp*0.0625;}returnvalue;温度采集远程监控实现分析数码管显示温度得到实际温度后,按照温度显示的格式,在共阳极数码管中进行显示。通过查表方式将其转换为对应的字形编码,并送到显示缓冲区中。……u8constdisply[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','.','-','‘};//字符表/*共阳极数码管显示字符表中的字形编码表*/u8constduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x7f,0xbf,0xff};u8constwei[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; //数码管位码表……温度采集远程监控设计与调试编写下位机主文件下位机使用DS18B20采集当前温度,并通过串口1将当前温度数据传输给上位机,同时LED1指示灯闪烁,表示系统正在运行。关键代码如下:while(1){if(times%50==0){

temper=DS18B20_GetTemperture();

//获取温度值

//将温度值转换为字符串,并在后面添加单位C

sprintf(USART1_TX_BUFF,"%.2fC",temper);len=sizeof(USART1_TX_BUFF)/sizeof(char); //计算字符串长度

USART1_TX_BUFF[len]=0x0d; //在发送的温度值后面添加回车符

USART1_TX_BUFF[len+1]=0x0a; //在回车符后面添加换行符

for(tx=0;tx<=len+1;tx++)

{USART_SendData(USART1,USART1_TX_BUFF[tx]);//向串口1发送数据

while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束}}times++;if(times%200=

温馨提示

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

评论

0/150

提交评论