串口通信实验(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 输出就达不到这个速度。

相关推荐
LCG米31 分钟前
STM32 定时器主从模式输出精确脉冲数实测:TRGO 触发链拆解、多发一脉冲根因与干净停止时序落地
stm32·单片机·嵌入式硬件·嵌入式
Dev_XH1 小时前
【成品设计】基于物联网的配电箱智能防护系统设计
stm32·单片机·嵌入式硬件·物联网
Dev_XH3 小时前
【成品设计】基于单片机的工厂设备能耗监控与优化系统
stm32·单片机·嵌入式硬件·物联网
anguoyang16 小时前
RK3588 上模型「能跑但很慢」:逐算子查 CPU 回退的完整方法与实测
嵌入式
路上有只喵20 小时前
认识元器件 · 单片机(MCU/MPU/SOC) · 实战篇 11
单片机·嵌入式硬件
不昀20 小时前
开关电源电流互感器怎么选:匝比、采样电阻与复位的计算笔记
单片机·嵌入式硬件·电子元器件
xbronze1 天前
STM32+RC522读取MIFARE 1K卡排坑实录
嵌入式
La Pulga1 天前
【FreeRTOS源码学习笔记】空闲任务与阻塞延时
笔记·mcu·学习·嵌入式·freertos·实时操作系统
小李不想当小白1 天前
WDG看门狗(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
智者知已应修善业1 天前
【51单片机实现从下到上,从上到下,从中间到两边,两边到中间】2024-10-23
c语言·经验分享·笔记·单片机·嵌入式硬件·51单片机