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

相关推荐
SmartRadio10 分钟前
在CH585M代码中如何精细化配置PMU(电源管理单元)和RAM保留
linux·c语言·开发语言·人工智能·单片机·嵌入式硬件·lora
数据大魔方25 分钟前
【期货量化实战】螺纹钢量化交易指南:品种特性与策略实战(TqSdk完整方案)
python·算法·github·程序员创富·期货程序化·期货量化·交易策略实战
qq_411262421 小时前
纯图像传感器(只出像素),还是 Himax WiseEye/WE1/WE-I Plus 这类带处理器、能在端侧跑模型并输出“metadata”的模块
人工智能·嵌入式硬件·esp32·四博智联
不脱发的程序猿1 小时前
嵌入式开发中C++内存泄漏的场景与解决办法
单片机·嵌入式硬件·嵌入式
至为芯1 小时前
IP5326至为芯支持TYPE-C协议的2.4A充放电移动电源方案芯片
单片机·嵌入式硬件
jimy11 小时前
C语言里面的中断程序:“exit()”和“return返回”
c语言
小何code1 小时前
STM32入门教程,第10课(下),Keil调试模式
stm32·单片机·嵌入式硬件
SmartRadio1 小时前
进一步优化CH585M的低功耗模式
c语言·开发语言·单片机·嵌入式硬件·物联网
千金裘换酒1 小时前
LeetCode 删除链表的倒数第N个结点
算法·leetcode
XjtDZ1 小时前
CS5715E异步升压DC-DC控制器
单片机·嵌入式硬件·智能音箱