STM32的USART窗口通信
目的:STM32的USART窗口通讯程序,要求:
1)设置波特率为115200,1位停止位,无校验位。
2)STM32系统给上位机(win10)连续发送“hello windows!”,上位机接收程序可以使用“串口调试助手“,也可自己编程。
3)当上位机给stm32发送“Stop,stm32”后,stm32停止发送。
理论
原理图
串口
串口是串行接口 (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线,同时接到电脑上。
2、配置下载环境
点击魔术棒之后,选择Debug,由于我用的下载线是ST-Link,所以选择我自己使用的就可以。
然后选择setting,设置自己用的串口信息。这里我的串口线与下载线已经拔掉,所以显示NO ST-Link detected
Flash Download中添加第一个
之后就可以下载到自己的核心版中了。
下载之后打开自己的野火调试助手,就可以看到这次的实现结果演示了。
结果演示
打开窗口之后的调试结果,串口一直输出“Hello Windows!”
输入Stop,stm32之后输出停止
代码
这里就只写出主函数的代码,具体的自己可以去看。
链接: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编程,因此会有许多的漏洞等等,多多指正!!