列表 上一篇 下一篇

STM32:非中断模式USART实验总结(续1)

先上代码

#include "stm32f10x.h" #include "stm32f10x_gpio.h" #include "stm32f10x_rcc.h" #include "stm32f10x_usart.h" int main() { char tmp; GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO | RCC_APB2Periph_USART1, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); USART_InitStructure.USART_BaudRate = 115200; USART_InitStructure.USART_WordLength = USART_WordLength_8b; 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); USART_Cmd(USART1, ENABLE); /* 以上是对串口的初始化部分,USART1初始化设置:115200-8-n-1 */ /*---------------------------程序主要部分-------------------------------------*/ while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);//收到数据 USART1->CR1&=~(1<<3);//禁止发送 //while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);//USART_DR寄存器为空 USART_SendData(USART1, 'c'); //while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);//USART_DR寄存器为空 USART_SendData(USART1, 'c'); //禁止发送之后,没有检查USART_DR是否为空,就直接写入USART_DR寄存器就是为了确保USART_DR的写入。 while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET);//再次检查接收数据标志 tmp=USART_ReceiveData(USART1);//读取的数据是刚才发送写入USART_DR的还是刚才接收到的数据呢? USART1->CR1|=(1<<3);//使能发送 while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);//USART_DR寄存器为空 USART_SendData(USART1, tmp);//读出刚才接收的数据并发送 for(;;); }

38行的禁止发送、39行注释掉、41行注释掉、两次连续写入USART_DR只是为了确保USART_DR发送寄存器不为空。然后再次检查接收寄存器并且读取到tmp,然后再开启发送,等待发送寄存器空时发送刚才读取的数据。
实验结果:上位机输入b,则会接收到b。
小结:USART_DR发送、接收寄存器是完全独立的,对USART_DR的读取则会读取到USAR_DR接收寄存器,对USART_DR的写则会写到USART_DR的发送寄存器。关于手册中“包含了发送或接收的数据。由于它是由两个寄存器组成的,一个给发送用(TDR) ,一个给接收用(RDR) ,该寄存器兼具读和写的功能。”的验证,由上一节的%90提高到%99。