STM32L152RE实现串口发送及接收数据

本文主要讲解用keil软件实现USART串口发送及接收数据,默认读者keil环境已经配好,且头文件已正确引入,如出现编译错误以及st-link下载问题,请自行百度解决。

串口发送和接收数据是一件看起来简单,做起来比较繁琐的事情,相信大家对代码的理解都没问题,主要是被一些硬件及软件的操作困住了。不过为了使教程更加明了,还是先讲解一下相关的代码吧!

一、PC发送数据到串口

一、代码部分
1.引入头文件
#include "stm32l1xx_gpio.h"
#include "stm32l1xx_rcc.h"
#include "stm32l1xx.h"
#include "stm32l1xx_usart.h"
#include "misc.h"

2.GPIO初始化

这里除了激活USART1两根管脚的复用功能,我们还激活了PA5,PA6,PA7作为七色灯的管脚,七色灯需要用杜邦线在板子上对应的接口连一下,嫌麻烦的同学可以改成激活流水灯的管脚,对于灯的操作大家应该很熟悉了,这里就不再赘述。

void GPIO_Configuration(void)
{
	RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
	GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_40MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);

	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;
	GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL ;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
	
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
	GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_40MHz;
	GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
}
3.NVIC初始化
void NVIC_Configuration(void)
{
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_Init(&NVIC_InitStructure);
}

4.USART1初始化
void USART1_Configuration(void)
{
	USART_InitTypeDef USART_InitStructure;
	USART_ClockInitTypeDef USART_ClockInitStructure;
	USART_InitStructure.USART_BaudRate=115200;
	USART_InitStructure.USART_WordLength=USART_WordLength_8b;
	USART_InitStructure.USART_StopBits=USART_StopBits_1;
	USART_InitStructure.USART_Parity=USART_Parity_No;
	USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
	
	USART_Init(USART1,&USART_InitStructure);
	USART_Cmd(USART1,ENABLE);
	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
}

5.main函数
int main(void)
{
	GPIO_Configuration();
	USART1_Configuration();
	NVIC_Configuration();
	while(1)
	{
	}
}

6.亮灯相关函数(用流水灯的同学可以直接激活流水灯)

不用流水灯的话,打开stm32l1xx_it.c文件,将代码写在其中


#include "stm32l1xx_gpio.h"

#define PA5 GPIOA,GPIO_Pin_5
#define PA6 GPIOA,GPIO_Pin_6
#define PA7 GPIOA,GPIO_Pin_7
void light(int i)
{
	switch(i)
	{
		case 0:GPIO_SetBits(PA5);break;
		case 1:GPIO_SetBits(PA6);break;
		default:GPIO_SetBits(PA7);break;
	}
}
void unlight(int i)
{
	switch(i)
	{
		case 0:GPIO_ResetBits(PA5);break;
		case 1:GPIO_ResetBits(PA6);break;
		default:GPIO_ResetBits(PA7);break;
	}
}
void style(int i)
{
	
	int j;
	int a[7][3]={
		1,1,1,
		1,0,0,
		0,1,0,
		0,0,1,
		1,1,0,
		1,0,1,
		0,1,1};
	for(j=0;j<3;j++)
	{
		if(a[i][j])
			light(j);
		else
			unlight(j);	
	}
}
7.中断响应函数

打开stm32l1xx_it.c文件,将代码写入其中,其中style是亮灯函数,如果用流水灯,请改变相应的判断。这里我们每个字符都能出发亮灯,只不过任意相邻的7个字符所亮的灯不一样,大家也可以改成自己喜欢的亮灯方式。


#include "stm32l1xx_usart.h"
void USART1_IRQHandler(void)
{
 int buf1=0;
 if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
 {
	 buf1=USART_ReceiveData(USART1);
	 style(buf1%7);
	 USART_ClearITPendingBit(USART1,USART_IT_RXNE);
 }
}

至此,代码部分已经全部完成,这个还是很简单的,大部分同学都已经独立完成,下面让我们看一看硬件连接都有哪些注意事项吧!

二、硬件的连接

首先,我们需要知道哪个是串口模块

1.串口模块

长这个样子
串口

2.串口与开发板连接方式

GND接地,VCCIO接3V(也可以不接),TXD接RX,RXD接TX,这是板子上接串口的位置。
开发板
线不要连错,最好使用三四根不同颜色的杜邦线,好区分。
连接

3.串口、开发板与电脑连接

串口的USB接口是要接到电脑上的,在SSCOM发送或接受数据的时候,都是通过串口的USB口发收的。当然开发板的USB也要连电脑,不然没法烧写程序。
注意串口的驱动程序PL2303_Prolific_DriverInstaller_v130需要安装,安装后可能还需要重启一下电脑。可以右击电脑开始按钮找到设备管理器,打开之后找到图示端口
设备管理器
双击打开,之后更新驱动程序,找到串口的驱动程序并更新。
驱动程序
更新可能需要重启,如果更新成功,会显示,如下界面,这时你的驱动程序就没有问题啦!
更新成功

4.七色灯连接(用流水灯不用连这个)

