STM32串口用中断还是用轮询

1.从轮询到中断

很多同学都不喜欢用中断,而偏爱用轮询的操作方式。

这是不是和我们的天性有关呢?每个人都喜欢一切尽在掌握中,肯定都不喜欢被打断。我们常常都有这样的经验:正在跟别人说一件事,然后突然有个电话打进来,Call打完后突然记不起来刚才讲到哪了!这种糟糕的体验对我们影响是如此深刻,以至于我们认定机器可能也是这样吧,频繁的中断会不会把事情搞乱呢?好在机器虽然大部分时间都比人笨一些,但在处理这种问题上却能做到一丝不苟。机器在中断来的时候总会老老实实地先把当前正在做的记录下来,然后转去处理中断事件,中断处理完后分毫不差地恢复原来的工作。

仔细想一想,我们是不是也可以在接电话前先用个小本儿记录一下正在讲的事情呢?我们为什么没有这么做呢?一个原因可能手头正好没有笔,再一个我们可能过于自信比机器聪明了吧,当然最有可能的就是我们大多数时候都讲的都是很无聊的话题,哈哈。

我们用 Keil 打开下面这个工程:

STM32Cube_FW_F0_V1.11.0\Projects\STM32F030R8-Nucleo\Examples\UART\UART_TwoBoards_ComIT\MDK-ARM\Project.uvprojx

这时候我们会发现,如果不仔细看,几乎看不出和用轮询操作的代码有什么区别。特别是初始化部分,就是一模一样的。说好的中断方式呢?

好,我们往下面找一下终于会发现点儿不同:

在这里我们发现串口发送调用了一个不同的函数。秘密就在这个函数里:

HAL_UART_Transmit_IT 这个函数有三个参数:

UART_HandleTypeDef *huart, 让函数知道处理的是哪个串口

uint8_t *pData, 需要发送的数据首地址

uint16_t Size   发送数据的大小(长度)

这个函数的三个步骤:

Step1: 把待发送数据区的首地址,长度赋给串口的 Handle。

Step2: 根据参数(8B还是9B),挂载不同的处理函数。

Step3: 开中断(串口发送寄存器空将产生中断)。

HAL_UART_Transmit_IT 函数执行完这些任务就退出了,主程序可以继续执行其它的操作。这是和轮询完全不同的。我们回头看一下轮询方式的 HAL_UART_Transmit 就会发现这个函数一直要等到所有数据都发送完才退出,在此期间MCU被100%占用,没有办法做其它的事情。轮询方式发送函数里有个参数 5000,这是一个发送超时参数,不管有没有发送完,5秒以后强制退出此函数,防止由于硬件或其它原因卡死在这个函数里。

2.再谈Handle

对于 Handle 这个词,我们没有用"句柄"这种翻译,因为"句柄"这个词本身也是生造出来的,这个词本身就不太好理解,容易把人引入歧途。所以我们认为 Handle 这个词不翻译为好。Handle 是一个重要的概念,所以我们需要反复体会用它来管理硬件模块的好处。

我们可以把它想象成一个负责装卸货船的办事处,类型声明(如 UART_HandleTypeDef ) 是一个创建办事处的模板。如果有五个码头,那就创建五个办事处,这些办事处是相似的,但每个办事处又不同,它们建在不同的码头,有不同的人员,可以调用不同的车队。这个办事处可以等待中央机构(MCU)的命令,也可以用更好的办法。

中断的方式就像我们给这个办事处建立一个自动处理流程,码头来了一个空货船,则自动触发办事处中的一些办事员调动车队把货物运到船上。而轮询方式就像所有的事情都要等待中央指挥中心(MCU)下达命令,即使办事处一堆人员正无所事事。

下面的 Handle 就好比是一个这样的办事处,初始化的过程就是告知它建在 USART1,以及波特率,有无奇偶校验,停止位等信息。

HAL_UART_Transmit_IT 函数告知此办事处有一堆 8BIT 货物在仓库 aTxBuffer 存放,并通过把 TxISR 指向适合的车队( 函数 UART_TxISR_8BIT ),建立了一个自动处理流程。

3.中断产生,执行的流程

