XCOSnTh单片机的串口

串口是一个泛称,具体的串口有RS232、TTL、RS485等等
单片机的串口

上图中,RX为单片机串口数据的接收线,TX为单片机串口数据的发送线,单片机的异步串口就这2根线,如果想要串口工作起来,还需要一根GND线(因为在这个单片机中,所有的电压信号都是相对于GND的),串口靠有无电压(高低电平)来传递信号,【此单片机的串口为TTL串口(这是一个很具体的名字,在设计硬件电路的时候,称为TTL电路设计)】其中信号的格式如下
1表示高电平(有电压),0表示低电平(无电压)

由上图可知串口在没有传输数据的时候,保持为高电平状态

如上图所示串口的每一帧数据一般有10位分别为初始位、8位数据和结束位(停止位),每位的保持时间称为波特率(比如115200Hz、9600Hz)

1、关于波特率的配置代码为:

复制代码
/*USART_InitTypeDef USART_InitStructure;*/
USART_InitStructure.USART_BaudRate = 115200;//波特率:115200

2、串口是可以全双工、半双工、单工的通信接口,在该单片机中的配置代码为:

复制代码
/*USART_InitTypeDef USART_InitStructure;*/
USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;//模式:发送和接收模式

当配置为USART_InitStructure.USART_Mode = USART_Mode_Tx;时候串口就只具备发送功能。

当配置为USART_InitStructure.USART_Mode = USART_Mode_Rx;时候串口就只具备接收功能。

3、通常使用的串口为异步串口,所以将硬件流控配置为【无硬件流控】,代码为:

复制代码
/*USART_InitTypeDef USART_InitStructure;*/
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//流控:无

4、串口有数据校验(奇偶校验)的功能,但通常不使用,所以代码为【无校验】

复制代码
/*USART_InitTypeDef USART_InitStructure;*/
USART_InitStructure.USART_Parity = USART_Parity_No;//校验:无

5、通常配置停止位为1位,数据位为8位【1位停止位、8位数据位】

复制代码
/*USART_InitTypeDef USART_InitStructure;*/
USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止位:1位
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//数据位宽度:8位

6、在STD库中调用初始化函数,通过上面的配置即可完成TTL串口的初始化,代码为

复制代码
USART_Init(USART1, &USART_InitStructure);//串口初始化

完整的串口程序为:

复制代码
#include"STM32F10X.h"
void USART1_IRQHandler(void)
{//串口接收中断
	if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)
	{
		uint16_t temp = USART_ReceiveData(USART1);//读取串口接收到的数据	
		USART_SendData(USART1,temp);//将串口接收到的数据发送出去
	}
}
void TTL_SerialInit()
{//【串口配置】
	{//1、串口的GPIO配置
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能GPIOA的时钟
		GPIO_InitTypeDef GPIO_InitStructure;
		//PA9:Tx
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化PA9:Tx
		//PA10:Rx
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
		GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
		GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化PA10:Rx
	}
	{//2、串口配置
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);//使能串口时钟
		USART_InitTypeDef USART_InitStructure;
		USART_InitStructure.USART_BaudRate = 115200;//波特率:115200
		USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//流控:无
		USART_InitStructure.USART_Mode = USART_Mode_Tx|USART_Mode_Rx;//模式:发送和接收模式
		USART_InitStructure.USART_Parity = USART_Parity_No;	//校验:无
		USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止位:1位
		USART_InitStructure.USART_WordLength = USART_WordLength_8b;//数据位宽度:8位
		USART_Init(USART1, &USART_InitStructure);//串口初始化
		{//3、串口的接收中断配置
			NVIC_InitTypeDef NVIC_InitStructure;
			NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;	
			NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;	
			NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
			NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
			NVIC_Init(&NVIC_InitStructure);	
			USART_Cmd(USART1, ENABLE);
		}
		USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);	//打开串口接收中断
	}
}
static int PrintPutC(int ch)
{
	USART_SendData(USART1, ch);//发送一个字节的数据
	while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);	//等待串口发送完成
	return ch;
}

RS232串口经典电路图

RS485串口经典电路图

相关推荐
icy、泡芙2 分钟前
移远 5G RG255AA-CN 调试
linux·单片机·5g
时空自由民.25 分钟前
MCU 内存栈介绍和内存段
单片机·嵌入式硬件
DeniuHe29 分钟前
逻辑回归(Logistic Regression)详细解释与公式推导
算法·机器学习·逻辑回归
YeGop31 分钟前
51单片机定时器函数分享(8051汇编)
汇编·嵌入式硬件·51单片机
迅量科技资讯分享33 分钟前
手机拍照明晰度评估:传感器尺寸像素数量与处理器算法解析
算法·三星·像素
liu****36 分钟前
12.线程同步与互斥
linux·数据结构·c++·算法·1024程序员节
麦烤楽鸡翅1 小时前
小红书推荐系统(牛客)
java·python·算法·秋招·春招·牛客·面试算法题
屁股割了还要学1 小时前
【C++进阶】STL-string的简单实现
c语言·开发语言·数据结构·c++·学习·考研
王哈哈^_^1 小时前
CV三大核心任务:目标检测、图像分割、关键点检测
人工智能·算法·yolo·目标检测·计算机视觉·视觉检测
ad钙奶长高高1 小时前
【C语言】原码反码补码详解
c语言·开发语言