【STM32】串口部分
串口通信协议
由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_