任务6-1 STM32发送字符串到PC(扫描方式)_第1页
任务6-1 STM32发送字符串到PC(扫描方式)_第2页
任务6-1 STM32发送字符串到PC(扫描方式)_第3页
任务6-1 STM32发送字符串到PC(扫描方式)_第4页
任务6-1 STM32发送字符串到PC(扫描方式)_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

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

文档简介

掌握USART串口通信理解串口通信原理与配置实现字符串发送编写发送函数与主程序培养嵌入式开发思维软硬件联调与调试技巧STM32EMBEDDEDTECHNOLOGYSTM32嵌入式技术及应用任务6-1STM32发送字符串到PC(扫描方式)项目六红外测温蓝牙智控系统设计与实现目录CONTENTS01任务目标掌握USART串口通信原理,配置波特率9600b/s,实现字符串"Hello2025!"发送02知识储备串行通信原理、异步/同步通信、波特率配置、STM32USART结构、库函数使用03任务实施仿真电路设计、USART初始化、发送函数编写、工程创建与调试04任务总结核心知识点回顾、技能提升、绿色低碳理念、提升训练与评价基于《STM32嵌入式技术及应用》项目6任务1建议课时:4学时难度等级:中级01任务目标核心任务利用STM32F103微控制器上的USART1接口,配置串口通信参数为波特率9600b/s、8个数据位、1个停止位,并通过此串口向连接的PC端发送字符串"Hello2025!"。确保该字符串能够在PC上的串口虚拟终端软件或串口助手中正确显示。串口配置能力理解USART工作原理,掌握波特率、数据位、停止位、校验位的配置方法代码实现能力编写USART初始化函数、字符发送函数、字符串发送函数,实现扫描方式数据发送调试验证能力使用Proteus仿真验证电路,通过串口调试工具接收并验证发送的字符串学习成果完成本任务后,你将能够独立配置STM32USART串口通信参数,编写数据发送程序,并通过仿真验证软硬件的正确性,为后续复杂串口通信项目开发打下坚实基础。02知识储备串行通信简介串口与并口对比串口通信逐位传输数据,每次一个bit,适用于长距离、低功耗及抗干扰要求高的场景成本低实现简单长距离传输并口通信能同时传输多个比特,适用于短距离、高速数据传输,但需更多线缆和同步时钟传输速度快线缆复杂短距离串口通信的应用嵌入式系统单片机、ARM等嵌入式设备的调试与通信工业设备PLC、传感器、控制器的数据采集与控制通信设备调制解调器、路由器、交换机的配置接口串口通信因其简单灵活,在嵌入式系统、工业设备及通信设备中广泛应用,是嵌入式开发工程师必须掌握的基础技能02知识储备异步串行通信异步通信方式独立时钟机制在异步通信模式下,接收器和发送器各自拥有独立的时钟,它们的工作节奏并不同步。通信双方通过约定的波特率来协调数据传输。常见协议常见的串口通信协议,如RS-232、RS-485等,通常采用异步串行通信方式,广泛应用于工业控制和嵌入式系统。关键要点:异步通信不需要共享时钟信号,通过起始位和停止位来同步数据传输,实现简单但效率相对较低串行帧数据格式异步串行通信的数据传输格式,即串行帧,构成如下:S起始位(StartBit)1位,固定为0,表示数据传输开始D数据位(DataBits)7-9位,实际传输的数据内容P校验位(ParityBit)1位,可选,用于错误检测E停止位(StopBits)1-2位,固定为1,表示数据传输结束空闲状态约定为1,起始位为0,用于同步02知识储备同步串行通信同步通信方式共享时钟信号同步通信依赖于时钟信号,发送器和接收器共享时钟信号以同步数据的发送和接收。数据位的传输完全由共享的时钟信号控制。无需起始停止位因此不需要起始位和停止位来标记数据的开始和结束,传输效率更高,但需要额外的时钟线。常见协议常见的同步通信协议包括I2C、SPI等,广泛应用于传感器、存储器等外设的通信。同步通信帧数据格式在数据格式上,时钟信号(表示为方波)与数据流保持同步。每个数据符号对应一个时钟周期,数据在时钟的驱动下按照约定的格式传输。CLK时钟信号DATA数据信号时钟上升沿数据采样时刻时钟下降沿数据变化时刻同步vs异步对比同步通信•需要时钟线•传输效率高•适合高速传输异步通信•无需时钟线•实现简单•适合远距离传输02知识储备波特率、数据位、停止位、校验位波特率串口通信中表示数据传输速率的参数,单位为比特每秒(bps)。它决定了每秒钟可以传输多少比特。常见波特率:9600bps19200bps38400bps115200bps波特率的设置在通信双方必须保持一致,才能确保数据的正确传输数据位表示每个字符中的实际数据位数,常见的数据位长度有5、6、7、8和9位。STM32配置:在STM32的USART模块中,数据位长度是可以配置的,默认值通常为8位,这适用于大多数应用场景。配置数据位时,需要确保发送和接收端的数据位长度一致停止位表示数据传输结束时的一个信号,表明数据已经发送完毕。可选长度:1位1.5位2位在STM32的USART模块中,通常可以配置为1位或2位停止位,最为常见选择1位停止位。校验位用于检测数据传输过程中的错误。校验方式:奇校验:数据中1的个数为奇数偶校验:数据中1的个数为偶数无校验:不进行任何校验02知识储备串行通信的方式按照数据传送方向,串行通信可分为单工、半双工和全双工三种通信方式。单工通信Simplex发送方单向传输接收方该方式下,仅能进行一个方向的传送,即发送方只能发送信息,接收方只接收信息。典型应用:广播电视、键盘到计算机半双工通信Half-Duplex设备A交替传输设备B该方式下,交替的进行双向数据传送,即同一时间只能有一个方向传送。典型应用:对讲机、RS-485通信全双工通信Full-Duplex设备ATXRX设备B该方式下,设备有两条传输线,可同时发送和接收。典型应用:电话、USART串口通信02知识储备STM32片上USART和UART两种串行通信接口UART通用异步收发器(UniversalAsynchronousReceiver/Transmitter)只支持异步通信USART通用同步/异步收发器(UniversalSynchronous/AsynchronousReceiver/Transmitter)支持同步和异步通信关键区别:USART相比UART提供了更多的灵活性,因为它既支持同步通信也支持异步通信,而UART则只支持异步通信。STM32F103R6USART引脚配置本书涉及到的STM32F103R6芯片有两路USART接口,其引脚的配置如下表所示:USARTTXD(发送)RXD(接收)功能说明USART1PA9PA10复用功能USART2PA2PA3复用功能本任务使用:USART1接口,TXD引脚为PA9,RXD引脚为PA10本节从结构图、库函数设置和串口数据收发三个方面介绍STM32F10x的USART02知识储备USART结构图串口通信架构串口通信架构作为MCU与外部设备之间数据交换的重要接口,其结构虽看似复杂,但对于使用库函数进行开发的MCU应用开发人员而言,只需理解编程操作与架构的大致关联即可。四个核心组成部分:1波特率控制设置通信速率2中断控制管理中断事件3收发控制控制数据收发4数据存储转移数据寄存器管理功能引脚说明TX发送数据输出引脚应配置为推挽复用输出模式,用于将数据发送至外部设备RX接收数据输入引脚应配置为浮空输入模式,用于接收外部设备发送数据SCLK发送器时钟输出引脚仅用于同步模式,提供时钟信号以同步数据的收发HW硬件流控制引脚nRTS和nCTS用于控制数据的流动,非串口通信必需的从下至上:串口架构主要由波特率控制、中断控制、收发控制以及数据存储转移四个核心部分组成02知识储备USART结构图02知识储备发送器与接收器发送器发送器是串口通信中的重要组成部分,其关键寄存器包括CR1(控制寄存器1)和SR(状态寄存器)。关键位变量:UEUSART使能位位于CR1寄存器中,置1以启用USART功能TE发送使能位位于CR1寄存器中,置1以启动数据发送。数据从发送数据寄存器(TDR)传送至发送移位寄存器,并逐位在TX引脚输出TC发送完成标志位位于SR寄存器中,数据发送完毕后自动置1TCIE发送完成中断使能位位于CR1寄存器,置1后数据发送完成后产生中断接收器接收器同样由CR1和SR寄存器控制。在编程时,需关注以下几个位变量。关键位变量:RE接收使能位位于CR1寄存器中,置1以启用数据接收功能。接收到的数据首先存放在接收移位寄存器中,接收完成后传送至接收数据寄存器(RDR)RXNE读数据寄存器非空标志位位于SR寄存器中,数据接收完成后自动置1,表示RDR中有可读数据RXNEIE接收完成中断使能位位于CR1寄存器,置1后数据接收完成后产生中断重要提示:在扫描方式(轮询方式)中,我们通过查询TC标志位来判断发送是否完成,通过查询RXNE标志位来判断是否接收到数据02知识储备利用库函数设置和使用串口(一)库函数文件stm32f10x_usart.h包含USART相关库函数的声明和宏定义stm32f10x_usart.c包含USART相关库函数的具体实现这两个文件是配置和使用USART功能的基础7串口设置步骤1时钟使能为串口及其关联的GPIO端口使能时钟2串口复位确保外设正常工作的常规操作3GPIO模式配置TXD复用推挽输出,RXD浮空输入4初始化USART配置波特率、字长、停止位、校验位5使能USART调用USART_Cmd函数使能外设6配置中断(可选)配置NVIC和USART中断中断服务函数处理接收到的数据步骤1-3代码示例①时钟使能//使能GPIOA和USART1时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA,ENABLE);②串口复位//复位USART1USART_DeInit(USART1);③GPIO模式配置GPIO_InitTypeDefGPIO_InitStructure;//TXD-PA9复用推挽输出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);串口挂载于APB2总线之下,因此使用RCC_APB2PeriphClockCmd函数使能时钟02知识储备利用库函数设置和使用串口(二)步骤4-7代码示例④初始化USARTUSART_InitTypeDefUSART_InitStructure;USART_InitStructure.USART_BaudRate=9600;//波特率USART_InitStructure.USART_WordLength=USART_WordLength_8b;//8位数据位USART_InitStructure.USART_StopBits=USART_StopBits_1;//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//使能USART1USART_Cmd(USART1,ENABLE);⑥配置中断(可选)NVIC_InitTypeDefNVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStructure);USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);⑦中断服务函数voidUSART1_IRQHandler(void){if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET){uint8_tres=USART_ReceiveData(USART1);//读取数据//处理数据...}}在中断服务函数中,通过USART_GetITStatus()判断中断类型,使用USART_ReceiveData()读取接收到的数据通过以上步骤,就可以在STM32上配置和使用USART进行串口通信了。这些步骤提供了一个基本的框架,实际应用中可能需要根据具体的硬件配置和需求进行调整和完善。02知识储备数据发送与接收数据寄存器USART_DR在STM32中,数据的发送与接收是通过数据寄存器(USART_DR)来实现的。USART_DR实际上由两个寄存器组成:TDR发送数据寄存器TransmitDataRegister当数据写入USART_DR时,操作的是TDRRDR接收数据寄存器ReceiveDataRegister当从USART_DR读取数据时,操作的是RDR关键理解:虽然名称都是USART_DR,但写操作访问的是TDR,读操作访问的是RDR库函数发送数据函数voidUSART_SendData(USART_TypeDef*USARTx,uint16_tData);向数据寄存器(USART_DR)写入一个数据接收数据函数uint16_tUSART_ReceiveData(USART_TypeDef*USARTx);用于读取串口接收到的数据读取串口状态函数FlagStatusUSART_GetFlagStatus(USART_TypeDef*USARTx,uint16_tUSART_FLAG);第二个参数表示要查询串口的特定状态常用状态标志RXNE接收数据寄存器非空TC发送完成判断接收寄存器是否非空(RXNE)if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==SET){//数据可读取}判断发送是否完成(TC)if(USART_GetFlagStatus(USART1,USART_FLAG_TC)==SET){//发送完成}03任务实施任务实现要求通过任务验证STM32基础USART通信能力,要求严格遵循以下设计规范:配置USART1设置PA9为TXD(复用推挽输出)设置PA10为RXD(浮空输入)波特率9600b/s8位数据位,1位停止位无奇偶校验,无硬件流控制字符串发送使用USART_SendData()函数发送字符串"Hello2025!"检查USART_FLAG_TC标志位确保发送完成后再发送下一个字符串口虚拟终端使用Proteus的VirtualTerminal或使用串口调试工具接收并显示发送的字符串验证数据是否正确传输硬件设计确保PA9接TXD,PA10接RXD仿真验证硬件连接检查电路连接是否正确软件设计编写USART1初始化函数编写发送函数主函数循环发送字符串调试与验证通过仿真验证功能使用串口工具检查数据记录并修复问题03任务实施仿真电路设计电路连接说明将STM32F103R6的引脚连接到虚拟串口,实现串口通信功能。PA9TXDSTM32的PA9引脚连接到虚拟串口的发送引脚(TXD)PA10RXDSTM32的PA10引脚连接到虚拟串口的接收引脚(RXD)注意:TXD和RXD需要交叉连接,即STM32的TXD接虚拟串口的RXD,STM32的RXD接虚拟串口的TXD电路示意图STM32F103R6微控制器PA9RPATXD虚拟串口终端仿真实现电路如图6-5所示在Proteus中,VirtualTerminal可以模拟PC端的串口接收软件,实时显示接收到的数据03任务实施USART1初始化函数MyUSART1_Init()函数该函数包含了开启外设时钟、配置GPIO引脚、设置USART参数和使能USART等操作。voidMyUSART1_Init(void){GPIO_InitTypeDefMyGPIO;//定义GPIO结构体变量USART_InitTypeDefMyUSART;//定义USART结构体变量//打开AFIO时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//打开GPIOA时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//配置PA9为复用推挽输出MyGPIO.GPIO_Pin=GPIO_Pin_9;MyGPIO.GPIO_Speed=GPIO_Speed_50MHz;MyGPIO.GPIO_Mode=GPIO_Mode_AF_PP;GPIO_Init(GPIOA,&MyGPIO);//打开USART1时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//配置USART1参数MyUSART.USART_BaudRate=9600;//波特率MyUSART.USART_WordLength=USART_WordLength_8b;//8位数据位MyUSART.USART_StopBits=USART_StopBits_1;//1位停止位MyUSART.USART_Parity=USART_Parity_No;//无校验MyUSART.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//无硬件流控制MyUSART.USART_Mode=USART_Mode_Tx;//发送模式USART_Init(USART1,&MyUSART);//由于仿真时钟为8M,重新设置波特率USART1->BRR=0x1D4C/9;//使能USART1USART_Cmd(USART1,ENABLE);}关键步骤解析1开启时钟使能AFIO、GPIOA和USART1时钟2配置GPIOPA9配置为复用推挽输出模式3设置参数波特率9600,8位数据位,1位停止位4使能USART调用USART_Cmd使能USART1注意:由于仿真时钟为8MHz,需要重新计算波特率寄存器值03任务实施字符发送函数Uart_SendChar()函数该函数用于发送单个字符。当接收一个字符参数ch,通过USART_SendData()函数发送到USART1的数据寄存器,并等待发送完成(通过检查USART_FLAG_TC标志位)。voidUart_SendChar(charch)//字符发送函数{//通过串口发送字符USART_SendData(USART1,ch);//等待发送完毕while(0==USART_GetFlagStatus(USART1,USART_FLAG_TC));//清发送完成标志USART_ClearFlag(USART1,USART_FLAG_TC);}关键点:发送完成后需要清除TC标志位,以便下次发送时能够正确判断函数执行流程1发送数据调用USART_SendData()将字符写入数据寄存器2等待发送完成使用while循环查询TC标志位,等待发送完成3清除标志位调用USART_ClearFlag()清除TC标志位扫描方式:通过轮询的方式等待发送完成,而不是使用中断等待发送完成是为了确保数据完全发送出去,避免数据丢失03任务实施字符串发送函数Uart_SendString()函数该函数用于发送字符串。接收一个字符指针s,指向要发送的字符串。通过循环调用Uart_SendChar()函数逐个发送字符串中的字符,直到遇到空字符'\0'为止。voidUart_SendString(char*s)//字符串发送函数{while(*s)//当指针指向的字符不为'\0'时循环Uart_SendChar(*s++);//发送当前字符,指针后移}代码简洁:使用while(*s)判断字符串是否结束,利用*s++实现指针后移执行流程示例发送字符串"Hello"1*s='H',不为'\0',发送'H',s++2*s='e',不为'\0',发送'e',s++3*s='l',不为'\0',发送'l',s++4*s='l',不为'\0',发送'l',s++5*s='o',不为'\0',发送'o',s++6*s='\0',等于'\0',循环结束字符串以'\0'作为结束标志,这是C语言字符串的特性字符串发送函数通过调用字符发送函数,实现了代码的复用和模块化设计03任务实施主函数main()函数首先调用MyUSART1_Init()函数初始化USART1接口。然后进入一个无限循环,在循环中调用Uart_SendString()函数发送字符串,并调用Delay_ms()函数延时1秒间隔发送。//全局变量,定义要发送的字符串charTestStr[]="Hello2025!\r\n";intmain(void){//USART1初始化MyUSART1_Init();while(1)//无限循环{//发送字符串Uart_SendString(TestStr);//延时1秒Delay_ms(1000);}}注意:在代码中,TestStr是一个全局变量,存储了要发送的字符串。在实际开发中,可以根据需要修改该字符串的内容。程序执行流程1系统初始化调用MyUSART1_Init()初始化USART12进入主循环程序进入while(1)无限循环3发送字符串调用Uart_SendString()发送"Hello2025!\r\n"4延时等待调用Delay_ms(1000)延时1秒5循环执行返回步骤3,继续发送字符串程序会每隔1秒发送一次字符串,形成周期性发送\r\n是换行符,使每次发送的字符串显示在新的一行03任务实施创建工程、编译与调试工程编译在Keil中编译工程生成.hex目标文件确保0错误0警告加载程序双击STM32芯片加载.hex文件设置8MHz时钟运行仿真点击运行按钮观察VirtualTerminal验证字符串显示调试流程1通过VirtualTerminal与USART接口进行通信2验证串口通信功能是否正常3记录任何异常现象或错误提示4对发现的问题进行分析和定位5修改代码进行修复,重复调试常见问题排查无数据显示检查时钟配置、波特率设置、GPIO模式显示乱码检查波特率是否匹配、时钟频率设置数据丢失检查是否等待发送完成、电路连接重复调试步骤,直到所有功能均正常后,结束调试会话,并保存调试结果和修改后的代码04任务总结核心知识点知识点一串口通信原理掌握STM32USART串口通信基本原理,理解串行通信的工作方式和数据传输机制。异步通信与同步通信的区别串行帧的构成:起始位、数据位、校验位、停止位单工、半双工、全双工通信方式熟悉波特率、数据位、校验位的配置方法知识点二扫描方式发送理解扫描方式数据发送机制,能够通过轮询方式实现字符串发送。USART初始化步骤和配置方法字符发送函数的实现原理字符串发送的循环实现掌握USART_GetFlagStatus()的使用方法知识点三调试工具使用熟悉PC端串口调试工具(如串口助手)的使用及数据接收验证方法。ProteusVirtualTerminal的使用串口助手的参数配置数据接收和显示验证掌握软硬件联调的方法和技巧04任务总结技能提升与绿色低碳技能提升硬件设计能力完成USART硬件电路设计(含电平转换芯片MAX3232),验证数据传输稳定性。电路设计信号完整性软件开发能力编写程序实现ASCII字符串循环发送(如"HelloPC!"),通过Proteus仿真验证时序。代码编写仿真验证绿色低碳理念动态功耗管理在空闲时关闭USART时钟,减少动态功耗。//关闭USART时钟以节省功耗RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,DISABLE);发送间隔优化优化发送间隔以平衡通信效率与能耗。//延长发送间隔,降低功耗Delay_ms(5000);//改为5秒发送一次绿色低碳设计不仅有助于节能减排,还能延长嵌入式设备的电池寿命05提升训练与评价知识问答Q1问题一若串口通信出现乱码,可能由哪些配置错误(如波特率不匹配)导致?波特率不匹配发送端和接收端的波特率设置不一致是最常见的乱码原因。例如,发送端设置为9600bps,而接收端设置为115200bps。时钟频率设置错误STM32的系统时钟频率设置不正确,导致波特率计算错误。需要确保时钟配置与实际硬件一致。数据位、停止位、校验位不匹配通信双方的帧格式设置不一致,如数据位8位vs7位,停止位1位vs2位等。Q2问题二如何通过校验位(奇偶校验)提高数据传输可靠性?奇校验要求数据中1的个数为奇数。如果数据位中1的个数为偶数,则校验位为1;如果

温馨提示

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

最新文档

评论

0/150

提交评论