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

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

由上图可知串口在没有传输数据的时候,保持为高电平状态
如上图所示串口的每一帧数据一般有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:TxGPIO_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:RxGPIO_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;//波特率:115200USART_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串口经典电路图