基础篇007. 串行通信(二)--中断方式接收数据

news2025/1/9 16:37:00

目录

1. 实验任务

2. 硬件原理

3. 利用STM32CubeMX创建MDK工程

3.1 STM32CubeMX工程创建

3.2 配置调试方式

3.3 配置时钟电路

3.4 配置GPIO

3.5 配置串口参数

3.6 配置时钟

3.7 项目配置

4. 串行通信实验

4.1 UART串口printf,scanf函数串口重定向

4.2 开启中断

4.3 中断回调函数

4.4 main()函数修改

5.调试与验证

6.总结


 

1. 实验任务

利用STM32CubeMX,创建MDK工程,使用中断方式,实现串口接收数据,然后在转发到串口。

本实验是串行通信的第二部分,基础知识已在上一篇讲述:

基础篇007. 串行通信(一)--阻塞方式发送接收

2. 硬件原理

936338e4d96446048606373683a01f83.png

 

ef1ed9eb1de845e3930799677333f273.png

1) 指示灯 DS0、 DS1分别连接到PA8和PD2.

2) 3个按键: KEY0、 KEY1 和 KEY_UP,分别连接到PA13、PA15、PA0。

3. 利用STM32CubeMX创建MDK工程

3.1 STM32CubeMX工程创建

选择File下的New Project:

e8d98eaebc0b4e87a8a577bf4c4bf862.png

选择芯片类型(本文为stm32f103RBt6),选择下边的item,然后Start Project:

f21131b6caaa4a0bba1057749bd9621f.png

3.2 配置调试方式

点击左侧的System Core下的SYS,将Debug设置为Serial Wire:

729454ecff83437594cd7414d031818e.png

3.3 配置时钟电路

配置时钟:将RCC下的HSE设置为Crystal/Ceramic Resonator

338a4809a7814ea5a8836226db604b97.png

3.4 配置GPIO

结合开发版的硬件电路,进行GPIO设置

选择GPIO,依次将PA8、PD2设置为GPIO_Output,3个按键对应的IO口设置为输入,KEY0、 KEY1 和 KEY_UP,分别连接到PA13、PA15、PA0。

KEY0(PA13)是低电平有效的,需要将PA13设置为GPIO_Input,在STM32内部设置上拉:

bd50ece1db584f98bb977df4f6f5a7cf.png

各IO口设置后的参见见上图。

3.5 配置串口参数

USART1参数配置:

在 Connectivity 中选择 USART1 设置,并选择 Asynchronous 异步通信。

波特率为 115200 Bits/s。传输数据长度为 8 Bit。奇偶检验 None,停止位 1 ,接收和发送都使能。

d14697a9bed44e64972290bf996f0a3d.png

配置串口中断:

d2ab86f44ac540eb91cda7627ab7f8ae.png

检查NVIC

9383e24076ac4a2da3b20bbef402da3e.png

 

3.6 配置时钟

结合开发版的硬件电路,选择Clock Configuration,做如下配置:

结合开发版的硬件电路,选择Clock Configuration,做如下配置:

c52c6b97a903445da64f17d7be511234.png

 

3.7 项目配置

在Project Manager下的Project中设置工程名称和工程路径,并选择编译软件。取消勾选Use lastest available version,选择其他版本:

262df25baaa44fc69af085b653e8a094.png

代码生成设置:

e5905003116c432fa2bc50cfcb6ae9a0.png在Code Generate中选择第二个,然后Generate Code,即生成代码:a141a0cf0b8d403a9951f6bfb01455ad.png

 

可以打开MDK工程编辑了。

963438b0c0724baba65d3fa2c51e12b4.png

4. 串行通信实验

4.1 UART串口printf,scanf函数串口重定向

这部分内容与上一节相同。

在学习C语言时我们经常使用C语言标准函数库输入输出函数,比如printf、scanf、getchar等。为让开发板也支持这些函数需要把USART发送和接收函数添加到这些函数的内部函数内。

在C语言HAL库中,fputc函数是printf函数内部的一个函数,功能是将字符ch写入到文件指针f所指向文件的当前写指针位置,简单理解就是把字符写入到特定文件中。

fgetc函数与fputc函数非常相似,实现字符读取功能。在使用scanf函数时需要注意字符输入格式。

注意:

使用fput和fgetc函数达到重定向C语言HAL库输入输出函数必须在MDK的工程选项把“UseMicroLIB”勾选上,MicoroLIB是缺省C库的备选库,它对标准C库进行了高度优化使代码更少,占用更少资源。

为使用printf、scanf函数需要在文件中包含stdio.h头文件。