我们从下图中可以看到从中断产生到执行的过程,一个是发送寄存器空产生中断时,一个是发送完成产生中断时。

参考资料:

PM0215  STM32F0xxx Cortex-M0 programming manual

UM1785 Description of STM32F0 HAL and low-layer drivers

STM32F030 Datasheet

STM32F030 Reference Manual

码字辛苦,如果喜欢就随手点个在看吧!

扫码关注公众号:

加入微信交流群:


推荐阅读:

专辑|Linux文章汇总

专辑|程序人生

专辑|C语言

我的知识小密圈

关注公众号,后台回复「1024」获取学习资料网盘链接。

欢迎点赞,关注,转发,在看,您的每一次鼓励,我都将铭记于心~

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

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

相关文章

Castle

Csocket的作用 利用MFC的Csocket类实现网络通信 https://www.cnblogs.com/sva2005/articles/319796.html _tcstod 字符串转 IEEE 双精度浮点数 http://www.cppfans.com/cbknowledge/reference/cstdlib/strtod.asp strtol, _tcstol, wcstol - 字符串转 32 位长整数 (long), 支…

linux 笔记之一mysql源码包安装

linux的MySQL安装 添加mysql组 1 groupadd mysql 将MySQL用户添加到MySQL组中 2 useradd -g mysql mysql 进入MySQL目录 3 cd src/mysql-4.0.27 在安装过程中缺少文件(Linuxthreads)所以将Linuxthreads从定到/usr/include/pthread.h 4 echo /* Linuxthreads */ >> /u…

C++ —— C++高手之路

推荐一些C经典书籍 c程序设计教程 c编程思想 c大学教程 c程序设计语言 数据结构算法与应用c语言描述 c标准模板库------自修教程与参考手册 泛型编程与STL 深度探索c对象模型 设计模式---可复用面向对象软件的基础 重构---改善既有代码的设计 Essential c Effective…

使用Buildroot为I.MX6制作根文件系统

1.引言接触Freescale/NXP的I.MX6处理器大概有了两年多的时间,对于一个最初玩MCU的我来说,真是面临了很多的挑战。最让我感到郁闷和崩溃的是那个官方的基于Yocto的开发环境,搭建它要求真是太高了,机器得有上百G的空间,U…

SQL查询优化《三》:少做重复的工作

1.控制同一语句的多次执行2.减少多次的数据转换3.杜绝不必要的子查询和连接表,子查询在执行计划一般解释成外连接,多余的连接表带来额外的开销。4.合并对同一表同一条件的多次UPDATE,比如 UPDATE EMPLOYEE SET FNAMEHAIWER WHERE EMP_ID VPA3…

C++ —— 初识C++

初识C 一、C概述 1、C语言诞生 (1)C语言也是诞生于美国贝尔实验室 (2)C语言是1983年由Bjarne Stroustrup推出的 (3)C语言是在C语言的基础上推出的 (4)C语言进一步扩充和完善了C…

扁平的信标灯

▌交流磁场信号会改变地磁计吗?卓大,我想问个问题,智能车比赛的交流信号磁场会对地磁计产生影响吗?▓ 回复: 在今年的智能车竞赛中存在两个交流信号源:(1)第一种是电磁赛道上的电磁导引线&…

如何选择合适的Web安全网关?

日益加剧的网络威胁让Web安全网关(Web Security Gateway,WSG)逐渐成为企业边界网络安全防护的新宠。基于OSI模型第七层(应用层)的Web安全网关具有反恶意软件、上网行为管理以及安全审计等诸多安全检测或管控能力。然而面对铺天盖地的广告和琳…

ADS TC3通信

倍福TC3安装方法 WIN7 32 https://wenku.baidu.com/view/7fb11a200a4e767f5acfa1c7aa00b52acec79c62.html [Visual Studio C] [ 倍福 TwinCAT3 ] ADS通讯工程实现 https://blog.csdn.net/Robot_Starscream/article/details/83869264 倍福TwinCAT3上位机与PLC通信测试(ADS通信)…

js字符串转数字(小数),数字转字符串

