一、常用的串口寄存器
USART_SR状态寄存器
作用: 状态寄存器适用于检测串口此时所处的状态。
主要关注两个位:RXNE和TC(第5、6两位)。
RXNE(读数据寄存器非空): 当该位被置1的时候,就是提示已经有数据被接收到了,并且可以读出来了(即RDR移位寄存器中的数据被转移到USART_DR寄存器中)。这时候要做的就是尽快读取USART_DR,从而将该位清零,也可以向该位写0,直接清除。
TC(发送完成): 当该位被置1的时候,表示USART_DR内的数据已经被发送完成了。如果设置了这个位的中断,则会产生中断。该位也有两种清零方式:读USART_SR,写USART_DR;直接向该位写0。
USART_DR数据寄存器
USART_DR实际是包含了两个寄存器,一个专门用于发送的TDR,一个专门用于接收的RDR。进行发送数据操作时,往USART_DR写入数据会自动存储在TDR内;当进行读取数据操作时,向USART_DR读取数据会自动提取RDR数据。
串行通信时一位一位传输的,所以TDR和RDR寄存器都是介于系统总线和移位寄存器间的;发送数据时把TDR内容转移到发送移位寄存器上,接收数据时则是把接收到的每一位顺序保存在接收移位寄存器内进而转移到RDR。
USART_BRR波特率寄存器
波特率寄存器包括定义了两个部分:DIV_Mantissa(整数部分)和DIV_Fraction(小数部分)。
USART_CR1控制寄存器
控制寄存器主要是设置USART使能、检验控制使能、校验选择(奇校验偶校验)、PE中断使能、发送缓冲区空中断使能、发送完成中断使能、接收缓冲区非空使能、发送使能、接受使能、字长等等
波特率的计算
十进制小数直接换算成十六进制需要×16,与整数部分÷16正好相反。
二、 串口操作相关库函数
void USART_Init()
USART_InitStrue.USART_BaudRate=115200;//设置波特率
USART_InitStrue.USART_WordLength=USART_WordLength_8b;//数据字长为8
USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//无硬件流控 应该就是连接其他外设的时候用的
USART_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
//调整为可以接收也可以发送模式
USART_InitStrue.USART_Parity=USART_Parity_No;//奇偶校验设置为无
USART_InitStrue.USART_StopBits=USART_StopBits_1;//设置停止位
三、串口初始化的一般步骤
四、初始化代码
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "usart.h"
void My_USART1_Init(void)
{
GPIO_InitTypeDef GPIO_InitStrue;
USART_InitTypeDef USART_InitStrue;
NVIC_InitTypeDef NVIC_InitStrue;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//GPIO????
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//??????
GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStrue.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOA,&GPIO_InitStrue);
GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStrue.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOA,&GPIO_InitStrue);
USART_InitStrue.USART_BaudRate=115200;
USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
USART_InitStrue.USART_Parity=USART_Parity_No;
USART_InitStrue.USART_StopBits=USART_StopBits_1;
USART_InitStrue.USART_WordLength=USART_WordLength_8b;
USART_Init(USART1,&USART_InitStrue);//
USART_Cmd(USART1,ENABLE);//????1
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//??????,?????,?????
NVIC_InitStrue.NVIC_IRQChannel=USART1_IRQn; //(??)
NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE; //(????)
NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;//(???)
NVIC_Init(&NVIC_InitStrue);
}
void USART1_IRQhandler(void)
{
u8 res; //(??????)
if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET) //(?????????)
{
res= USART_ReceiveData(USART1); //????
USART_SendData(USART1,res); //????
}
}
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
My_USART1_Init();
while(1);
}