在usart.c文件的user code 0 区域内:

149afbaac7e24cd9a3bf011c62a640f9.png

输入如下内容:

548adcf871174ef78c160f520c96ae88.png

4.2 开启中断

在usart.c文件中的函数void MX_USART1_UART_Init(void)内:

0007208a95ba4e95a54502d1da9d1709.png

 

4.3 中断回调函数

在usart.c文件中末尾的:

817ee95069bf4cb9864cf37962106418.png

输入如下内容:

8b588aee69214805bdaf8afef6866c8f.png

注意:根据上述串口数据接收程序,发送数据时,需使用“\n”结束,否则会一直等待发送,看不到输出结果。

可以在主程序中使用printf("\n");发送数据,也可以使用串口调试助手。

4.4 main()函数修改

2ecc6ddc643a4e46a640d11842b05e8b.png

 

a812d56de7b0445c9c808623c28b1f58.png

 

a120046534b2471d9fe169c0b53ffad9.png

 

如果你需要AC5编译器,请参考如下博文安装设置:

Keil MDK5.37以上版本自行添加AC5(ARMCC)编译器的方法_armcc下载:

Keil MDK5.37以上版本自行添加AC5(ARMCC)编译器的方法_armcc下载_笑春风oO的博客-CSDN博客

5.调试与验证

如果你需要AC5编译器,请参考如下博文安装设置:

Keil MDK5.37以上版本自行添加AC5(ARMCC)编译器的方法_armcc下载

 

程序编译通过后,可将其下载到开发板进行验证

实验需要使用串口调试助手验证。

串口调试助手: 下载地址

打开串口调试助手,实验结果如下:

eb673db44503487c9071bbc16544f9f7.png

发送“\n”字符作为结束符的设置方法:

提示:“\n”的ASCII为“0xa”。

5fe40f0c764440a896fef398d29cf2e3.png

 

按下发送按钮后,显示如下:

5296a7c4fa7b4ea58539e8d59e277339.png

 

按下开发板的Key0按键后,显示如下:

d77f352441c14fe39dd89ccc10674c03.png

 

 5a51e007d8ee433fa2abd0e4a0531785.png

 

 

6.总结

 

本实验是串行通信的第二部分,基础知识已在上一篇讲述:

基础篇007. 串行通信(一)--阻塞方式发送接收

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/534691.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数组(C语言程序设计)

一、一维数组 数组是相同类型的有序数据的集合 1、一维数组的定义 形式:类型名 数组名[常量表达式] 2、一维数组元素的引用 形式:数组名[下标] 3、一维数组的初始化 形式:类型名 数组名[数组长度]{初值表} 4、一维数组程序设计示例 【例6.…

如何画类图

是为了写论文才回头看的,已经忘光了 在类图中,我们用一个矩形来表示一个类。这个矩形通常分为三个部分: 顶部:写类的名字。 中间:写类的特性,比如一个"狗"类可能有"颜色",“品种"…

Go语言的错误和异常处理:error、panic和recover

目录 【error类型】 error的基本用法 error.Is 用法 封装自定义错误结构体 error.As 用法 错误行为特征检视策略 【异常panic和recover】 panic recover panic 和 os.Exit 如何正确应对panic 【error类型】 error的基本用法 在Go语言中,一般使用 error …

【P1003 [NOIP2011 提高组] 铺地毯】

[NOIP2011 提高组] 铺地毯 题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯。一共有 n n n 张地毯,编号从 1 1 1 到 n n n。现在将这些地毯按照编号从小…

Redis单线程 Vs 多线程

Redis单线程 Vs 多线程 一 面试题引入1.1 Redis到底是单线程还是多线程?1.2 IO多路复用1.3 Redis为什么快?1.4 Subtopic 二 Redis为什么选择单线程?2.1 这种问法其实并不严谨,为啥这么说?2.2 Redis是单线程究竟何意&am…

什么是JavaScript?为什么需要学习它?

JavaScript是一种广泛使用的编程语言,它被用于开发Web应用程序、桌面应用程序和移动应用程序。它的出现可以追溯到1995年,由瑞典计算机科学家Tim Bergling和美国计算机科学家John Resig共同开发。 JavaScript的历史可以追溯到20世纪90年代,当…

完美解决:由于找不到MSVR100.dll ,无法继续执行代码

当我们在运行某一个软件时,突然提示找不到MSVCR100.dll,我相信有不少用户都遇到过这种情况,并且在重新安装软件后还是无法解决。那么电脑提示找不到MSVCR100.dll该怎办呢? MSVCR100.dll是什么? 在解决找不到MSVCR100.dll这个问…

