关于使用stm32核心板进行USART串口通信的实验

一、关于串口通信

1.串口通信

串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息。
串行接口是一种可以将接收来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接收的串行数据流转换为并行的数据字符供给CPU的器件。

2.USART

通用同步异步收发器(Universal Synchronous Asynchronous Receiver and Transmitter)是一个串行通信设备,可以灵活地与外部设备进行全双工数据交换。有别于 USART 还有一个UART(Universal Asynchronous Receiver and Transmitter),它是在 USART 基础上裁剪掉了同步通信功能,只有异步通信。简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时用的串口通信基本都是 UART。

二、USART串口通信程序

1.准备工作

在进行实验前,我们需要一个USB转串口的驱动。
将stm32核心板和USB串口转接线在面包板上进行连接,其中连接线的RXD连接到A9引脚,TXD连接到A10引脚,GND和3V3于核心板上的引脚对应连接。
在这里插入图片描述
在这里插入图片描述
连接好以后将USB插入电脑,就可以在电脑的设备管理器中查看对应驱动了
在这里插入图片描述
如果没有就需要在网上去下载一个驱动进行安装

2.实验要求

  • 设置波特率为115200,1位停止位,无校验位。
  • STM32系统给上位机(win10)连续发送“hello windows!”。
  • 当上位机给stm32发送“stop,stm32”后,stm32停止发送。

3.实验器材

  • stm32核心板
  • 面包板
  • USB转TTL转接线
  • 野火串口调试程序
  • 普通的程序烧录软件
  • 杜邦线若干

4.实验过程

本次实验所使用的代码是基于STM32串口通信USART学习笔记来实现的
为满足本次实验的要求,需要在源代码的基础上进行修改。

首先,为了使stm32系统给上位机连续发送“hello windows”,我在主函数中设置了一个while循环用来实现此功能,同时设置了一个延迟函数来控制发送的速率(如果不设置,串口调试程序可能在打开串口后卡死)。

#include "NVIC.h"
#include "User_USART.h"
#include "stm32f10x.h"
void delay(u16 num)
{
  u16 i,j;
  for(i=0;i<num;i++)
    for(j=0;j<0x800;j++);
}

int main(void)
{
	User_USART_GPIO_Config();
	User_NVIC_Config();
	User_USART_Config();
	User_UART_Send_String(USART1, "test!\n");
	while(1)
	{
		User_UART_Send_String(USART1, "hello windows!\n");
		delay(500);
	}
}

为了使上位机给stm32发送“stop,stm32”后,stm32停止发送,需要将中断函数进行修改。
原始代码中,他定义了一个8bit变量temp,然后通过 if语句和USART_GetFlagStatus来检查数据是否发送完成。如果为真,则将接收的数据存入temp中,然后又将其发送出去。
为了使stm32能接收到指定内容后中断,我这里通过设置一个数组来判断发送的数据,修改后的代码如下

int i=0;
void USART1_IRQHandler(void)
{
	uint8_t a[50];
	if(USART_GetFlagStatus(USART1, USART_IT_RXNE) != RESET)
	{
		a[i++]=USART_ReceiveData(USART1);
	}
	if(a[0]=='s'&&a[1]=='t'&&a[2]=='o'&&a[3]=='p'&&a[4]==','&&a[5]=='s'&&a[6]=='t'&&a[7]=='m'&&a[8]=='3'&&a[9]=='2')  
		while(1);
}

在完成上面两步后,我尝试将代码烧录进stm32芯片,看能否运行。通过串口调试程序发现,接收到的数据出现问题,但与此同时同时中断可以实现。因此我判断,问题应该是出在发送上面。
在这里插入图片描述
在浏览野火的《零死角玩转STM32F103—指南者》后,用书中193页中提到的以下代码替换了原始代码中有关发送字符串的代码。

//向串口发送一个字符串数据,即可以发送包含多个字节的数据,char类型为8bit,其字符串中的每个字符都可用一个int数表示,即ASCII标准
void User_UART_Send_String( USART_TypeDef * pUSARTx, char *str)
{
	unsigned int k=0;
	do 
		{
		User_USART_Send_Byte( pUSARTx, *(str + k) );
		k++;
		} 
	while (*(str + k)!='\0');
/* 等待发送完成 */
	while (USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET) 
	{
	}
}

功能成功实现
在这里插入图片描述

三、参考资料

《零死角玩转 STM32F103—指南者》

STM32串口通信USART学习笔记

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值