将字符串转化为小数并加法计算,然后保留两位小数(parseFloat(that.data.pay_price) parseFloat(that.data.qiandao)).toFixed(2)将数字转为字符串并计算长度yuan_price10yuan_price.toString.length //输出2 转载于:https://www.cnblogs.com/shark1100913/p/8782…

C++ —— C++程序编译的四个过程

C —— C程序编译的四个过程 g是Linux下C的编译器;我为什么会选择Linux下的g编译器,就是因为g可以看到程序从编译到运行的过程做了些什么。而VS等集成开发环境看不到这些,并不是说VS工具不好,(VS还是相当好用的...&…

屏下指纹介绍

一、光学指纹问题现状光学指纹当前随着成本的下降,各大厂商都在低中高端旗舰用上了光学指纹。有别于传统的电容指纹,光学指纹在解锁性能上目前都进行了优化,性能接近电容指纹。二、光学指纹电容指纹原理两者原理都是对指纹的纹路脊谷进行信号…

关于 SAP 访问关键字的说明

SAP 为了保护标准程序和字典对象,对于标准代码的修改都设定了访问关键字控制,用户需要修改时必须输入正确的访问关键字才可以编辑标准程序和字典对象,这个关键字可以到 SAP 网站上申请。 地址为 http://service.sap.com,用你公司的…

ABAP Netweaver和Hybris里获得内存使用统计数据

ABAP Netweaver 事物码ST06 Hybris 每隔5秒钟,Hybris Administration console会发起一个到Java后台的AJAX查询请求: 这个5秒的时间间隔定义在project.properties配置文件里, 然后使用JavaScript的setInterval建立定期轮询: Java后…

Linux中常用C/C++一些头文件的作用

<assert.h>&#xff1a;ANSI C。提供断言&#xff0c;assert(表达式) <glib.h>&#xff1a;GCC。GTK&#xff0c;GNOME的基础库&#xff0c;提供很多有用的函数&#xff0c;如有数据结构操作函数。使用glib只需要包含<glib.h> <dirent.h>&#xff1a;G…

CRecordset类

CRecordset类 https://blog.csdn.net/elcoteq983/article/details/7000745 CRecordset::Open virtual BOOL Open( UINT nOpenType AFX_DB_USE_DEFAULT_TYPE, LPCTSTR lpszSQL NULL, DWORD dwOptions none ); nOpenType 接受默认值AFX_DB_USE_DEFAULT_TYPE&#xff0…

STM32做平衡小车,代码,PCB都现成的,妈妈再也不用担心我的毕业设计了

▌一、硬件介绍主控芯片用的是100脚的STM32F103VET6&#xff0c;陀螺仪用的是MPU6050&#xff0c;电机驱动用的是TB6612&#xff0c;蓝牙是汇承的HC05邮票孔封装的&#xff0c;WIFI用的是济南有人科技的USR-WIFI232-S&#xff0c;小车底盘用的是平衡小车之家的某一款带编码器的…

Apache 配置:是否显示文件列表

Apache 配置&#xff1a;是否显示文件列表 进入虚拟主机配置文件 显示文件列表的话 options Indexes FollowSymLinks 不显示文件列表的话 options FollowSymLinks 文章来源&#xff1a;刘俊涛的博客 地址&#xff1a;http://www.cnblogs.com/lovebing 欢迎关注&#xff0c;有问…

升级到virtualbox-2.1.4

今天把virtualbox从1.6.6升级到2.1.4.启动系统时出现VERR_SUPDRV_COMPONENT_NOT_FOUND网上查了一下&#xff0c;桥接需要vboxnetfltmodprobe vboxnetflt后就可以了然后把vboxnetflt加入到/etc/config.d/modules里使每次系统启动都载入vboxnetflt遗憾的是&#xff0c;这次升级并…

C++ —— C++引用

C引用 一、普通引用 【变量名】 变量名实质上是一段连续存储空间的别名&#xff0c;是一个标号 程序中通过变量来申请并命名内存空间 通过变量的名字可以使用存储空间 问题1&#xff1a;对一段连续的内存空间只能取一个别名吗&#xff1f;【不是】 1、引用是C的概念 // …