RabbitMQ之交换机详解

1 Exchages ​ 我们假设的是工作队列背后,每个任务都恰好交付给一个消费者(工作进程)。在这一部分中,我们将做一些完全不同的事情,我们将消息传达给多个消费者。这种模式 称为 ”发布/订阅“。 ​ 为了说明这种模式,我们将构建一…

vi和vim编辑器介绍与使用

VI 和 VIM 编辑器是 Unix 和 Linux 操作系统中最常用的文本编辑工具之一。虽然它们都用于编辑文本文件,但它们有一些不同之处。本文将对 VI 和 VIM 编辑器进行介绍,帮助你更好地了解编辑器的特性和优点。 Linux下常见的文本编辑器有: emacsp…

Unity解决在摄像机上面设置了TargetTexture后获取屏幕坐标不准的问题

大家好,我是阿赵 这里来分享一个最近遇到的小问题。 一、发现问题 如果我们想将3D模型放在UI上,一个比较普遍的做法是: 用一个单独的摄像机,把3D模型拍下来,并转成RenderTexture,贴到RawImage上。 那么如…

枚举类型enum详解

概述 enum是C语言中的一个关键字,enum叫枚举数据类型,枚举数据类型描述的是一组整型值的集合(这句话其实不太妥当),因为枚举类型是一种基本数据类型,而不是一种构造类型,它不能再分解成什么基本…

架构设计如何绘图?

大家好,我是易安! 很多同学技术能力很强,架构设计也做得很好,但是在给别人讲解的时候,总感觉像是“茶壶里煮饺子,有货倒不出”。 其实,在为新员工培训系统架构、给领导汇报技术规划、上技术大会…

详解c++STL—容器vector

一、vector基本概念 功能: vector数据结构和数组非常相似,也称为单端数组 vector与普通数组的区别: 不同之处在于数组是静态空间,而vector可以动态扩展 动态扩展: 并不是在原空间之后续接新空间,而是找…

阿里云ECS服务器实例挂载数据盘步骤

1、首先登录阿里云ECS服务器,通过 df -h 命令查看当前磁盘挂载情况,可以发现只有系统盘40G 2、通过 fdisk -l 命令查看磁盘情况,可以发现有两个盘: 系统盘 /dev/vda: 42.9GB, 数据盘 /dev/vdb: 322.1GB 3、运行 fdisk…

c++进阶项目—基于多态的职工管理系统

一、管理系统需求 公司中职工分为三类:普通员工、经理、老板 显示信息时,需要显示职工编号、职工姓名、职工岗位、以及职责 1、普通员工职责:完成经理交给的任务 2、经理职责:完成老板交给的任务,并下发任务给员工…

“Shell“正则表达式;文本三剑客Sed

文章目录 一.正则表达式1.1正则表达式介绍1.2命令演示1.3正则表达式实验演示 二.Sed编辑器2.1Sed介绍2.2操作命令演示2.3替换2.4插入2.4总结: 一.正则表达式 1.1正则表达式介绍 通常用于判断语句中,用来检查某一字符串是否满足某一格式 正则表达式是由…

unity,如何让人物随着鼠标滑动而转向?

介绍 unity,如何让人物随着鼠标滑动而转向? 方法 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems;public class PlayerMovement : MonoBehaviour {public float speed 6f; …

STM32之IIC

(24条消息) C51之olde显示屏模块的使用_c51 oled_陈学弟的博客-CSDN博客IIC介绍 (24条消息) C51之olde显示屏模块的使用_c51 oled_陈学弟的博客-CSDN博客 函数封装 用到的库函数: HAL_StatusTypeDef HAL_I2C_Mem_Write ( I2C_HandleTypeDef * hi2c , uint16_t…

Day 1 认识软件测试——(软件测试定义、目的、原则)

Day 1 认识软件测试——(软件测试定义、目的、原则) 文章目录 Day 1 认识软件测试——(软件测试定义、目的、原则)软件测试的定义软件测试的目的软件测试的经济学问题黑盒测试白盒测试软件测试原则小结所谓软件测试,就是一个过程或一系列过程,用来确定计算机代码完成了其…

LitCTF 2023 WriteUp(部分)

Index 前言题目Web我Flag呢? Pwn只需要nc一下~口算题卡题目分析EXP: 狠狠的溢出涅~题目分析EXP: ezlogin题目分析EXP: Reverse世界上最棒的程序员 ez_XOREXP: CryptoHex?Hex!(初级)梦想是红色的原来你也玩原神 Misc签到!(初级)Wha…