串口通信协议

由Tx(transmit)与Rx(receive)两个引脚进行数据传输

通过串口发送十进制数字27,转化为二进制数字0001 1011

D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 1 1 0 1 1

1.当串口处于空闲状态时,默认为高电压,由高电压变为低电压为起始位,开始数据传输

2.串口发送数据,从最低位D0开始发送

1 1 0 1 1 0 0 0

通过串口发送字符串“Hello”,通过查阅ASCII码,H对应0x48,转化为二进制数字0100 1000

串口只能发送二进制数,而字符串是由一个一个字符组成的,用ASCII码表示一个字符,一个字符占据一个字节,串口一次可以发送一个字节(8位)

“H”

D7 D6 D5 D4 D3 D2 D1 D0
0 1 0 0 1 0 0 0

从低位D0开始发送

0 0 0 1 0 0 1 0

串口数据帧:

发送方数据校验位设置1、0,使数据中1的个数分别为奇数个或偶数个,对应奇校验、偶校验

接收方对数据个数进行检验

设置数据帧格数参数:

        1.数据位(8、9)

        2.停止位(0.5、1、1.5、2)

        3.校验位(奇偶)

USART

发送和接收数据,原理是移位寄存器的串并转换

发送数据,将要发送的数据写到发送数据寄存器里(并行),然后将数据从低位到高位一位一位发送出去(串行)。

接收数据,一位一位从高位接受发送的数据(串行),最后得到发送的数据,转送到接受数据寄存器,进行接收(并行)。

USART设置波特率

波特率:每秒最多传输的位数。

USART初始化  (设置波特率、数据位、停止位、校验位、模式 USART_RX\TX)

void USART1_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE); //开启USART1时钟
	
	USART_InitTypeDef USART_InitStruct;
	USART_InitStruct.USART_BaudRate=115200;//波特率设置115200
	USART_InitStruct.USART_Mode=USART_Mode_Rx | USART_Mode_Tx;//收发双向
	USART_InitStruct.USART_Parity=USART_Parity_No;//无校验位
	USART_InitStruct.USART_StopBits=USART_StopBits_1;//一位停止位
	USART_InitStruct.USART_WordLength=USART_WordLength_8b;//数据位长度位8位
	USART_Init(USART1,&USART_InitStruct);
}

引脚初始化

通用:直接通过CPU控制引脚电平模式

复用:通过其他模块间接控制引脚电平模式

STM32F103RCT6引脚分布图:STM32F103RCT6引脚功能及使用_stm32f103rct6里pa0-wkup作用-CSDN博客

    //不使用重映射  rx PA9   tx  PA10
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

    GPIO_InitTypeDef GPIO_InitStruct;
	
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_9;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10;
	GPIO_Init(GPIOA,&GPIO_InitStruct);
	



	//使用重映射
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
	
	GPIO_PinRemapConfig(GPIO_Remap_USART1,ENABLE);
	//rx PB6  tx PB7
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB ,ENABLE);
	GPIO_InitTypeDef GPIO_InitStruct;
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6;
	GPIO_InitStruct.GPIO_Speed=GPIO_Speed_10MHz;
	GPIO_Init(GPIOB,&GPIO_InitStruct);
	
	GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU;
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_7;
	GPIO_Init(GPIOB,&GPIO_InitStruct);

通过USART发送数据

TxE:发送数据寄存器标志位

TC:发送完成标志位

void My_USART_SendBytes(USART_TypeDef *USARTx,uint8_t *bytes,uint16_t size)
{
	for(uint32_t i = 0;i<size;i++)
	{
		while (USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
		USART_SendData(USART1,bytes[i]);
	}
	while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
}

uint8_t data[]={1,2,3,4,5};

My_USART_SendBytes(USART1,data,5);

作者:Ming_sun_

物联沃分享整理
物联沃-IOTWORD物联网 » 【STM32】串口部分

发表回复