pos机刷卡怎么间隔打印(我在高职教STM32——串口通信(四))

快鱼网 25 0

大家好,我是老耿,高职青椒一枚,一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次,同行应该都懂的,老师在课堂上教学几乎是没什么成就感的。正是如此,才有了借助头条平台寻求认同感和成就感的想法。在这里,我准备陆续把自己花了很多心思设计的教学课件分享出来,如果您正是一名单片机爱好者或是一名同行,欢迎点赞+关注,各位的支持是本人持续输出的动力,多谢多谢!#30天学会STM32##单片机#

通信,按照传统的理解就是信息的传输与交换。对于像STM32这样的单片机来说,通信则与传感器、存储芯片、外围控制芯片等技术紧密结合,成为整个单片机系统的“神经中枢”。没有通信,单片机所实现的功能仅仅局限于单片机本身,就无法通过其它设备获得有用信息,也无法将自己产生的信息告诉其它设备。如果单片机通信没处理好的话,它和外围器件的合作程度就会受到限制,最终整个系统也无法完成强大的功能,由此可见单片机通信技术的重要性。UART(Universal Asynchronous Receiver/Transmitter,即通用异步收发器)串行通信是单片机最常用的一种通信技术,通常用于单片机和电脑之间、单片机和单片机之间、单片机与外围器件的通信。

【学习目标】

知道通信基本概念的含义;理解通信机制中物理层和协议层分离的理念;学会配置STM32的串口功能;了解printf()函数“打印”至串口的实现过程;掌握使用串口调试软件对单片机的调试方法。

STM32串口通信涉及的知识较多,为了不让篇幅太长,本章打算分五个部分来讲解,本文是第四部分。

五、STM32的USART收发通信实验

我们经常使用USART来实现STM32与电脑之间的数据传输。这使得我们调试程序非常方便,比如我们可以把一些变量的值、函数的返回值、寄存器标志位等等通过USART发送到串口调试助手,这样我们可以非常清楚程序的运行状态,当我们正式发布程序时再把这些调试信息去除即可。我们不仅仅可以将数据发送到串口调试助手,我们还可以在串口调试助手发送数据给STM32,程序根据接收到的数据进行下一步工作。

5.1 任务描述

通过本实验,我们来测试和体验一下串口最基本的发送和接收效果,如图15所示。首先,通电之后在串口助手上“打印”开机信息;接着,开发板进入等待接收串口数据的状态,并每隔2s“打印”等待数据的提示信息;如果我们在串口助手发送区域输入任意内容(以回车结束),单击“手动发送”按钮,则在串口助手接收区回显相同的信息。工作期间,绿色LED一直闪烁,表明程序正在运行。

图15 串口收发实验效果

5.2 工程文件清单

综上所述,串口数据的收发对于STM32的开发来说,算得上是一种“标配”功能,这就是为什么我们从第一个实验开始就在工程SYSTEM目录下放了一个usart子目录,里面包含了usart.c和usart.h两个文件,用于串口的初始化和中断接收。现在,是时候结合以上的知识来剖析这两个文件里的代码了,我们把本实验的工程文件清单列在图16中。

图16 USART收发通信实验工程文件清单

5.3 硬件电路

图17和图18把开发板上与USART有关的电路连接呈现出来了,本实验只用到了USART1这个串口,硬件连接和配置上只关注该串口即可。

图17 USB转串口电路

图18 开发板上使用的串口

5.4 编程要点使能RX和TX引脚GPIO时钟和USART时钟;初始化GPIO,并将GPIO复用到USART上;配置USART参数;配置中断控制器并使能USART接收中断;使能USART;在USART接收中断服务函数实现数据接收和发送。5.5 usart.h代码剖析

usart.h和usart.c这两个文件的源码来自正点原子STM32系列的开发板,版权归广州市星翼电子科技有限公司所有。根据笔者自己的开发和教学经验,在STM32串口驱动的完整性和可移植性方面,正点原子的确做的非常优秀,我们不妨就来学习一下人家的优秀之处。由于串口驱动源码背后涉及的信息量较大,本小节先剖析usart.h头文件的源码,如代码清单2所示。源码中仅给了简要注释,详细的阐释见代码清单后的注解,阅读时最好结合usart.c的源码一起来看。

代码清单2 usart.h源码

第3行的stdio.h这个头文件大家肯不会陌生,这是标准C的输入/输出库,我们把它包含进来是为了使用经典的printf()函数,其用意估计大家也猜到了,那就是“打印”信息,这不就是本章的主要目的吗?但这里其实还有两个问题需要解决:第一,标准库里的printf()是向显示器这个标准输出设备“打印”信息,而我们却希望向串口这个设备“打印”信息,这里便涉及到一个“重定向”的问题;第二,stdio.h这是标准C库里才有的头文件,但STM32硬件和Keil软件究竟是否支持这个库,这里又涉及到一个“半主机调试”模式的问题。关于这两个问题,我们会结合usart.c的源码来解释。

第6行定义的宏用来规定串口一次能接收的长度(即字节数),这个数不宜太大,否则一次接收太多内容可能存在数据包丢失的情况。那如果实际接收内容的长度超过了这个规定值该怎么办呢?我们会在接收数据的中断程序中进行处理,分多次接收即可。

第7行定义的宏将配合usart.c文件里的条件编译决定是否开启串口接收的功能。一般情况下,如果只是使用串口“打印”调试信息,是不需要启用接收功能的,那么把这个宏的值改为0即可。

第11行声明了一个字符数组,用来存放串口一次接收的内容。

第13行声明的变量是u16类型的,它的16个bit位表示的信息如图19所示。这里有必要阐明的一点是,我们习惯的回车效果在ASCII码里其实是用“回车+换行”两个字符表示的,我们把这两个字符的相关信息汇总到表3中。结合USART_RX_STA变量的含义可知,串口接收的内容如果遇到了回车,表示这次接收的结束。同理,如果我们想通过printf()函数“打印”出回车效果,那么就需要“\r\n”连续两个转义字符来实现。

图19 USART_RX_STA变量表示的信息

表3 ASCII码中的回车与换行符

(第四部分完,usart.c源码会在第五部分中详细剖析)

标签: 串口

抱歉,评论功能暂时关闭!