欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

STM32的USART窗口通信

程序员文章站 2024-02-22 09:56:46
...

目的:STM32的USART窗口通讯程序,要求:

1)设置波特率为115200,1位停止位,无校验位。
2)STM32系统给上位机(win10)连续发送“hello windows!”,上位机接收程序可以使用“串口调试助手“,也可自己编程。
3)当上位机给stm32发送“Stop,stm32”后,stm32停止发送。

理论

原理图
STM32的USART窗口通信
STM32的USART窗口通信
串口

串口是串行接口 (Serial Interface)的简称,它是指数据一位一位地顺序传送,其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。一条信息的各位数据被逐位按顺序传送的通讯方式称为串行通讯。串行通讯的特点是:数据位的传送,按位顺序进行,最少只需一根传输线即可完成;成本低但传送速度慢。串行通讯的距离可以从几米到几千米;根据信息的传送方向,串行通讯可以进一步分为单工、半双工和全双工三种。

协议

所谓协议,就是通信双方约定好的规定,通信双方只有遵守这个规定才能够完成任务。举个栗子就是周幽王烽火戏诸侯,双方约定好以烽火为信号进行通信,但是愚蠢的周幽王为博美人褒姒一笑破坏了这个规定,最后付出的代价是惨重的。可见,通信双方只有遵守协议才能够完成通信。

时序

时序就是协议的实际化,它实质上是一些列的脉冲信号,通信双方将信息按照预先定好的规定(协议)转换成一系列的脉冲信号,通过总线发送给接收方,接收方再将接收到的数据按照规定进行解析,从而得到发送方发送过来的数据。

上位机

上位机和下位机其实是一个相对的概念,上位机指的是可以直接发出操控命令的计算机,一般指PC机,能够显示各种信号变化(液压,水位,温度等),能够将信息直接传递给人。下位机是直接控制设备获取设备状况的计算机,一般是PLC/单片机single chip microcomputer/slave computer/lower computer之类的,下位机需要PC机来对其进行控制。

关于USART

stm32有丰富的通讯外设,USART(Universal Synchronous Asynchronous Receiver Transmitter)、SPI(Serial Peripheral interface)、I2c(Inter-Integrated Circuit)、CAN(Controller Area Network),因为stm32有完整的且强大的固件库,这使得配置串口的难度大大降低了,和用软件IO口模拟通信时序相比,硬件的支持可以大大提高通信的速率、大大降低出错的概率,从而提高了通信的质量和效率。用IO口模拟USART难度较大,它对延时要求比较苛刻,且出错的概率较大,所以一般很少用IO口模拟USART。IO口模拟I2c比较常见,由于I2c的最高通信速度只有3.4M/s,单片机的IO口速度可以完美驾驭。由于SPI多用于一些较高速的通信,例如LCD、OLED、TFT显示器的写入,EEPROM (Electrically Erasable Programmable read only memory)的写入和读取,用IO口模拟效果不是很理想,所以建议使用硬件自带接口。

实验实现

1、将核心版接上下载线ST–Link和usb转TTL线,同时接到电脑上。

STM32的USART窗口通信
2、配置下载环境
点击魔术棒之后,选择Debug,由于我用的下载线是ST-Link,所以选择我自己使用的就可以。
STM32的USART窗口通信
然后选择setting,设置自己用的串口信息。这里我的串口线与下载线已经拔掉,所以显示NO ST-Link detected
STM32的USART窗口通信
Flash Download中添加第一个
STM32的USART窗口通信
之后就可以下载到自己的核心版中了。
STM32的USART窗口通信
下载之后打开自己的野火调试助手,就可以看到这次的实现结果演示了。

结果演示

打开窗口之后的调试结果,串口一直输出“Hello Windows!”

STM32的USART窗口通信
输入Stop,stm32之后输出停止

STM32的USART窗口通信

代码

这里就只写出主函数的代码,具体的自己可以去看。
链接:https://pan.baidu.com/s/1YWs7ICEKiIXXb_B9jpJz0g
提取码:yl97

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include <stdlib.h>
int h=1;
 int main(void)
 { 
    
    
  char stop[]={'S','t','o','p',',','s','t','m','3','2'};
 	u16 t;  
	u16 len;	
	u16 times=0;
	
	delay_init();	    	 //ÑÓʱº¯Êý³õʼ»¯	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //ÉèÖÃNVICÖжϷÖ×é2:2λÇÀÕ¼ÓÅÏȼ¶£¬2λÏìÓ¦ÓÅÏȼ¶
	uart_init(115200);	 //´®¿Ú³õʼ»¯Îª115200
 	LED_Init();			     //LED¶Ë¿Ú³õʼ»¯
	KEY_Init();          //³õʼ»¯Óë°´¼üÁ¬½ÓµÄÓ²¼þ½Ó¿Ú
	
 	while(h)
	{
		if(USART_RX_STA&0x8000)
		{		   
			len=USART_RX_STA&0x3fff;//µÃµ½´Ë´Î½ÓÊÕµ½µÄÊý¾Ý³¤¶È
			
			for(t=0;t<len&&USART_RX_BUF[t]==stop[t];h++,t++)
				{
				if(h>=10) 
				{h=0;break;}
				}
			for(t=0;t<len;t++)
			{ 
				
				
				while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//µÈ´ý·¢ËͽáÊø
			}
			printf("\r\nÊÕµ½Í£Ö¹\r\n");//½áÊøÖ®ºóÊä³öµÄÄÚÈÝ
			USART_RX_STA=0;
		}
		else
		{
			times++;
			if(times%100==0)
			{
				printf("hello windows!\r\n");
			}
			delay_ms(10);   
		}
	}	 
 }

总结

在实验中遇到了各种各样的问题,最多的就是下载程序的时候,会出现各种各样的问题。在接入ST-LINK的时候需要添加相应的驱动程序,而且在程序中配置的时候一定要根据自己使用的工具详细配置,遇到问题最简单的方法就是百度,通过别人的经验避免掉入许许多多的坑中。
本人并不熟悉stm32编程,因此会有许多的漏洞等等,多多指正!!