串口通信实验(STM32)

一、 实验简介(实验目的)

使用 STM32F103 的串口来发送和接收数据。STM32F1 通过串口和上位机的对话,STM32F103 在收到上位机发过来的字符串后,原原本本的返回给上位机。


二、 实验设备(实验设备及用到的模块)

1.电脑:window10及以上

2.开发板名称:正点原子战舰V3 STM32F103开发板

3.模块名称:KEY模块,LED模块

4.数据通信方式及设备:串口通信


三、 实验原理(软硬件全面阐述)

1.芯片该部分工作原理

(1).按键部分对应芯片引脚

在战舰 STM32 开发板上的按键 KEY0 连接在引脚PE4 上、KEY1 连接在引脚PE3 上、KEY2 连接在引脚PE2 上、WK_UP 连接在引脚PA0 上。

(2).LED部分对应芯片引脚

在战舰 STM32 开发板上的LED0连接的引脚是PB5,LED1连接的引脚是PE5。

2.模块工作原理、电路图

(1).按键的STM32连接原理图

如上图电路图所示,KEY0、KEY1 和 KEY2 都接地都是是低电平有效,而 WK_UP接的是VCC3.3所以是高电平有效,并且外部都没有上下拉电阻,所以需要在 STM32 内部设置上下拉。

(2).LED的STM32连接原理图

通过位带操作 PB5 输出高低电平从而控制 LED0。

3.用到的库函数阐述

(1).串口时钟使能

串口是挂载在 APB2 下面的外设,所以使能函数为:

scss 复制代码
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1);

(2).串口复位

当外设出现异常的时候可以通过复位设置,实现该外设的复位,然后重新配置

这个外设达到让其重新工作的目的。一般在系统刚开始配置外设的时候,都会先执行复位该外设的操作。复位的是在函数 USART_DeInit()中完成:

arduino 复制代码
void USART_DeInit(USART_TypeDef* USARTx);//串口复位

比如我们要复位串口 1,方法为:

scss 复制代码
USART_DeInit(USART1); //复位串口 1

(3).串口参数初始化

串口初始化是通过 USART_Init()函数实现的

java 复制代码
void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);

(4).数据发送与接收

STM32 库函数操作 USART_DR 寄存器发送数据的函数是:

arduino 复制代码
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);

通过该函数向串口寄存器USART_DR 写入一个数据。

STM32 库函数操作 USART_DR 寄存器读取串口接收到的数据的函数是:

arduino 复制代码
uint16_t USART_ReceiveData(USART_TypeDef* USARTx);

通过该函数可以读取串口接受到的数据。

(5).串口状态

在我们固件库函数里面,读取串口状态的函数是:

scss 复制代码
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);

RXNE(读数据寄存器非空)以及 TC(发送完成)。例如要判断读寄存器是否非空(RXNE),操作库函数的方法是:

scss 复制代码
USART_GetFlagStatus(USART1, USART_FLAG_RXNE);

要判断发送是否完成(TC),操作库函数的方法是:

scss 复制代码
USART_GetFlagStatus(USART1, USART_FLAG_TC);

(6).串口使能

串口使能是通过函数USART_Cmd()来实现的,使用方法是:

scss 复制代码
USART_Cmd(USART1, ENABLE); //使能串口

(7).开启串口响应中断

在接收到数据的时候(RXNE 读数据寄存器非空),要产生中断,那么开启中断的方法是:

scss 复制代码
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启中断,接收数据中断

在发送数据结束的时候(TC,发送完成)要产生中断,那么方法是:

scss 复制代码
USART_ITConfig(USART1,USART_IT_TC,ENABLE);

(8).获取相应中断状态

使能了串口发送完成中断,那么当中断发生了,便可以在中断处理函数中调用这个函数来判断到底是否是串口发送完成中断,方法是:

scss 复制代码
USART_GetITStatus(USART1, USART_IT_TC)

返回值是SET,说明是串口发送完成中断发生。


四、 程序分析(程序总体介绍,模块设计)

1. 程序总体概述

  1. 串口时钟使能,GPIO 时钟使能

  2. 串口复位

  3. GPIO 端口模式设置

  4. 串口参数初始化

  5. 开启中断并且初始化 NVIC(如果需要开启中断才需要这个步骤)

  6. 使能串口

  7. 编写中断处理函数

2. 各个模块阐述

(1).USART模块

端口复用,串口参数的初始化设置,包括波特率,停止位等等参数。在设置完成只能接下来就是使能串口。同时,如果我们开启了串口的中断,当然要初始化 NVIC 设置中断优先级别,最后编写中断服务函数。

(2).LED模块:小灯初始化并使能时钟

(3).KEY模块:按键初始化,设置响应优先级

3. 程序分析总结

IO 口复用的,信号在逻辑分析窗口是不能显示出来的(看不到波形),比如串口的输出,SPI,USB,CAN 等。在仿真的时候在该窗口看不到任何信息。遇到这样的情况,就不得不准备一个逻辑分析仪,外加一个ULINK 或者JLINK 来做在线调试。

仿真并不能代表实际情况。只能从某些方面给一些启示,比如上面IO 口的输出,仿真的时候,其翻转速度可以达到很快,但是实际上STM32 的IO 输出就达不到这个速度。

相关推荐
奋斗的牛马42 分钟前
FPGA—ZYNQ学习spi(六)
单片机·嵌入式硬件·学习·fpga开发·信息与通信
清风6666661 小时前
基于单片机的智能高温消毒与烘干系统设计
数据库·单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
Jerry丶Li2 小时前
二十四、STM32的DMA
stm32·单片机·嵌入式硬件
辛河4 小时前
单片机.RS485
单片机·嵌入式硬件
SKYDROID云卓小助手4 小时前
无人设备遥控器之数字图传技术
运维·服务器·单片机·嵌入式硬件·fpga开发
Brianna Home5 小时前
边缘智能革命:TinyML赋能微控制器
单片机·嵌入式硬件·物联网·嵌入式实时数据库
芯联智造5 小时前
【stm32协议外设篇】- SU03T 智能语音模块
c语言·开发语言·stm32·单片机·嵌入式硬件
申克Lab5 小时前
STM32 串口线A-B
stm32·单片机·嵌入式硬件
芯联智造6 小时前
【stm32简单外设篇】- HC-SR501 / 人体红外被动红外传感器
c语言·stm32·单片机·嵌入式硬件
阿源-6 小时前
CPP 学习笔记 & 语法总结
嵌入式·cpp