常用的串口相关寄存器
- USART_SR状态寄存器
- USART_DR数据寄存器
- USART_BRR波特率寄存器
串口操作相关库函数(省略入口参数):
void USART_Init(); //串口初始化:波特率,数据字长,奇偶校验,硬件流控以及收发使能
void USART_Cmd();//使能串口
void USART_ITConfig();//使能相关中断void USART_SendData();//发送数据到串口,DR
uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据FlagStatus USART_GetFlagStatus();//获取状态标志位
void USART_ClearFlag();//清除状态标志位
ITStatus USART_GetITStatus();//获取中断状态标志位,若有数据到来则返回一。
void USART_ClearITPendingBit();//清除中断状态标志位
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);
例如我们要判断读寄存器是否非空(RXNE),操作库函数的方法是:
USART_GetFlagStatus(USART1, USART_FLAG_RXNE);
我们要判断发送是否完成(TC),操作库函数的方法是:
USART_GetFlagStatus(USART1, USART_FLAG_TC);
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);
uint16_t USART_ReceiveData(USART_TypeDef* USARTx);
void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);
波特率计算方法:
串口配置的一般步骤
- 串口时钟使能,GPIO时钟使能,都是这一个函数:
RCC_APB2PeriphClockCmd();
- 串口复位:
USART_DeInit(); 这一步不是必须的
- GPIO端口模式设置:
GPIO_Init();
TX的模式设置为GPIO_Mode_AF_PP
RX的模式设置为浮空输入( GPIO_Mode_IN_FLOATING)
或带上拉输入(GPIO_Mode_IPU)
-
PS :外设的GPIO的MODE配置:
-
串口参数初始化:
USART_Init();
这个函数的第一个入口参数是指定初始化的串口标号,这里选择 USART1。
第二个入口参数是一个 USART_InitTypeDef 类型的结构体指针,这个结构体指针的成员变量用
来设置串口的一些参数。一般的实现格式为:
USART_InitStructure.USART_BaudRate = bound; //波特率设置;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为 8 位数据格式
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); //初始化串口从上面的初始化格式可以看出初始化需要设置的参数为:波特率,字长,停止位,奇偶校验位,
硬件数据流控制,模式(收,发)。我们可以根据需要设置这些参数。
- 开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤)
NVIC_Init();USART_ITConfig();
- 使能串口:
USART_Cmd();
- 编写中断处理函数:
USARTx_IRQHandler();
- 串口数据收发:
void USART_SendData();//发送数据到串口,DR
uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据
- 串口传输状态获取:
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);
void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);
USART.h部分代码:
#ifndef __UART_H
#define __UART_H
#include "stm32f10x.h"void My_Usart_Init(void);//串口、GPIO、中断初始化函数
void USART1_IRQHandler(void);//中断函数#endif
USART.c部分代码:
#include "USART.h"
void My_Usart_Init(void)
{USART_InitTypeDef USART_InitStrue;GPIO_InitTypeDef GPIO_InitSture;NVIC_InitTypeDef NVIC_InitSture;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//GPIOA时钟使能RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//串口时钟使能USART_DeInit( USART1);//串口复位GPIO_InitSture.GPIO_Pin=GPIO_Pin_9;GPIO_InitSture.GPIO_Mode=GPIO_Mode_AF_PP;//设置GPIOA.9的模式是复用推挽输出GPIO_InitSture.GPIO_Speed=GPIO_Speed_10MHz;GPIO_Init(GPIOA,&GPIO_InitSture);//GPIO初始化GPIO_InitSture.GPIO_Pin=GPIO_Pin_10;GPIO_InitSture.GPIO_Mode= GPIO_Mode_IN_FLOATING;//设置GPIOA.10的模式是浮空输入GPIO_InitSture.GPIO_Speed=GPIO_Speed_10MHz;GPIO_Init(GPIOA,&GPIO_InitSture);//GPIO初始化USART_InitStrue.USART_BaudRate=115200;//波特率115200USART_InitStrue.USART_WordLength=USART_WordLength_8b;//8个数据位USART_InitStrue.USART_StopBits=USART_StopBits_1;//一个停止位USART_InitStrue.USART_Parity=USART_Parity_No;//无奇偶校验位USART_InitStrue.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//收发模式USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;USART_Init(USART1,&USART_InitStrue);//串口初始化USART_Cmd(USART1,ENABLE);//串口使能USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//开启接收中断,第一个参数是要使能哪个串口的中断。//第二个参数是确定使能中断的类型USART_IT_RXNE是接收缓冲区非空//当接受缓冲区非空的时候触发中断,TC是发送完成触发中断NVIC_InitSture.NVIC_IRQChannel=USART1_IRQn;//指出是哪一个通道(在stm32f10x.h中可查看通道)NVIC_InitSture.NVIC_IRQChannelCmd=ENABLE;NVIC_InitSture.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitSture.NVIC_IRQChannelSubPriority=1;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断设置分组NVIC_Init(&NVIC_InitSture);//中断初始化
}void USART1_IRQHandler(void)//中断函数
{u8 read;if(USART_GetITStatus(USART1,USART_IT_RXNE)){read=USART_ReceiveData(USART1);//读取数据USART_SendData(USART1,read);}
}
main.c部分代码:
#include "stm32f10x.h"
#include "USRT.h"int main(void)
{ My_Usart_Init();while(1);
}