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

相关推荐
fanged16 分钟前
裸机编一个Hello World!(TODO)
嵌入式
FreakStudio8 小时前
全网最适合入门的面向对象编程教程:50 Python函数方法与接口-接口和抽象基类
python·嵌入式·面向对象·电子diy
辰哥单片机设计12 小时前
门磁模块详解(防盗感应开关 STM32)
stm32·单片机·嵌入式硬件·传感器
weixin_6320776312 小时前
udp聊天室
udp·网络编程·嵌入式·编程·聊天室
yrx02030713 小时前
stm32 IIC总线busy解决方法
stm32·单片机·嵌入式硬件
YHPsophie14 小时前
ATGM331C-5T杭州中科微BDS/GNSS全星座定位授时模块应用领域
经验分享·笔记·单片机·信息与通信·交通物流
Archie_IT15 小时前
【STM32系统】基于STM32设计的SD卡数据读取与上位机显示系统(SDIO接口驱动、雷龙SD卡)——文末资料下载
arm开发·stm32·单片机·嵌入式硬件
辰哥单片机设计15 小时前
1×4矩阵键盘详解(STM32)
stm32·单片机·嵌入式硬件·矩阵·传感器
wmkswd15 小时前
CAN总线-STM32上CAN外设
stm32·单片机·嵌入式硬件