STM32 例程 串口实验 联系客服

发布时间 : 星期二 文章STM32 例程 串口实验更新完毕开始阅读0da07ef59e314332396893d0

3. 当接收移位寄存器接收到数据后,硬件就会将接收移位寄存器中的数据转

移到RDR中。

4. RDR非空,RXNE=1,如果RXNEIE=1,则产生中断。

在接收期间如果检测到帧错误,噪声或溢出错误,错误标志将被置起,

在多缓冲器通信时,RXNE在每个字节接收后被置起,并由DMA对数据寄存器的读操作而清零。

在单缓冲器模式里,由软件读USART_DR寄存器完成对RXNE位清除。RXNE标志也可以通过对它写0来清除。RXNE位必须在下一字符接收结束前被清零,以避免溢出错误。

注意:在接收数据时,RE位不应该被复位。如果RE位在接收时被清零,当前接收的 数据会丢失。

[编辑] 断开帧

当接收到一个断开帧时,USART像处理帧错误一样处理它。

[编辑] 溢出错误

如果RXNE还没有被复位,又接收到一个字符,则发生溢出错误。数据只有当RXNE位被清零后才能从移位寄存器转移到RDR寄存器。

RXNE标记是接收到每个字节后被置位的。如果下一个数据已被收到或先前DMA请求还没被服务时,RXNE标志仍是置起的,溢出错误产生。当溢出错误产生时:

? ? ? ? ?

ORE位被置位。

RDR内容将不会丢失。读USART_DR寄存器仍能得到先前的数据。 移位寄存器中以前的内容将被覆盖。随后接收到的数据都将丢失。 如果RXNEIE位被设置或EIE和DMAR位都被设置,中断产生。

顺序执行对USART_SR和USART_DR寄存器的读操作,可复位ORE位

注意: 当ORE位置位时,表明至少有1个数据已经丢失。有两种可能性:

如果RXNE=1,上一个有效数据还在接收寄存器RDR上,可以被读出。 如果RXNE=0,这意味着上一个有效数据已经被读走,RDR已经没有东西可读。当上一个有效数据在RDR中被读取的同时又接收到新的(也就是丢失的)数据时,此种情况可能发生。在读序列期间(在USART_SR寄存器读访问和USART_DR读访问之间)接收到新的数据,此种情况也可能发生。

[编辑] 噪音错误

使用过采样技术(同步模式除外),通过区别有效输入数据和噪声来进行数据恢复。

如果三个采样数据为000,并且接收到的数据位为0,则认为是有效数据。 如果三个采样数据为111,并且接收到的数据位为1,也认为是有效数据。 其他情况都认为是噪声。当在接收帧中检测到噪声时:

在RXNE位的上升沿设置NE标志。

? 无效数据从移位寄存器传送到USART_DR寄存器。

? 在单个字节通信情况下,没有中断产生。然而,因为NE标志位和RXNE

标志位是同 时被设置,RXNE将产生中断。在多缓冲器通信情况下,如果已经设置了USART_CR3 寄存器中EIE位,将产生一个中断。

?

顺序执行对USART_SR和USART_DR寄存器的读操作,可复位NE位。

[编辑] 帧错误

当以下情况发生时检测到帧错误:

由于没有同步上或大量噪音的原因,停止位没有在预期的时间内识别出来。 当帧错误被检测到时:

FE位被硬件置起

? 无效数据从移位寄存器传送到USART_DR寄存器。

? 在单字节通信时,没有中断产生。然而,这个位和RXNE位同时置起,后

者将产生中断。在多缓冲器通信情况下,如果USART_CR3寄存器中EIE位被置位的话,将产生中断。

?

顺序执行对USART_SR和USART_DR寄存器的读操作,可复位FE位。

[编辑] 校验错误

如果USART_CR1中的校验控制使能位PCE=1,发送时,写进数据寄存器的数据的MSB位被校验位替换后发送出去(PS=0,选择偶校验偶数个’1’;PS=1,选择奇校验奇数个’1’)。接收时,如果奇偶校验失败,USART_SR寄存器中的PE标志被置’1’,如果USART_CR1寄存器的PEIE=1,则中断产生。

[编辑] USART中断 (表) USART中断请求

USART的各种中断事件被连接到同一个中断向量(见下图),有以下各种中断事件:

发送期间:发送完成(TC)、清除发送(CTS)、发送数据寄存器空(TXE)。 ? 接收期间:空闲总线检测(IDLE)、溢出错误(ORE)、接收数据寄存器非空

(RXNE)、校验错误(PE)、LIN断开符号检测(LBD)、噪音错误(NE)(仅在多缓冲器通信)和帧错误(FE)(仅在多缓冲器通信)。

?

如果设置了对应的使能控制位,这些事件就可以产生各自的中断。 (图) USART中断映射图

[编辑] USART初始化结构类型定义 \\stm32f10x_usart.h文件中

typedef struct {

uint32_t USART_BaudRate; //波特率

uint16_t USART_WordLength; //字长(数据位数) uint16_t USART_StopBits; //停止位 uint16_t USART_Parity; //校验方式 uint16_t USART_Mode; //收发模式

uint16_t USART_HardwareFlowControl; //硬件流控制 } USART_InitTypeDef;

/* USART_BaudRate 用于配置USART_BRR */

/* USART_WordLength 用于配置M位(USART_CR1[12]) */

#define USART_WordLength_8b ((uint16_t)0x0000) #define USART_WordLength_9b ((uint16_t)0x1000) /* USART_StopBits 用于配置STOP[1:0](USART_CR2[13:12]) */

#define USART_StopBits_1 ((uint16_t)0x0000) #define USART_StopBits_0_5 ((uint16_t)0x1000) #define USART_StopBits_2 ((uint16_t)0x2000) #define USART_StopBits_1_5 ((uint16_t)0x3000)

/* USART_Parity 用于配置PCE位(USART_CR1[10])和PS位(USART_CR1[9]) */ #define USART_Parity_No ((uint16_t)0x0000)