STM32的串口

一:2个状态位_itstatus与_flagstatus的区别:

_flagstatus:只是读状态标志,不管中断是否使能或发生。例如使用查询方式发送数据就需要读改状态位。

_itstatus:和中断相关,除了读状态位外还涉及对控制寄存器的操作,使用中断方式必须使用该状态位进行中断是否发生的判断和状态位的清0.

二两个发送中断的区别:TC和TXE

串口数据发送的过程是:先写数据到DR寄存器->移位寄存器->TX管脚。当数据从DR寄存器移出到移位寄存器(即DR寄存器空)时TXE就置位,优点是能保持发送数据的连续性效率高;而当一帧数据全部发送完成("\0"结束符)则触发TC中断,优点是可确定发送完成的时间多用于数据的流控。

状态寄存器USART_SR的复位值为0x00C0H:即 第七位发送寄存器空TXE=1和第六位发送完成TC=1寄存器为空, TC=1表明发送已完成.
此时只要使能了发送空和发送完成中断就可进入中断ISR(所以如果手动发送或者开机状态为接收的要清除这TC标志(TXE不必清零因为不能通过写1清零))。
因此建议的是在初始化时不好启用TXE中断,只在要发送数据(尤其是字符串、数组这样的系列数据)时才启用TXE。在发送完成后立即将其关闭,以免引起不必要的麻烦。
3 TC与TXE:
3.1 数据寄存器DR.移位寄存器SR及TXD/RXD关系:数据寄存器->移位寄存器->TXD;RXD->移位寄存->数据寄存器
3.2 TXE=1的条件:数据从DR移出(到SR);TXE=0的条件:数据写入DR移出(唯一途径,所以TXE不能手动清零)。
3.2 TC=1的条件:SR中的数据通过TXD移出,没有数据写入DR;TC=0的条件:写1清零。
3.3发送字符和字符串及是否使用发送中断:
    单个字符用查询方式;字符串和数组用中断方式;
3.4关于字符和数组发送关闭条件判断:字符串以0x0为标志;二进制数据(0x00~0xff)只能以字节长度(协议商定)为条件。发送完成就可关闭中断。

三关于发送数据丢失第一字节:

因为初始化后DR寄存器是空的,所以此时TC/TXE的标志位都是置1的,如果在发送数据前没有读状态寄存器且不清零状态标志位就会出现丢失第一字节。解决的办法是初始化完成开中断使能后清0状态标志位clearFlagstatus(flagstatus_TC);或者在发送第一字符前先读状态寄存器再操作getflagstatus(flagstatus_TC);

四关于接收没接到数据也进入中断而读所有的中断标志位又都为RESET:

数据接收的过程是RX引脚->移位寄存器->RDR寄存器->读出。当数据从移位寄存器移出到RDR寄存器时则RXNE置位(效率高但读要及时)。如果在RXNE=1同时又有数据进入时会出现ORE过载错误,引发ORE错误中断,但此时因ORE中断未使能所以中断状态位读不出来,使能后可读出来。

五:485串口的收发:在定时器中断里面一直发,发送完成后使能接收,使能中断接收;在接收中断里接收完成后禁止中断接收,打开发送。

六 :效率比较高的方式:空闲中断接收,DMA方式发送

转载于:https://www.cnblogs.com/jieruishu/p/4395571.html

你可能感兴趣的:(STM32的串口)