本文主要讲解用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软件,配置如图,选择设备管理器中对应的串口号之后,点击打开串口。
从字符输入框发送一个字符,这时应该会有对应的灯亮,发送另一个字符会改变颜色,如图
四、python的应用
python可以用spyder,也可以用命令行,由于我自己用的是命令行,就讲一下命令行怎么实现吧!
1.官网下载python环境
https://www.python.org/ftp/python/3.8.1/python-3.8.1-amd64.exe
下载后安装。打开安装目录(注意是安装目录不是安装包下载的目录)
2.配置环境
右键属性,复制python.exe的路径
打开设置,查找环境
编辑系统环境变量,找到环境变量(右下角),打开
在下面的系统变量找到PATH,双击
点右边栏的新建,将python.exe的路径粘贴过去,另外,还要添加一个pip.exe的路径,它在Scripts文件夹里。
添加完毕后别忘了挨个点确定。
3.命令行操作
开始键输入cmd,打开命令行操作界面,输入python
,回车,应该出现如图提示。如果没有,请再次打开环境设置看看path中的路径是否已经添加,添加之后重新打开命令行。如果有,再退出输入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
6.用命令行运行.py程序
将.py文件保存到桌面,然后打开命令行,输入cd desktop
进入到桌面,然后输入python py.py
运行程序
运行结果如下
如果报错,有以下可能
- 串口没有插好
- 该端口被其他应用(如sscom)占用,需要先关掉应用之后再运行程序。
- 端口名称错误,需要根据设备管理器端口名称修改
另附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的屏幕上出现接收的字母。
至此,用串口发送和接收数据就都实现啦!如果大家对具体步骤有疑问,欢迎批评指出