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。