STM32例程串口实验.docx
- 文档编号:30592812
- 上传时间:2023-08-18
- 格式:DOCX
- 页数:66
- 大小:820.10KB
STM32例程串口实验.docx
《STM32例程串口实验.docx》由会员分享,可在线阅读,更多相关《STM32例程串口实验.docx(66页珍藏版)》请在冰豆网上搜索。
STM32例程串口实验
实验要求
∙使用开发板上的串口向PC发送信息
∙PC通过串口向开发板发送数据,CPU在接收到后,确认信息,并通过串口返回数据
例如:
开发板先发送一个字符‘c’,然后PC发送一个字符‘a’,开发板接收到后,再发送一个字符‘b’
[编辑]实验目的
∙学习和掌握STM32的USART模块的工作原理和使用方法
∙学习和掌握USART固件库的使用
∙掌握串口中断的使用方法
[编辑]实验分析
硬件分析:
USART的工作原理
软件分析:
USART固件库
USART实例
[编辑]开发板原理图设计
MAX3232
与主芯片的连接
[编辑]硬件知识点
详见STM32F10XXX英文版参考手册RM0008-ReferenceManual
[编辑]USART
通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换。
USART利用小数波特率发生器提供宽范围的波特率选择。
它支持同步单向通信和半双工单线通信,也支持LIN(局部互连网),智能卡协议和IrDA(红外数据组织)SIRENDEC规范,以及调制解调器(CTS/RTS)操作。
它还允许多处理器通信。
使用多缓冲器配置的DMA方式,可以实现高速数据通信。
(表)USART模式支持
[编辑]USART内部结构
[编辑]引脚定义
任何USART双向通信至少需要两个引脚:
接收数据输入(RX)和发送数据输出(TX)。
∙RX:
接收数据输入。
通过过采样技术来区别数据和噪音,从而恢复数据。
∙TX:
发送数据输出。
当发送器被禁止时,输出引脚恢复到它的I/O端口配置。
当发送器被激活,并且不发送数据时,TX引脚处于高电平。
在单线和智能卡模式里,此I/O口被同时用于数据的发送和接收。
在同步模式中需要下列引脚:
∙CK:
发送器时钟输出。
此引脚输出用于同步传输的时钟,(在起始位和停止位上没有时钟脉冲,软件可选地,可以在最后一个数据位送出一个时钟脉冲)。
数据可以在RX上同步被接收。
这可以用来控制带有移位寄存器的外部设备(例如LCD驱动器)。
时钟相位和极性都是软件可编程的。
在智能卡模式里,CK可以为智能卡提供时钟。
在IrDA模式里需要下列引脚:
∙IrDA_RDI:
IrDA模式下的数据输入。
∙IrDA_TDO:
IrDA模式下的数据输出。
在硬件流控模式中需要下列引脚:
∙nCTS:
清除发送,若是高电平,在当前数据传输结束时阻断下一次的数据发送。
∙nRTS:
发送请求,若是低电平,表明USART准备好接收数据
(表)USART引脚配置
[编辑]寄存器
∙一个状态寄存器(USART_SR)
∙一个数据寄存器(USART_DR)
∙三个控制寄存器(USART_CR1,USART_CR2,USART_CR3)
∙一个波特率寄存器(USART_BRR)
∙一个智能卡模式下的保护时间寄存器(USART_GTPR)
关于以上寄存器中每个位的具体定义,请参考USART寄存器描述。
[编辑]控制逻辑
∙发送控制
∙接收控制
∙时钟控制
∙硬件流控制
∙波特率控制(发送器和接收器)
∙中断控制
∙唤醒单元
[编辑]USART寄存器描述
下表列出了USART寄存器的地址映射和复位值。
可以以半字(16位)或字(32位)的方式访问这些外设寄存器。
[编辑]USART_SR(Statusregister)状态寄存器
rc_w0:
软件可以读此位,也可以通过写’0’清除此位,写’1’对此位无影响。
位31:
10保留位,由硬件强制为0
位9CTS:
CTS标志
如果设置了CTSE位,当nCTS输入状态变化时,该位由硬件置’1’。
由软件清’0’(向该位写’0’)。
如果USART_CR3寄存器中的CTSIE=1,则产生中断。
0:
nCTS状态线上没有变化;
1:
nCTS状态线上发生变化。
在UART4和UART5上,该位不可用。
位8LBD:
LIN断开检测标志
当检测到LIN断开时,该位由硬件置’1’。
由软件清’0’(向该位写’0’)。
如果USART_CR2寄存器中的LBDIE=1,则产生中断。
0:
没有检测到LIN断开;
1:
检测到LIN断开。
注意:
若LBDIE=1,当LBD=1时产生中断。
位7TXE:
发送数据寄存器(TDR)空
当TDR寄存器中的数据被转移到移位寄存器时,该位由硬件置’1’。
如果USART_CR1寄存器中的TXEIE=1,则产生中断。
写USART_DR寄存器,将该位清’0’。
0:
数据还没有被转移到移位寄存器;
1:
数据已经被转移到移位寄存器。
注意:
该位被用在单缓冲发送中。
位6TC:
发送完成
当包含有数据的一帧发送完成后,并且TXE=1时,该位由硬件置’1’。
如果USART_CR1寄存器中的TCIE=1,则产生中断。
该位由软件序列清’0’(先读一次USART_SR寄存器,后写一次USART_DR寄存器)。
TC位也可以通过向该位写’0’来清除,此清零方式只在多缓冲通信中推荐使用。
0:
发送还未完成;
1:
发送完成。
位5RXNE:
读数据寄存器(RDR)非空(Readdataregisternotempty)
当RDR移位寄存器中的数据被转移到USART_DR寄存器时,该位由硬件置位。
如果USART_CR1寄存器中的RXNEIE=1,则产生中断。
读USART_DR寄存器,将该位清零。
RXNE位也可以通过向该位写’0’来清除,此清零方式只在多缓冲通信中推荐使用。
0:
没收到数据;
1:
收到数据,可以读出。
位4IDLE:
监测到总线空闲(IDLElinedetected)
当检测到总线空闲时,该位被硬件置位。
如果USART_CR1寄存器中的IDLEIE=1,则产生中断。
该位由软件序列清除(先读USART_SR,后读USART_DR)。
0:
没有检测到空闲总线;
1:
检测到空闲总线。
注意:
IDLE位不会再次被置位,直到RXNE位被置位(即又检测到一次空闲总线)
位3ORE:
溢出错误(Overrunerror)
RXNE=1的同时,移位寄存器中接收到的当前数据,准备转移至RDR寄存器时,该位被硬件置位。
如果USART_CR1中的RXNEIE=1,则产生中断。
该位由软件序列清零(先读USART_SR,后读USART_CR)。
0:
没有溢出错误;
1:
检测到溢出错误。
注意:
该位被置位时,RDR寄存器中的数据不会丢失,但是移位寄存器中的数据会被覆盖。
在多缓冲通信模式下,如果设置了EIE位,则ORE置位会产生中断。
位2NE:
噪声错误标志(Noiseerror)
在接收到的帧中检测到噪声时,该位由硬件置位。
该位由软件序列清除(先读USART_SR,再读USART_DR)。
0:
没有检测到噪声;
1:
检测到噪声。
注意:
该位不会产生中断,因为它和RXNE一起出现,硬件会在设置RXNE标志时产生中断。
在多缓冲通信模式下,如果设置了EIE位,则NE置位会产生中断。
位1FE:
帧错误(Framingerror)
当检测到同步错位,过多的噪声或者断开符,该位被硬件置位。
由软件序列将其清零(先读USART_SR,再读USART_DR)。
0:
没有检测到帧错误;
1:
检测到帧错误或者break符。
注意:
该位不会产生中断,因为它和RXNE一起出现,硬件会在设置RXNE标志时产生中断。
如果当前传输的数据既产生了帧错误,又产生了溢出错误,硬件还是会继续该数据的传输,并且只设置ORE位。
在多缓冲通信模式下,如果设置了EIE位,则FE置位会产生中断。
位0PE:
校验错误(Parityerror)
在接收模式下,如果出现奇偶校验错误,该位被硬件置位。
由软件序列对其清零(先读USART_SR,再读USART_DR)。
在清除PE位前,软件必须等待RXNE标志位被置’1’。
如果USART_CR1中的PEIE=1,则产生中断。
0:
没有奇偶校验错误;
1:
奇偶校验错误。
[编辑]USART_DR(DataRegister)数据寄存器
位31:
9保留位,由硬件强制为0
位8:
0DR[8:
0]:
数据值(Datavalue)
包含了发送或接收的数据。
由于它是由两个寄存器组成的,一个给发送用(TDR),一个给接收用(RDR),该寄存器兼具读和写的功能。
TDR寄存器提供了内部总线和输出移位寄存器之间的并行接口。
RDR寄存器提供了输入移位寄存器和内部总线之间的并行接口。
(参见USART内部结构框图)
如果USART_CR1中的校验控制使能位PCE=1,在发送数据时,写到MSB的值(根据数据的长度不同,MSB是第7位或者第8位)会被后来的校验位取代。
接收数据时,读到的MSB位是接收到的校验位。
[编辑]USART_BRR(BaudRateRegister)波特率寄存器
位31:
16保留位,硬件强制为0
位15:
4DIV_Mantissa[11:
0]:
USARTDIV的整数部分
这12位定义了USART分频器除法因子(USARTDIV)的整数部分。
位3:
0DIV_Fraction[3:
0]:
USARTDIV的小数部分
这4位定义了USART分频器除法因子(USARTDIV)的小数部分。
[编辑]USART_CR1(ControlRegister1)控制寄存器1
位31:
14保留位,硬件强制为0
位13UE:
USART使能(USARTenable)
当该位被清零,在当前字节传输完成后USART的分频器和输出停止工作,以减少功耗。
该位由软件设置和清零。
0:
USART分频器和输出被禁止;
1:
USART模块使能。
位12M:
字长(Wordlength)
该位定义了数据字的长度,由软件对其设置和清零
0:
一个起始位,8个数据位,n个停止位;
1:
一个起始位,9个数据位,n个停止位。
注意:
在数据传输过程中(发送或者接收时),不能修改这个位。
位11WAKE:
唤醒的方法(Wakeupmethod)
这位决定了把USART唤醒的方法,由软件对该位设置和清零。
0:
被空闲总线唤醒;
1:
被地址标记唤醒。
位10PCE:
检验控制使能(Paritycontrolenable)
用该位选择是否进行硬件校验控制(对于发送来说就是校验位的产生;对于接收来说就是校验位的检测)。
当使能了该位,在发送数据的最高位(如果M=1,最高位就是第9位;如果M=0,最高位就是第8位)插入校验位;对接收到的数据检查其校验位。
软件对它置’1’或清’0’。
一旦设置了该位,当前字节传输完成后,校验控制才生效。
0:
禁止校验控制;
1:
使能校验控制。
位9PS:
校验选择(Parityselection)
当校验控制使能后,该位用来选择是采用偶校验还是奇校验。
软件对它置’1’或清’0’。
当前字节传输完成后,该选择生效。
0:
偶校验;
1:
奇校验。
位8PEIE:
PE中断使能(PEinterruptenable)
该位由软件设置或清除。
0:
禁止产生中断;
1:
当USART_SR中的PE为’1’时,产生USART中断。
位7TXEIE:
发送缓冲区空中断使能(TXEinterruptenable)
该位由软件设置或清除。
0:
禁止产生中断;
1:
当USART_SR中的TXE为’1’时,产生USART中断。
位6TCIE:
发送完成中断使能(Transmissioncompleteinterruptenable)
该位由软件设置或清除。
0:
禁止产生中断;
1:
当USART_SR中的TC为’1’时,产生USART中断。
位5RXNEIE:
接收缓冲区非空中断使能(RXNEinterruptenable)
该位由软件设置或清除。
0:
禁止产生中断;
1:
当USART_SR中的ORE或者RXNE为’1’时,产生USART中断。
位4IDLEIE:
IDLE中断使能(IDLEinterruptenable)
该位由软件设置或清除。
0:
禁止产生中断;
1:
当USART_SR中的IDLE为’1’时,产生USART中断。
位3TE:
发送使能(Transmitterenable)
该位使能发送器。
该位由软件设置或清除。
0:
禁止发送;
1:
使能发送。
注意:
1.在数据传输过程中,除了在智能卡模式下,如果TE位上有个0脉冲(即设置为’0’之后再设置为’1’),会在当前数据字传输完成后,发送一个“前导符”(空闲总线)。
2.当TE被设置后,在真正发送开始之前,有一个比特时间的延迟。
位2RE:
接收使能(Receiverenable)
该位由软件设置或清除。
0:
禁止接收;
1:
使能接收,并开始搜寻RX引脚上的起始位。
位1RWU:
接收唤醒(Receiverwakeup)
该位用来决定是否把USART置于静默模式。
该位由软件设置或清除。
当唤醒序列到来时,硬件也会将其清零。
0:
接收器处于正常工作模式;
1:
接收器处于静默模式。
注意:
1.在把USART置于静默模式(设置RWU位)之前,USART要已经先接收了一个数据字节。
否则在静默模式下,不能被空闲总线检测唤醒。
2.当配置成地址标记检测唤醒(WAKE位=1),在RXNE位被置位时,不能用软件修改RWU位。
位0SBK:
发送断开帧(Sendbreak)
使用该位来发送断开字符。
该位可以由软件设置或清除。
操作过程应该是软件设置位它,然后在断开帧的停止位时,由硬件将该位复位。
0:
没有发送断开字符;
1:
将要发送断开字符。
[编辑]USART_CR2(ControlRegister2)控制寄存器2
位31:
15保留位,硬件强制为0。
位14LINEN:
LIN模式使能(LINmodeenable)
该位由软件设置或清除。
0:
禁止LIN模式;
1:
使能LIN模式。
在LIN模式下,可以用USART_CR1寄存器中的SBK位发送LIN同步断开符(低13位),以及检测LIN同步断开符。
位13:
12STOP:
停止位(STOPbits)
这2位用来设置停止位的位数
00:
1个停止位;
01:
0.5个停止位;
10:
2个停止位;
11:
1.5个停止位;
注:
UART4和UART5不能用0.5停止位和1.5停止位。
位11CLKEN:
时钟使能(Clockenable)
该位用来使能CK引脚
0:
禁止CK引脚;
1:
使能CK引脚。
注:
UART4和UART5上不存在这一位。
位10CPOL:
时钟极性(Clockpolarity)
在同步模式下,可以用该位选择SLCK引脚上时钟输出的极性。
和CPHA位一起配合来产生需要的时钟/数据的采样关系
0:
总线空闲时CK引脚上保持低电平;
1:
总线空闲时CK引脚上保持高电平。
注:
UART4和UART5上不存在这一位。
位9CPHA:
时钟相位(Clockphase)
在同步模式下,可以用该位选择SLCK引脚上时钟输出的相位。
和CPOL位一起配合来产生需要的时钟/数据的采样关系(参见图259和图260)。
544/754
0:
在时钟的第一个边沿进行数据捕获;
1:
在时钟的第二个边沿进行数据捕获。
注:
UART4和UART5上不存在这一位。
位8LBCL:
最后一位时钟脉冲(Lastbitclockpulse)
在同步模式下,使用该位来控制是否在CK引脚上输出最后发送的那个数据字节(MSB)对应的时钟脉冲
0:
最后一位数据的时钟脉冲不从CK输出;
1:
最后一位数据的时钟脉冲会从CK输出。
注意:
1.最后一个数据位就是第8或者第9个发送的位(根据USART_CR1寄存器中的M位所定义的8或者9位数据帧格式)。
2.UART4和UART5上不存在这一位。
位7保留位,硬件强制为0
位6LBDIE:
LIN断开符检测中断使能(LINbreakdetectioninterruptenable)
断开符中断屏蔽(使用断开分隔符来检测断开符)
0:
禁止中断;
1:
只要USART_SR寄存器中的LBD为’1’就产生中断。
位5LBDL:
LIN断开符检测长度(LINbreakdetectionlength)
该位用来选择是11位还是10位的断开符检测
0:
10位的断开符检测;
1:
11位的断开符检测。
位4保留位,硬件强制为0
位3:
0ADD[3:
0]:
本设备的USART节点地址
该位域给出本设备USART节点的地址。
这是在多处理器通信下的静默模式中使用的,使用地址标记来唤醒某个USART设备。
注意:
在使能发送后不能改写这三个位(CPOL、CPHA、LBCL)。
[编辑]USART_CR3(ControlRegister3)控制寄存器3
位31:
11保留位,硬件强制为0
位10CTSIE:
CTS中断使能(CTSinterruptenable)
0:
禁止中断;
1:
USART_SR寄存器中的CTS为’1’时产生中断。
注:
UART4和UART5上不存在这一位。
位9CTSE:
CTS使能(CTSenable)
0:
禁止CTS硬件流控制;
1:
CTS模式使能,只有nCTS输入信号有效(拉成低电平)时才能发送数据。
如果在数据传输的过程中,nCTS信号变成无效,那么发完这个数据后,传输就停止下来。
如果当nCTS为无效时,往数据寄存器里写数据,则要等到nCTS有效时才会发送这个数据。
注:
UART4和UART5上不存在这一位。
位8RTSE:
RTS使能(RTSenable)
0:
禁止RTS硬件流控制;
1:
RTS中断使能,只有接收缓冲区内有空余的空间时才请求下一个数据。
当前数据发送完成后,发送操作就需要暂停下来。
如果可以接收数据了,将nRTS输出置为有效(拉至低电平)。
注:
UART4和UART5上不存在这一位。
位7DMAT:
DMA使能发送(DMAenabletransmitter)
该位由软件设置或清除。
0:
禁止发送时的DMA模式。
1:
使能发送时的DMA模式;
注:
UART4和UART5上不存在这一位。
位6DMAR:
DMA使能接收(DMAenablereceiver)
该位由软件设置或清除。
0:
禁止接收时的DMA模式。
1:
使能接收时的DMA模式;
注:
UART4和UART5上不存在这一位。
位5SCEN:
智能卡模式使能(Smartcardmodeenable)
该位用来使能智能卡模式
0:
禁止智能卡模式;
1:
使能智能卡模式。
注:
UART4和UART5上不存在这一位。
位4NACK:
智能卡NACK使能(SmartcardNACKenable)
0:
校验错误出现时,不发送NACK;
1:
校验错误出现时,发送NACK。
注:
UART4和UART5上不存在这一位。
位3HDSEL:
半双工选择(Half-duplexselection)
选择单线半双工模式
0:
不选择半双工模式;
1:
选择半双工模式。
位2IRLP:
红外低功耗(IrDAlow-power)
该位用来选择普通模式还是低功耗红外模式
0:
通常模式;
1:
低功耗模式。
位1IREN:
红外模式使能(IrDAmodeenable)
该位由软件设置或清除。
0:
不使能红外模式;
1:
使能红外模式。
位0EIE:
错误中断使能(Errorinterruptenable)
在多缓冲通信模式下,如果该位为’1’,当有帧错误、过载错误或者噪声错误时(USART_SR中的FE=1,或者ORE=1,或者NE=1),则产生中断。
0:
禁止中断;
1:
只要USART_CR3中的DMAR=1,并且USART_SR中的FE=1,或者ORE=1,或者NE=1,则产生中断
[编辑]USART_GTPR(GuardTimeandPrescalerRegister)保护时间和预分频寄存器
位31:
16保留位,由硬件强制为0
位15:
8GT[7:
0]:
保护时间值(Guardtimevalue)
该位域规定了以波特时钟为单位的保护时间。
在智能卡模式下,需要这个功能。
当保护时间过去后,才会设置发送完成标志(TC)。
注:
UART4和UART5上不存在这一位。
位7:
0PSC[7:
0]:
预分频器值(Prescalervalue)
在红外(IrDA)低功耗模式下:
PSC[7:
0]=红外低功耗波特率
对系统时钟分频以获得低功耗模式下的频率:
源时钟被寄存器中的值(仅有8位有效)分频
00000000:
保留–不要写入该值;
00000001:
对源时钟1分频;
00000010:
对源时钟2分频;
……
在红外(IrDA)的正常模式下:
PSC只能设置为00000001
在智能卡模式下:
PSC[4:
0]:
预分频值
对系统时钟进行分频,给智能卡提供时钟。
寄存器中给出的值(低5位有效)乘以2后,作为对源时钟的分频因子
00000:
保留–不要写入该值;
00001:
对源时钟进行2分频;
00010:
对源时钟进行4分频;
00011:
对源时钟进行6分频;
……
位[7:
5]在智能卡模式下没有意义。
注:
UART4和UART5上不存在这一位。
[编辑]USART帧格式
USART有三种帧格式:
数据帧、空闲帧和断开帧。
[编辑]数据帧
由一个低电平的起始位,8位或9位数据位,和0.5/1/1.5/2个高电平的停止位组成。
其中,数据位长度(字长)取决于USART_CR1寄存器中的M位;发送和接收时,最低有效位在前;当USART_CR1寄存器中的校验控制使能位PCE=1时,最高有效位被校验位代替;在同步模式下,CK引脚是否为最高有效位提供时钟脉冲取决于USART_CR2中的LBCL位;停止位数取决于USART_CR2寄存器中的STOP[1:
0]。
[编辑]空闲帧
在一个帧周期内,全部为高电平。
[编辑]断开帧
在一个帧周期内,全部为低电平。
在断开帧结束后,再发送1或2个高电平的停止位,以识别下一个低电平的起始位。
[编辑]小数波特率
发送和接收由一共用的波特率发生器驱动,当发送器和接收器的使能位分别(TE和RE)置位时,分别为其产生时钟。
接收器和发送器的波特率应设置成相同。
Tx/Rx波特率=PCLKx/(16*USARTDIV)
PCLKx可以是APB1的时钟PCLK1(用于USART1),也可以是APB2的时钟PCLK2(用于USART2、3、4、5)。
USARTDIV
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- STM32 例程 串口 实验