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

相关推荐
Yunfeng Peng2 小时前
2- 十大排序算法(希尔排序、计数排序、桶排序)
java·算法·排序算法
bot5556663 小时前
“企业微信iPad协议”凌晨沉默实验:当群发接口只剩心跳声
算法
郝学胜-神的一滴3 小时前
深入理解 C++ 中的 `std::bind`:功能、用法与实践
开发语言·c++·算法·软件工程
努力学习的小廉3 小时前
我爱学算法之—— 模拟(上)
c++·算法
Keying,,,,3 小时前
秋招算法记录 | 排序算法整理 | 直接选择、直接插入、冒泡、快排、希尔排序
数据结构·python·算法·排序算法
静若繁花_jingjing3 小时前
牛客算法题_二叉树
算法
XINVRY-FPGA3 小时前
XA7A75T-1FGG484Q 赛灵思 Xilinx AMD Artix-7 XA 系列 FPGA
嵌入式硬件·fpga开发·车载系统·云计算·硬件架构·硬件工程·fpga
仰泳的熊猫3 小时前
LeetCode:496. 下一个更大元素 I
数据结构·c++·算法·leetcode
沉在嵌入式的鱼4 小时前
STM32--大功率mos管驱动模块
stm32·单片机·mos管