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串口经典电路图

相关推荐
充哥单片机设计16 小时前
【STM32项目开源】基于STM32的智能家居环境监测系统
stm32·嵌入式硬件·智能家居
Moniane17 小时前
FastGPT 与 MCP 协议概述
算法
点灯小铭17 小时前
基于单片机的四沟道步进电机玉米补种机设计与实现
数据库·单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
草莓工作室17 小时前
数据结构7:栈和队列
c语言·数据结构
清风66666617 小时前
基于单片机的双机串口通信与数字串存储系统设计
数据库·单片机·mongodb·毕业设计·课程设计·期末大作业
Meteor_cyx17 小时前
Day12 二叉树遍历
算法
加藤不太惠17 小时前
十大排序其六
算法·排序算法
前端小刘哥18 小时前
视频推拉流平台EasyDSS技术特点及多元应用场景剖析
算法
Brianna Home18 小时前
从零到一:用Godot打造2D游戏《丛林探险》
算法·游戏·性能优化·游戏引擎·bug·godot·动画
小欣加油18 小时前
leetcode 143 重排链表
数据结构·c++·算法·leetcode·链表