嵌入式系统-实验三——串口通信实验

目录

一、实验目的

二、实验要求

[2.1 实验原理](#2.1 实验原理)

[2.2 实验软件](#2.2 实验软件)

三、实验过程

[3.1 代码开发](#3.1 代码开发)

[3.2 原理图设计](#3.2 原理图设计)

四、实验记录与总结

[4.1 核心代码理解](#4.1 核心代码理解)

[4.2 实验结果](#4.2 实验结果)

[4.3 问题与想法](#4.3 问题与想法)

1、问题

2、想法

五、小结


一、实验目的

1、掌握STM32F103串口数据接收程序设计流程;

2、熟悉STM32固件库的基本使用。

二、实验要求

2.1 实验原理

1、串口通信的主要方式包括查询和中断,本实验可选择其中一个方式进行实验;

2、STM32F103R6通过串口接收数据,每接收到一个字节,立即向对方发送一个相同内容的字节,并把该字节的十六进制码显示在两位数码管上。

2.2 实验软件

电脑、Keil uVision5软件、Proteus 8 Professional软件。

三、实验****过程

3.1 代码开发

按照书本中实验流程在Keil中完成串口查询或者中断方式实验的代码开发。

3.2 原理图设计

在Proteus中完成原理图的设计,下图为串口通信实验原理图。

图1 串口通信实验原理图

四、实验记录与总结

4.1 核心代码理解

根据本次实验需求,主要处理两个部分的逻辑:一是串口收发逻辑,二是收到数据解析后点亮对应数码管显示。同时,这两部分逻辑进一步细分:对于串口收发逻辑:串口配置初始化、串口发送单字节数据、串口接收单字节数据;对于数据解析与数码管显示:数码管初始化配置、数据解析、写入控制端口点亮相应LED实现数码管显示。

整体而言,本次我使用轮询方式进行串口数据发送,使用中断方式进行串口数据接收,因此在串口配置初始化部分会涉及到串口端口配置、串口配置以及相关中断优先级配置等内容,因此必然需要创建GPIO、USART、NVIC初始化的结构体对象,用于后续相关参数配置和初始化。然后所有外设控制首先需要开启相应的时钟,控制外设工作频率使其稳定工作,本次使用的外设即GPIO和串口USART,代码如图2所示。

图2 结构体对象创建及开启时钟

首先对串口端口进行初始化。根据提供电路原理图知本次使用的串口引脚为PA9、PA10,对应TX与RX,查看手册可知使用的为USART1。由于TX进行发送,即要不断对外输出0或1,因此PA9端口配置为推挽输出,考虑到此时PA9并非作为标准IO口,而是复用串口功能,因此最终配置为复用推挽输出,速率10MHz即可;同理,RX进行接收,即要不断等待外部输入0或1,因此PA10端口配置为浮空输入即可,串口端口核心配置代码如图3所示。

图3 串口端口核心配置代码

其次是对串口功能进行配置。根据串口通信协议数据格式及相关要求可知,对于串口配置主要设置串口波特率、数据长度、停止位位数、收发模式、校验位、硬件流控等。因为本次实验需要同时进行收发,因此串口模式为既收又发的模式,一般使用数据长度使用8位,停止位1位,校验即奇偶校验一般也不使用,硬件流控不开启,然后波特率可通过传参手动设置,代码中对串口结构体参数配置后进行初始化即可,如图4所示。

图4 串口功能配置核心代码

紧接着就是配置一下串口1接收中断的优先级,也就是NVIC,然后启动接收中断和串口工作。由于本次只涉及到接收中断这一个,因此对于优先级配置何值没有太大影响,所以我配置的抢占优先级和子优先级均为2,然后使能NVIC并将配置参数放入结构体初始化,最后启动串口接收中断以及串口总使能位,代码如图5所示。

图5 中断优先级配置及串口使能

然后是数据发送部分。只需要调用串口1的发送数据函数,传入待发送的单字节数据,并等待发送完成即可,代码如图6所示。

图6 发送单字节数据

接着是数据接收部分。本次使用接收中断,因此是当收到数据时,会触发串口1接收中断,进入中断处理程序执行相应逻辑,因此重写中断处理程序,其中逻辑即接收非空时将数据用全局变量rx_data记录,然后清除中断标志位即可。当然,我定义了一个全局接收状态标志变量isReceive,这里会被置1,进而执行接收后回显收到数据操作,代码如图7所示。

图7 中断接收数据

接着是数据回显与数据解析并显示。前面提到我使用了接收状态标志isReceive变量,即当isReceive置1时执行回显逻辑,然后对状态位清零避免无休止进入。

在解析数据前,先准备好数码管显示0-9、A-F的共阳极字段码(也就是各个数字对应输入相应LED控制端口的0或1组合),使用数组按照数字顺序存储,便于建立显示数字与输入相应端口端口电平的映射关系。然后定义变量display_word记录解析得到的16位二进制。

由于需求为显示发送的8位二进制的16进制数,因此我的逻辑为截断接收的16进制数为两个单独的4位二进制数,也就是我要分别显示在两个数码管的十进制数值。又因为显示在数码管上也就是点亮对应的LED,而两个数码管一共恰好16个LED,根据电路连接可知恰好使用了GPIOB的全部端口,因此只需要将这俩数值对应的8位字段码进行顺序拼接后写入GPIOB的所有端口位即可,具体就是把分离的两个数值作为数码管字段码数组索引得到的对应8位二进制,然后放在高8位写入的就左移8位并与另外8位二进制进行位或即可拼接完成,然后存在display_word中,最后使用GPIO_Write函数写入即可,代码如图8所示。

图8 数据接收与解析显示

4.2 实验结果

在keil中编译代码完成后,将生成的,hex文件加载到protesu8.9中电路图的32芯片中,然后运行即可。对电脑端的串口助手设置好波特率9600(与程序设置波特率一致),然后设置收发数据格式为16进制后,发送数据可得如图9效果。

图9 程序运行结果

4.3 问题与想法

1、问题

(1)在进行proteus仿真串口收发时,收发数据出现乱码;

(2)发送数据后接收不到。

2、想法

(1)根据书上所述以及查询资料得知,proteus仿真stm32串口通信时需要手动配置一下系统初始化函数的时钟源,使用HIS内部时钟源8MHz,并根据proteus中对32芯片设置的时钟频率修改相应分频系数。

(2)就本次实验而言,发送数据前一定要检查串口助手收发的数据格式是否改成了16进制发送或接收,否则直接发送十六进制数会当成多字节数据或错误数据发生,导致单片机端接收单字节数据出错。


五、小结

通过本次串口通信实验,我熟练掌握了 STM32F103 串口接收程序的设计流程,深入理解了查询与中断两种通信方式的应用场景,能灵活运用轮询发送、中断接收的组合模式实现数据交互。

同时,我熟悉了 STM32 固件库中 GPIO、USART、NVIC 等核心外设的配置方法,掌握了串口初始化、波特率设置、中断优先级配置等关键步骤。在解决 Proteus 仿真乱码、数据接收失败等问题的过程中,学会了排查时钟源配置、数据格式设置等常见故障,提升了问题解决能力。

此外,通过代码编写与原理图设计的结合,加深了对嵌入式系统硬件与软件协同工作的理解,为后续复杂嵌入式项目开发奠定了坚实基础。


相关推荐
d111111111d2 小时前
STM32外设学习-串口数据包笔记-(程序)
笔记·stm32·单片机·嵌入式硬件·学习
----云烟----2 小时前
MCU单片机驱动WS2812
单片机·嵌入式硬件
ACP广源盛139246256733 小时前
GSV6127E#ACP#Type-C/DisplayPort 1.4/HDMI 2.0 到 MIPI CSI-2 混合转换器(带嵌入式 MCU)
单片机·嵌入式硬件·音视频
百***46454 小时前
SocketTool、串口调试助手、MQTT中间件基础
单片机·嵌入式硬件·中间件
GilgameshJSS5 小时前
STM32H743-ARM例程43-SD_IAP_FPGA
arm开发·stm32·fpga开发
Nuyoah11klay5 小时前
华清远见25072班单片机高级学习day1
单片机·嵌入式硬件·学习
2301_800399726 小时前
c snprintf sizeof遇到的问题
c语言·stm32
恒锐丰小吕6 小时前
EG3033 三相P/N MOS管栅极驱动芯片技术解析
单片机·嵌入式硬件
djxbbdjedhb7 小时前
软件按键消抖的几种方式
单片机·嵌入式硬件