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

目录

一、实验目的

二、实验要求

[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 仿真乱码、数据接收失败等问题的过程中,学会了排查时钟源配置、数据格式设置等常见故障,提升了问题解决能力。

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


相关推荐
Miuney_MAX10 小时前
【单片机】之HC32F460中断向量选择
单片机·嵌入式硬件
猫猫的小茶馆15 小时前
【ARM】ARM的介绍
c语言·开发语言·arm开发·stm32·单片机·嵌入式硬件·物联网
猫猫的小茶馆15 小时前
【PCB工艺】数模电及射频电路基础
驱动开发·stm32·单片机·嵌入式硬件·mcu·物联网·pcb工艺
点灯小铭15 小时前
基于单片机的智能药物盒设计与实现
数据库·单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
梓德原16 小时前
【基础】详细分析带隙型稳压电路的工作原理
单片机·嵌入式硬件·物联网
国科安芯17 小时前
航天医疗领域AS32S601芯片的性能分析与适配性探讨
大数据·网络·人工智能·单片机·嵌入式硬件·fpga开发·性能优化
小李做物联网18 小时前
【物联网毕业设计】60.1基于单片机物联网嵌入式项目程序开发之图像厨房监测系统
stm32·单片机·嵌入式硬件·物联网
贝塔实验室19 小时前
新手如何使用Altium Designer创建第一张原理图(三)
arm开发·单片机·嵌入式硬件·fpga开发·射频工程·基带工程·嵌入式实时数据库
@good_good_study19 小时前
STM32 ADC多通道采样实验
stm32·单片机·嵌入式硬件
Darken0319 小时前
什么是“位带”?;在STM32单片机中有什么作用?
stm32·单片机·嵌入式硬件