串口设置的一般步骤:
- 串口时钟使能,GPIO时钟使能
- 串口复位
- GPIO端口模式设置
- 串口参数初始化
- 开启中断并且初始化NVIC(需要开启中断才需要这个步骤)
- 使能串口
- 编写中断处理程序
串口时钟使能:
串口是挂载在APB2下面的外设,所以使能函数如下:
RCC_APB2PeriphClockCmd(RCC_APB2Perip_USART1);
串口复位:
void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);
__注:__第一个参数入口是指定初始化的串口标号;第二个参数入口是一个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); //初始化串口
数据发送与接收:
库函数操作USART_DR寄存器
数据发送函数:
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);
读取接收到数据的函数:
uint16_t USART_ReceiveData(USART_TypeDef* USARTx);
串口状态:
串口状态可以通过状态寄存器USART_SR读取
读取串口状态的函数是:
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);
注: 第二个入口参数表示要查看串口的哪种状态
判断读寄存器是否非空(RXNE):
USART_GetFlagStatus(USART1, USART_FLAG_RXNE);
判断发送是否完成(TC):
USART_GetFlagStatus(USART1, USART_FLAG_TC);
标识的宏定义:
#define USART_IT_PE ((uint16_t)0x0028)
#define USART_IT_TXE ((uint16_t)0x0727)
#define USART_IT_TC ((uint16_t)0x0626)
#define USART_IT_RXNE ((uint16_t)0x0525)
#define USART_IT_IDLE ((uint16_t)0x0424)
#define USART_IT_LBD ((uint16_t)0x0846)
#define USART_IT_CTS ((uint16_t)0x096A)
#define USART_IT_ERR ((uint16_t)0x0060)
#define USART_IT_ORE ((uint16_t)0x0360)
#define USART_IT_NE ((uint16_t)0x0260)
#define USART_IT_FE ((uint16_t)0x0160)
串口使能:
USART_Cmd(USART1, ENABLE);
开启串口响应中断:
使能串口中断的函数是:
void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT, FunctionalState NewState
)
注: 该函数第二个参数入口是表示使能串口的类型,即使能哪种中断。例如在接收数据的时候开启中断的方法是:
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断,接收到数据中断
在发送数据结束要产生中断的方法是:
USART_ITConfig(USART1, USART_IT_TC, ENABLE);
获取相应的状态:
判断中断的类型使用的函数是:
ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT)
判断到底是否是串口发送完成中断方法是:
USART_GetITStatus(USART1, USART_IT_TC)
返回值是SET,说明串口发送完成中断发生。