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

相关推荐
教练、我想打篮球2 分钟前
04 基于 STM32 的时钟展示程序
stm32·单片机·嵌入式硬件
芯岭技术36 分钟前
普冉MS32C001单片机,国产32位单片机,芯片特性和功能介绍
单片机·嵌入式硬件
吃货界的硬件攻城狮2 小时前
【STM32 学习笔记】ADC数模转换器
笔记·stm32·单片机·学习
小昭dedug6 小时前
功能安全的关键——MCU锁步核技术全解析(含真实应用方案)
单片机·嵌入式硬件
BW.SU7 小时前
单片机 + 图像处理芯片 + TFT彩屏 指示灯控件
单片机·嵌入式硬件·人机交互·控件·触摸屏设计·指示灯·液晶屏
KingQian20188 小时前
单片机嵌入式滤波算法库
单片机·嵌入式硬件·算法
憧憬一下9 小时前
stm32之DMA
stm32·单片机·嵌入式硬件·嵌入式
平凡灵感码头10 小时前
基于智能家居项目 RGB彩灯(P9813)
单片机·fpga开发·智能家居
小智学长 | 嵌入式20 小时前
单片机-STM32部分:6、不同编程方式-寄存器、标准库、HAL库、LL库
stm32·单片机·嵌入式硬件
Wx120不知道取啥名1 天前
设备与驱动:UART设备
单片机·嵌入式硬件·uart介绍·uart收发数据·uart接收不定长数据·uart的dma/中断收发