分享

串口通信寄存器/库函数配置、实例编写

 山峰云绕 2023-06-09 发布于贵州

常用的串口相关寄存器

  • https://blog.csdn.net/FHNCSDN/article/details/110673626

  • 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;//波特率115200
	USART_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);
}

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多