将七色灯的三个短管脚连在PA5,PA6,PA7上,长管脚接地。如果有四根连在一起其中有两根线反着的杜邦线,就更方便了。
杜邦线
如图所示,黑线和白线是反着的。
灯
长脚为接地管脚,接白线。

通过查看底板原理图可以知道,底板上,GND,PA5,PA6,PA7相邻,接到对应的位置上灯接板
七色灯就接好啦!

三、SSCOM的使用

从keil把程序烧写到板子中,连好串口USB之后,打开SSCOM软件,配置如图,选择设备管理器中对应的串口号之后,点击打开串口。
sscom配置
从字符输入框发送一个字符,这时应该会有对应的灯亮,发送另一个字符会改变颜色,如图
1
2

四、python的应用

python可以用spyder,也可以用命令行,由于我自己用的是命令行,就讲一下命令行怎么实现吧!

1.官网下载python环境

https://www.python.org/ftp/python/3.8.1/python-3.8.1-amd64.exe
下载后安装。打开安装目录(注意是安装目录不是安装包下载的目录)
py目录

2.配置环境

右键属性,复制python.exe的路径
py属性
打开设置,查找环境
环境

编辑系统环境变量,找到环境变量(右下角),打开
环境变量
在下面的系统变量找到PATH,双击
path
点右边栏的新建,将python.exe的路径粘贴过去,另外,还要添加一个pip.exe的路径,它在Scripts文件夹里。
pip

环境变量添加
添加完毕后别忘了挨个点确定。

3.命令行操作

开始键输入cmd,打开命令行操作界面,输入python,回车,应该出现如图提示。如果没有,请再次打开环境设置看看path中的路径是否已经添加,添加之后重新打开命令行。如果有,再退出输入pip检查一下。
py
pip

4.安装pyserial库

输入pip install pyserial,回车等待安装,注意联网,需要等待一段时间,安装完毕会有文字提示。

5…py文件代码

记事本新建文件,将代码写入文件中
注意第三行的串口名称,不同的电脑可能不一样,要根据设备管理器上看到的串口的名称改一下

import serial
try:
    portx='COM4'
    bps=115200/2
    timex=5
    ser=serial.Serial(portx,bps,timeout=timex)
    x=int(input('输入循环次数:'))
    for i in range(0,x):
        ch=input('输入一个字符:')
        result=ser.write(ch.encode('gbk'))
    ser.close()
except Exception as e:
    print('error:',e)

保存的时候,注意把文件后缀名保存为.py
PY.PY

6.用命令行运行.py程序

将.py文件保存到桌面,然后打开命令行,输入cd desktop进入到桌面,然后输入python py.py运行程序
命令行运行
运行结果如下
运行结果
如果报错,有以下可能

  1. 串口没有插好
  2. 该端口被其他应用(如sscom)占用,需要先关掉应用之后再运行程序。
  3. 端口名称错误,需要根据设备管理器端口名称修改
    出错
    另附pyserial网源代码【Python的串口通信(pyserial) - _樛木 - 博客园】https://www.cnblogs.com/Zhengnengjin/p/10684960.html

PC发送数据到串口点灯部分到此结束

二、串口发送数据到PC

1.查询方式发送

只需要在第一个的基础上稍作添加即可。

1.添加发送函数
void USART_SendString(uint8_t * in)
{
	for(uint8_t i=0;in[i]!='\0';i++)
	{
		while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
		USART_SendData(USART1,in[i]);
	}
}
2.修改main函数
int main(void)
{
	unsigned char str[]="ABCDEFG";
	GPIO_Configuration();
	USART1_Configuration();
	USART_SendString(str);
	
	while(1);
}

即可

2.中断方式发送
1.修改USART初始化函数
void USART1_Configuration(void)
{
	USART_InitTypeDef USART_InitStructure;
	USART_InitStructure.USART_BaudRate=115200;
	USART_InitStructure.USART_WordLength=USART_WordLength_8b;
	USART_InitStructure.USART_StopBits=USART_StopBits_1;
	USART_InitStructure.USART_Parity=USART_Parity_No;
	USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;
	
	USART_Init(USART1,&USART_InitStructure);
	USART_Cmd(USART1,ENABLE);
	USART_ITConfig(USART1,USART_IT_TXE,ENABLE);
}
2.修改主函数
int main(void)
{
	GPIO_Configuration();
	NVIC_Configuration();
	USART1_Configuration();
	while(1);
}

3.写中断服务函数

打开stm32l1xx_it.c文件,写入

uint8_t CmdBuffer[3]={'a','b','c'};
uint8_t TxIndex=0;
void USART1_IRQHandler(void)
{
 
 if(USART_GetITStatus(USART1,USART_IT_TXE)==SET)
 {
	 USART_SendData(USART1,CmdBuffer[TxIndex++]);
	 if(TxIndex==0x03)
		 USART_ITConfig(USART1,USART_IT_TXE,DISABLE);
 }
 
}
3.相关操作

先打开sscom软件,打开相应串口之后,再从keil将程序烧入开发板,烧入之后立即看到sscom的屏幕上出现接收的字母。

接收字母

至此,用串口发送和接收数据就都实现啦!如果大家对具体步骤有疑问,欢迎批评指出

  • 11
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值