资源描述
Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,C,LOGO,Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Company Logo,Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Company Logo,Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Company Logo,Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Company Logo,Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Company Logo,Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Company Logo,Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Company Logo,Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Company Logo,Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Company Logo,Click to edit Master title style,Click to edit Master text styles,Second level,Third level,Fourth level,Company Logo,第二课,串口通信,第二课串口通信,C,串口简介,串行接口简称串口,也成串行通信接口,是采用串行通信方式的扩展接口。串口的使用对于开发调试过程的作用是非常大的,串口可以用来查看、打印及输出相关信息,使我们在嵌入式开发中最先与中央处理器通信的接口。,串行通讯的特点是:数据位传送,传按位顺序进行,最少只需一根传输线即可完成,成本低但传送速度慢。串行通讯的距离可以从几米到几千米。,C串口简介串行接口简称串口,也成串行通信接口,是采用串行通信,C,串口简介,串行通讯又分为异步通讯和同步通讯两种:,同步串行是指,ISP,(,interface Serial Peripheral,)的缩写。,ISP,总线系统是一种同步串行外设接口,它可以使,MCU,与各种外围设备以串行方式进行通信以交换信息,,TRM450,是,ISP,接口。,异步串行是指,UART,(,Universal Asynchronous Receiver/Trans mitter,),通用异步接收,/,发送。,UART,是一个并行输入成为串行输出的芯片,通常集成在主板上。,UART,包含,TTL,电平的串口和,RS232,电平的串口。,串行接口按电气标准及协议来分包括,RS-232-C,、,RS-422,、,RS485,等。,RS-232-C,、,RS-422,与,RS-485,标准只对接口的电气特性做出规定,不涉及接插件、电缆或协议。,在单片机中,主要使用异步通讯方式。,C串口简介串行通讯又分为异步通讯和同步通讯两种:,C,串口简介,串口通信的概念非常简单,串口按位,(bit),发送和接收字节,尽管比按字节,(byte),的并行通信慢,但是串口可以再使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。,对于两个进行通信的端口,这些参数必须匹配:,1,、波特率:这是一个衡量通信速度的参数,它表示每秒钟传送的,bit,的个数。例如,300,波特表示每秒钟发送,300,个,bit,。,C串口简介串口通信的概念非常简单,串口按位(bit)发送和接,C,STM32,串口简介,2,、数据位:这是衡量通信中实际数据位的参数。当计算机发送一个信息包,实际数据不会是,8,位的,标准的值是,5,、,7,或,8,位(如何设置取决于你想传送的信息:比如标准的,ASCII,码是,0127,(,7,位),扩展的,ASCII,码是,0255,(,8,位)。,3,、停止位:用于表示单个包的最后一位。典型的值为,1,、,1.5,和,2,位。优于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。,CSTM32串口简介2、数据位:这是衡量通信中实际数据位的参,C,STM32,串口简介,4,、奇偶校验位:在串口通信中一种简单的检错方式。有,4,中检错方式:偶、奇、高和低。,5,、硬件流控制:硬件流控制常用的有,RTS/CTS,流控制盒,DTR/DSR,流控制。硬件流控制必须将相应的电缆线接上,用,RTS/CTS,流控制时,应将通讯两端的,RTS,、,CTS,线对应相连。常用的流控制信号还有,DTR/DSR,。,CSTM32串口简介4、奇偶校验位:在串口通信中一种简单的检,C,STM32,串口简介,STM32,根据芯片型号的不同资源数量也不一样,,103VC,系列最多可提供,5,路串口(本次着重讲解串口,1,和串口,2,),有分数波特率发生器、支持同步单线通信和半双工单线通讯、支持,LIN,、支持调制解调器操作、智能卡协议和,IrDA SIR ENDEC,规范、具有,DMA,等。,STM32,的串口与其他单片机的操作方式基本相同:,1,、开启串口时钟,2,、设置相应,I/O,模式,3,、配置波特率、数据位长度、奇偶校验位等,CSTM32串口简介 STM32根据芯片型号的不同资源数量也,C,STM32,串口原理图,CSTM32串口原理图,C,STM32 UART,库函数,CSTM32 UART库函数,C,STM32,串口时钟使能,串口作为,STM32,的一个外设,其时钟由外设时钟使能寄存器控制,串口,1,的时钟使能在,APB2ENR,寄存器,其他串口的时钟使能位都在,APB1ENR,。,(,以串口,1,为例,),而用库函数则是,:,RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE),CSTM32串口时钟使能串口作为STM32的一个外设,其时钟,C,STM32,串口复位,当外设出现异常的时候可以通过复位寄存器里面的对应位设置,实现该外设的复位,然后重新配置这个外设达到让其重新工作的目的。一般在系统刚开始配置外设的时候都会先执行复位该外设的操作。串口,1,的复位时通过配置,APB2RSTR,寄存器来实现的,其他的几个串口都是通过,PAB1RSTR,寄存器来实现的。而用库函数则是使用,USART_DeInit(USART_TypeDef* USARTx),来实现的。,USART_ DeInit,函数在,stm32f10x_usart.c,文件中。,CSTM32串口复位当外设出现异常的时候可以通过复位寄存器里,C,STM32,串口波特率设置,STM32,中每个串口都有一个自己独立的波特率寄存器,USART_BRR,,通过设置该寄存器达到配置不同波特率的目的,该寄存器的各位描述如下:,该寄存器中最低,4,为用来存放,小数,部分的,DIV_Fraction,15:4,这,12,位用来存放,整数,部分,DIV_Mantissa,。高,16,位未使用(图片上小数整数有错误,以英文手册为准)。,CSTM32串口波特率设置STM32中每个串口都有一个自己独,C,STM32,串口波特率设置,CSTM32串口波特率设置,C,STM32,串口控制,STM32,中每个串口都有,3,个控制寄存器,USART_CR13,,串口的很多配置都是通过这,3,个寄存器来设置的。这里我们只要用到,USART_CR1,就可以实现我们的功能了,其他的寄存器就不一一列出了。具体各位的功能及操作方法见,STM32,参考手册的,496497,页。其中发送和接收的中断都通过这个寄存器进行使能。,CSTM32串口控制STM32中每个串口都有3个控制寄存器U,C,STM32,串口数据的发送和接收,STM32,串口的发送和接收是通过数据寄存器,USART_DR,来实现的,这是一个双寄存器,包含了发送和接收两部分。当向该寄存器写数据时,串口就会自动发送,当收到数据的时候,也在该寄存器中。,其中只用了低,9,位,其他位都保留且硬件强制为,0,。,CSTM32串口数据的发送和接收STM32串口的发送和接收是,C,STM32,串口数据的发送和接收,STM32,串口的发送和接收在库文件中分别有对应的函数,可直接调用,分别是:,void USART_SendData(USART_TypeDef* USARTx, u8 Data),u8 USART_ReceiveData(USART_TypeDef* USARTx),CSTM32串口数据的发送和接收STM32串口的发送和接收在,C,STM32,串口状态,STM32,串口的状态可通过状态寄存器,USART_SR,读取。,这里我们关注一下三个位,第,5,、,6,、,7,位,RXNE,、,TC,和,TXE,。,CSTM32串口状态STM32串口的状态可通过状态寄存器US,C,STM32,串口,如果理解了以上寄存器等的讲解,那么就可以对,STM32,进行相关的设置和操作,就可以达到串口最基本的配置了,更详细的介绍可参考,STM32,参考手册,。,在很多串口操作中都可以直接调用,printf,函数打印输出信息,但是在,STM32,中还需要进行一些配置才可以。接下来我们首先会讲解如何使用,printf,函数进行输出,然后再讲解输入输出函数的使用方法。,CSTM32串口 如果理解了以上寄存器等的讲解,那么就可以对,C,STM32,串口,printf,实现,本次试验采用,UART1,的查询方式实现:,CSTM32串口printf实现 本次试验采用UART1的查,C,STM32,串口,printf,实现,本次试验中我们用到了,GPIO,、,RCC,、,USART,这三个外设的库文件,stm32f10x_gpio.c,、,stm32f10x_rcc.c,、,stm32f10x_usart.c,,所以试验中如果你的库文件,stm32f10x_conf.h,里面将相应的头文件注释了就需要将需要用到的几个头文件的注释去掉。,跟,LED,的操作一样,首先是将相应的,I/O,配置成串口模式,本次函数名为,USART1_Config();,CSTM32串口printf实现本次试验中我们用到了GPIO,C,STM32,串口,printf,实现,CSTM32串口printf实现,C,STM32,串口,printf,实现,USART1_Config(),主要做了如下工作:,1,、使能了串口,1,的时钟,2,、配置了,uart1,的,I/O,3,、配置了,uart1,的工作模式,CSTM32串口printf实现 USART1_Config,C,STM32,串口简介,上面的配置中将串口,1,的,TX,和,RX,引脚配置成,AF_PP,和,IN_FLOATING,模式,因为,RX,是接收引脚所以设置沉高输入模式。,接下来将,UART1,的工作模式配置成波特率为,115200(,可自行更改,),,数据位长度为,8bit,,停止位为,1,,无校验位。,在使用,printf,函数之前还需要进行一些操作。如果要,printf,函数工作的话,还需要把,printf(),重新定向到串口中,这部分工作是由,fputc(int ch,FILE *f),这个函数来完成的,这个函数在,usart.c,中实现。,CSTM32串口简介 上面的配置中将串口1的TX和RX引脚配,C,STM32printf,用法配置,在,STM32,中直接调用,printf,函数会出错,需要进行一些配置:,1,、在,main,文件中包含,stdio.h,2,、重定义,fputc,函数,如下:,/,发送数据,int fputc(int ch, FILE *f),USART_SendData(USART1, (unsigned char) ch);,while (!(USART1-SR ,3,、在工程属性的,“Target” - “Code Generation”,选项中勾选,“Use MicroLIB”,。,CSTM32printf用法配置 在STM32中直接调用pr,C,STM32printf,用法配置,在这里讲解一下,fputc,函数里面的代码,我们前面提到过,USART_SR,寄存器的,5,、,6,、,7,三位,理解了这几位的功能就可以大概理解串口是如何发送数据的了。,CSTM32printf用法配置 在这里讲解一下fputc函,C,STM32printf,用法配置,当,TXE,置位时,就表示发送数据寄存器中的数据已经移到了发送移位寄存器中,如果使能中断的话就会产生中断。当,RXNE,置位时表示接受移位寄存器中的数据已经移到接受数据寄存器中了,如果中断使能的话则产生中断。,虽然,fputc,函数里面用到的是查询模式,但道理是一样的。我们先调用,USART_SendData(USART1,(unsigned char) ch),将我们要发送的数据送到,TDR,中,之后我们就等待,TXE,置位,当,TXE,置位时就表示,TDR,中的数据转移到了发送移位寄存器中了,发送移位寄存器中的数据会由串口硬件自动发送,如此循环,直到将我们要发送的数据全部发送完为止。,CSTM32printf用法配置 当TXE置位时,就表示发送,C,STM32 printf,用法配置,进行上述设置之后就可以使用,printf,函数了,如果设置成功,下载程序,将开发板的串口接到,PC,机上,打开串口调试助手,设置好波特率等参数就可以看到,this is a uart test demo,的字符。,以上例程展示了如何使用,printf,函数发送字符串。,CSTM32 printf用法配置进行上述设置之后就可以使用,C,前面讲解了,printf,函数的使用方法,接下来讲解如何使用,STM32,的串口输入输出实现双向通信。,STM32,串口的相关寄存器和原理在前面都有提到,这里就不再赘述,这里主要讲解软件的实现方法。,首先我们讲解查询方式的发送和接收。,C 前面讲解了printf函数的使用方法,接下来讲解如何使用,C,本实验中我们通过串口,1,持续等待接收数据,当接收到回车符时将接收到的内容再通过串口发送出去。,发送函数:,C 本实验中我们通过串口1持续等待接收数据,当接收到回车符时,C,发送有两个函数,分别是发送单个字符和发送字符串函数,发送单个字符函数首先是将要发送的字符写到缓存中,然后等待串口自动发送完成,如果不等待发送完成就返回,则在字符串发送函数中函数会被连续循环调用多次,如果上一次发送的字节在寄存器中还没有发送结束,此时再次写入同样的寄存器会将刚才的数据覆盖掉,接收端将得不到预期的结果,所以需要等待发送完一个字符之后再发送下一个字符。,发送字符串函数则是循环调用发送单个字符函数,直到检测到空格即表明字符串已发送完。,C 发送有两个函数,分别是发送单个字符和发送字符串函数,发送,C,查询接收函数:,接收函数首先是查询寄存器中是否有数据,如果有数据就将数据取出,然后清除相应的标志位,如果没有数据就一直等待数据出现。,C查询接收函数:,C,接下来就是在,main,函数中调用发送和接收函数:,首先设置系统时钟,然后初始化,USART1,,然后循环读取数据,如果读取到了数据则将数据再通过串口发送出去。,如果操作成功,则通过串口调试助手发送一串数据可在接收区看到发送的数据。,C接下来就是在main函数中调用发送和接收函数:,C,STM32,串口中断,接下来讲解串口的中断接收方式:,在驱动中频繁的使用查询方式接收数据不仅会降低系统的效率而且可能使系统崩溃。采取中断方式可以很好地缓解这一问题。本次讲解串口,1,的中断接收方式:,用串口中断函数除了要初始化,I/O,和时钟等,还要配置相应的中断及中断函数。,CSTM32串口中断 接下来讲解串口的中断接收方式:,C,STM32,串口中断,STM32(Cortex-M3),中有两个优先级的概念:抢占式优先级和响应优先级,也把响应优先级称作“亚优先级”或“副优先级”,每个中断源都需要被指定这两种优先级。,占先式优先级,(pre-emption priority),:高占先式优先级的中断事件会打断当前的主程序,/,中断程序运行,抢断式优先响应,俗称中断嵌套。,副优先级,(subpriority),:在占先式优先级相同的情况下,高副优先级的中断优先被响应;,在占先式优先级相同的情况下,如果有低副优先级中断正在执行, 高副优先级的中断要等待已被响应的低副优先级中断执行结束后才能得到响应,非抢断式响应,(,不能嵌套,),。,CSTM32串口中断 STM32(Cortex-M3)中有两,C,stm32,中对中断优先级的定义,Cortex-M3,允许具有较少中断源时使用较少的寄存器位指定中断源的优先级,因此,STM32,把指定中断优先级的寄存器位减少到,4,位,这,4,个寄存器位的分组方式如下:,第,0,组:所有,4,位用于指定响应优先级,第,1,组:最高,1,位用于指定抢占式优先级,最低,3,位用于指定响应优先级,第,2,组:最高,2,位用于指定抢占式优先级,最低,2,位用于指定响应优先级,第,3,组:最高,3,位用于指定抢占式优先级,最低,1,位用于指定响应优先级,第,4,组:所有,4,位用于指定抢占式优先级,C stm32中对中断优先级的定义 Cortex-M3允许具,C,stm32,中对中断优先级的定义,中断优先级分组是为了给抢占式优先级和响应优先级在中断优先级寄存器的高四位分配各个优先级数字所占的位数,在一次程序中只能设定一次。,AIRC(Application Interrupt and Reset Register),寄存器中有用于指定优先级的,4 bits,。这,4,个,bits,用于分配,preemption,优先级和,sub,优先级。,可以通过调用,STM32,的固件库中的函数,NVIC_PriorityGroup Config(),选择使用哪种优先级分组方式,这个函数的参数有下列,5,种:,NVIC_PriorityGroup_0=,选择第,0,组,NVIC_PriorityGroup_1 =,选择第,1,组,NVIC_PriorityGroup_2 =,选择第,2,组,NVIC_PriorityGroup_3 =,选择第,3,组,NVIC_PriorityGroup_4 =,选择第,4,组,C stm32中对中断优先级的定义中断优先级分组是为了给抢占,C,stm32,中对中断优先级的定义,接下来就是指定中断源的优先级:,要注意的几点是:,1.,如果指定的抢占式优先级别或响应优先级别超出了选定的优先级分组所限定的范围,将可能得到意想不到的结果;,2.,抢占式优先级别相同的中断源之间没有嵌套关系;,3.,如果某个中断源被指定为某个抢占式优先级别,又没有其它中断源处于同一个抢占式优先级别,则可以为这个中断源指定任意有效的响应优先级别。,C stm32中对中断优先级的定义接下来就是指定中断源的优先,C,STM32,串口中断,之前讲过,stm32,库文件中的,stm32f10x_it.c,和,stm32f10x_it.h,文件中是中断映射函数,所以需要操作串口的中断必须清楚串口的中断映射函数,有些,it,文件中并没有串口的中断映射函数,在启动文件,startup_stm32f10x_hd.s,中可以看到各种中断的映射函数:,从中可以看出串口,2,的中断映射函数名为,USART2_IRQHandler,CSTM32串口中断 之前讲过stm32库文件中的stm32,C,STM32,串口中断,接下来就是编写中断响应函数在中断响应函数中写入进中断后想要进行的操作,本实验中是将接收端接收的数据通过串口发送出去:,接下来将编译通过的程序下到开发板中,通过串口调试助手进行调试即可。,CSTM32串口中断 接下来就是编写中断响应函数在中断响应函,
展开阅读全文