基于STM32的串口通信_第1页
基于STM32的串口通信_第2页
基于STM32的串口通信_第3页
基于STM32的串口通信_第4页
基于STM32的串口通信_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

嵌入式技术应用课程设计嵌入式技术应用课程设计课题:基于STM32的串口通信专业:班级:学号:姓名:指导教师:设计日期:成绩:重庆城市科技学院电气工程与智能制造学院重庆城市科技学院电气工程与智能制造学院课程设计目录.设计目的(1)掌握STM32F103C8T6单片机最小系统的设计;(2)掌握硬件电路的设计方法;(3)掌握STM32串口的驱动;(4)掌握OLED的驱动;(5)掌握STM32的编程方式。2.设计要求基于STM32F13C8T6单片机设计制作与上位机的串口通信,具体要求如下:(1)通过矩阵键盘向上位机发送信息,并且可以通过串口助手查看信息。(2)STM32可以接受来自上位机的信息或指令。(3)在0.96寸OLED上显示接收的信息。(4)通过串口控制3个发光二极管的亮灭(如111,000,101,010等)。3.设计的具体实现3.1设计原理本实验介绍STM32的串口基础,用STM32的串口来发送和接收数据。本实验将实现如下功能:STM32通过串口和上位机的对话,STM32在收到上位机发过来的字符串后,原原本本的返回给上位机。实验原理主要以下三个方面介绍:STM32串口简介串口作为MCU的重要外部接口,同时也是软件开发重要的调试手段,其重要性不言而喻。现在基本上所有的MCU都会带有串口,STM32自然也不例外。STM32的串口资源相当丰富的,功能也相当强劲。本实验主要从库函数操作层面结合寄存器的描述,告诉大家如何设置串口,以达到最基本的通信功能。本实验将实现利用串口4不停的打印信息到电脑上,同时接收从串口发过来的数据,把发送过来的数据直接送回给电脑。超高频开发板自带1个USB串口。本实验介绍的是通过USB串口和电脑通信。STM32端口复用功能比较强大,对于复用功能的IO,首先要使能GPIO时钟,然后使能复用功能时钟,同时要把GPIO模式设置为复用功能对应的模式(这个可以查看手册《STM32中文参考手册V10》P110的表格“8.1.11外设的GPIO配置”)。这些准备工作做完之后,剩下的当然是串口参数的初始化设置,包括波特率,停止位等等参数。在设置完成只能接下来就是使能串口,这很容易理解。同时,如果我们开启了串口的中断,当然要初始化NVIC设置中断优先级别,最后编写中断服务函数。串口设置的一般步骤可以总结为如下几个步骤:1)串口时钟使能,GPIO时钟使能2)串口复位3)GPIO端口模式设置4)串口参数初始化5)开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤)6)使能串口7)编写中断处理函数以下简单介绍下这几个与串口基本配置直接相关的几个固件库函数。这些函数和定义主要分布在stm32f10x_usart.h和stm32f10x_usart.c文件中。1.串口时钟使能。串口是挂载在APB2下面的外设,所以使能函数为:RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1);2.串口复位。当外设出现异常的时候可以通过复位设置,实现该外设的复位,然后重新配置这个外设达到让其重新工作的目的。一般在系统刚开始配置外设的时候,都会先执行复位该外设的操作。复位的是在函数USART_DeInit()中完成:voidUSART_DeInit(USART_TypeDef*USARTx);//串口复位比如要复位串口1,方法为:USART_DeInit(USART1);//复位串口13.串口参数初始化。串口初始化是通过USART_Init()函数实现的,voidUSART_Init(USART_TypeDef*USARTx,USART_InitTypeDef*USART_InitStruct);这个函数的的第一个入口参数是指定初始化的串口标号,这里选择USART1。第二个入口参数是一个USART_InitTypeDef类型的结构体指针,这个结构体指针的成员变量用来设置串口的一些参数。一般的实现格式为:USART_InitStructure.USART_BaudRate=bound;//一般设置为9600;USART_InitStructure.USART_WordLength=USART_WordLength_8b;//字长为8位数据格式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);//初始化串口从上面的初始化格式可以看出初始化需要设置的参数为:波特率,字长,停止位,奇偶校验位,硬件数据流控制,模式(收,发)。可以根据需要设置这些参数。4.数据发送与接收。STM32的发送与接收是通过数据寄存器USART_DR来实现的,这是一个双寄存器,包含了TDR和RDR。当向该寄存器写数据的时候,串口就会自动发送,当收到收据的时候,也是存在该寄存器内。STM32库函数操作USART_DR寄存器发送数据的函数是:voidUSART_SendData(USART_TypeDef*USARTx,uint16_tData);通过该函数向串口寄存器USART_DR写入一个数据。STM32库函数操作USART_DR寄存器读取串口接收到的数据的函数是:uint16_tUSART_ReceiveData(USART_TypeDef*USARTx);通过该函数可以读取串口接受到的数据。5.串口状态。串口的状态可以通过状态寄存器USART_SR读取。USART_SR的各位描述如图所示:图USART_SR寄存器各位描述这里关注一下两个位,第5、6位RXNE和TC。RXNE(读数据寄存器非空),当该位被置1的时候,就是提示已经有数据被接收到了,并且可以读出来了。这时候要做的就是尽快去读取USART_DR,通过读USART_DR可以将该位清零,也可以向该位写0,直接清除。TC(发送完成),当该位被置位的时候,表示USART_DR内的数据已经被发送完成了。如果设置了这个位的中断,则会产生中断。该位也有两种清零方式:1)读USART_SR,写USART_DR。2)直接向该位写0。状态寄存器的其他位这里就不做过多讲解,大家需要可以查看中文参考手册。在固件库函数里面,读取串口状态的函数是:FlagStatusUSART_GetFlagStatus(USART_TypeDef*USARTx,uint16_tUSART_FLAG);这个函数的第二个入口参数非常关键,它是标示要查看串口的哪种状态,比如上面介绍的RXNE(读数据寄存器非空)以及TC(发送完成)。例如要判断读寄存器是否非空(RXNE),操作库函数的方法是:USART_GetFlagStatus(USART1,USART_FLAG_RXNE);要判断发送是否完成(TC),操作库函数的方法是:USART_GetFlagStatus(USART1,USART_FLAG_TC);这些标识号在MDK里面是通过宏定义定义的:#defineUSART_IT_PE((uint16_t)0x0028)#defineUSART_IT_TXE((uint16_t)0x0727)#defineUSART_IT_TC((uint16_t)0x0626)#defineUSART_IT_RXNE((uint16_t)0x0525)#defineUSART_IT_IDLE((uint16_t)0x0424)#defineUSART_IT_LBD((uint16_t)0x0846)#defineUSART_IT_CTS((uint16_t)0x096A)#defineUSART_IT_ERR((uint16_t)0x0060)#defineUSART_IT_ORE((uint16_t)0x0360)#defineUSART_IT_NE((uint16_t)0x0260)#defineUSART_IT_FE((uint16_t)0x0160)6.串口使能。串口使能是通过函数USART_Cmd()来实现的,使用方法是:USART_Cmd(USART1,ENABLE);//使能串口7.开启串口响应中断。有些时候当还需要开启串口中断,那么还需要使能串口中断,使能串口中断的函数是:voidUSART_ITConfig(USART_TypeDef*USARTx,uint16_tUSART_IT,FunctionalStateNewState)这个函数的第二个入口参数是标示使能串口的类型,也就是使能哪种中断,因为串口的中断类型有很多种。比如在接收到数据的时候(RXNE读数据寄存器非空),要产生中断,那么们开启中断的方法是:USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//开启中断,接收到数据中断在发送数据结束的时候(TC,发送完成)要产生中断,那么方法是:USART_ITConfig(USART1,USART_IT_TC,ENABLE);8.获取相应中断状态。当使能了某个中断的时候,当该中断发生了,就会设置状态寄存器中的某个标志位。经常在中断处理函数中,要判断该中断是哪种中断,使用的函数是:ITStatusUSART_GetITStatus(USART_TypeDef*USARTx,uint16_tUSART_IT)比如使能了串口发送完成中断,那么当中断发生了,便可以在中断处理函数中调用这个函数来判断到底是否是串口发送完成中断,方法是:USART_GetITStatus(USART1,USART_IT_TC)返回值是SET,说明是串口发送完成中断发生。3.2系统设计本实验需要用到的硬件资源有:指示灯D3串口4图4-7-1串口实验硬件电路图本实验使用串口4,接单片机PC10,PC11,通过USB转串口线直接和PC机相连,使用指示灯指示串口是否中断,D3连接PC0上.核心代码/*****************************************************************************名称:USART_Config(USART_TypeDef*USARTx)*功能:串口1配置*入口参数:USART_TypeDef串口号*出口参数:无*说明:串口配置相关****************************************************************************/voidUSART_Config(USART_TypeDef*USARTx){USART_InitStructure.USART_BaudRate=9600;//速率9600bpsUSART_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;//收发模式/*ConfigureUSART1*/USART_Init(USARTx,&USART_InitStructure);//配置串口参数函数/*EnableUSART1ReceiveandTransmitinterrupts*/USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//使能接收中断USART_ITConfig(USART1,USART_IT_TXE,ENABLE);//使能发送缓冲空中断/*EnabletheUSART1*/USART_Cmd(USART1,ENABLE);}/*****************************************************************************名称:USART1_IRQHandler(void)*功能:串口1中断服务程序*入口参数:无*出口参数:无*说明:串口中断****************************************************************************/voidUSART1_IRQHandler(void)//串口1中断服务程序{unsignedinti;if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)//判断读寄存器是否非空{RxBuffer1[RxCounter1++]=USART_ReceiveData(USART1);//将读寄存器的数据缓存到接收缓冲区里if(RxBuffer1[RxCounter1-2]==0x0d&&RxBuffer1[RxCounter1

温馨提示

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

评论

0/150

提交评论