STM32之串口通信
一、两台电脑间实现串口通信
1.实验准备
准备两台电脑,两个usb转串口,四根杜邦线。
下载好串口调试助手,用于接收和发送显示文件。
2.实验过程
传输线路连接:
连线方式:3V3-3V3,GND-GND,TXD-RXD,RXD-TXD,连接完毕之后将两个USB转TTL分别插上两个电脑上。实物演示图如下:
在发送电脑上打开串口调试助手sscom,开启串口,选择串口,设置波特率为115200,选择打开图片文件,选择完后出现下图
同时在另一个接收电脑打开串口调试助手sscom,开启串口,选择串口,设置波特率为115200
接受电脑接受情况:
保存:
3.分析
理论传输时间=(文件大小*8)/波特率,则上面图片理论传输时间11.11秒,而实际传输时间为13.625秒。
实际传输时间比理论传输时间要长一些,分析原因,可能是传输时,每隔一段字节就会插入一段延时,也可能是由于在传输过程中出现丢包、错误等重传现象导致。
二、串口通信常用寄存器及相关库函数
1.相关寄存器
USART_SR(状态寄存器)
USART_DR(数据寄存器)
USART_BRR(波特率寄存器)
USART_CR1(控制寄存器1)
其中状态寄存器在使用中经常用到位6(TC)以及位5(RXNE)
具体功能如图所示:
数据寄存器主要使用后8位
具体功能如图所示:
2.常用相关库函数
void USART_Init(); //串口初始化:波特率,数据字长,奇偶校验,硬件流控以及收发使能
void USART_Cmd();//使能串口
void USART_ITConfig();//使能相关中断
void USART_SendData();//发送数据到串口,DR
uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据
FlagStatus USART_GetFlagStatus();//获取状态标志位
void USART_ClearFlag();//清除状态标志位
ITStatus USART_GetITStatus();//获取中断状态标志位
void USART_ClearITPendingBit();//清除中断状态标志位
三、串口配置一般步骤
1.串口时钟使能,GPIO时钟使能
代码如下:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
2.GPIO端口模式设置
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_IN_FLOATING;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
3.编写中断处理函数
新建一个子函数编写中断处理函数,其中中断处理函数的名称已经在startup_stm32f10x_hd.s中定义,只需要在该文件中找到USART1所对应的中断处理函数的名称即可。
void USART1_IRQHandler(void)
{
u8 dat;
if(USART_GetITStatus(USART1,USART_IT_RXNE))//获取中断状态标志位
{
dat = USART_ReceiveData(USART1);//接受数据,从DR读取接受到的数据
USART_SendData(USART1,dat);//发送数据到串口,DR
}
}
总结
总体来说因为初学STM32函数调用还是不熟练,但是已经掌握一些技巧,并且逐渐可以自行查阅数据手册编写代码。学海无涯,孰能生巧,希望通过不断练习可以掌握STM32。
作者:K1wel