台式电脑

怎么样查找电脑中的buf(我在高职教STM32——串口通信(五))

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

我在高职教STM32——串口通信(五)

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

【学习目标】

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

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

五、STM32的USART收发通信实验5.6usart.c代码剖析

usart.h和usart.c这两个文件的源码来自正点原子STM32系列的开发板,版权归广州市星翼电子科技有限公司所有。根据笔者自己的开发和教学经验,在STM32串口驱动的完整性和可移植性方面,正点原子的确做的非常优秀,我们不妨就来学习一下人家的优秀之处。usart.h的源码已在上一部分剖析过了,本节我们来剖析一下usart.c的源码。为了便于阅读,我们将其大致分为三个代码段,如代码清单3所示。

我在高职教STM32——串口通信(五)

代码清单3usart.c的三个代码段

1)代码段1

代码清单4有些抽象,如果初学者看不懂也不要紧。总之,你只需要明白,有了这段代码,printf()函数“打印”的信息就到USART1串口上去了。

我在高职教STM32——串口通信(五)

代码清单4usart.c的代码段1

第3行声明提到的半主机是这么一种机制,它使得在ARM目标上跑的代码,如果电脑运行了调试器,那么该代码可以使用该主机电脑的输入输出设备。这点非常重要,因为开发初期,可能开发者根本不知道该ARM器件上有什么输出设备,而半主机机制使得你不必知道ARM器件的外设,利用电脑的外设就可以实现输出调试。所以要利用目标ARM器件的输出设备,首先要关掉半主机机制,然后再将输出重定向到ARM器件上,也就是我们期望的printf()函数输出重定向到USART1串口。

那么如何实现重定向呢?第16~22行重写的fputc()函数即可实现,因为如果你研究过printf()函数的源码,最终调用的是标准库fputc(intch,FILE*f)这个函数。而我们现在自定义了一个与之同名的函数,那printf()函数会调用哪个呢?标准库里的?自定义的?还是编译报错呢?答案是使用自定义的。于是我们在fputc()函数内部将输出的字符指向USART1的数据寄存器即可。

第19行的等待发送完毕是通过读取USART1->SR状态寄存器里的TC位来实现的。我们把手册里对这个寄存器的描述摘录过来,如图20所示。TC位正好与0x40(01000000)里的那个1在相同位置,(USART1->SR&0x40)==0意味着TC位为0,说明发送未完成,那就停在对应的while循环里。如果发送完成,TC位变成1,while循环退出。由此实现了“循环发送,直到发送完毕”。

我在高职教STM32——串口通信(五)

图20USART1->SR状态寄存器TC位的描述

第20行的USART1->DR是数据寄存器,如果是发送,把待发送的字符填入该寄存器,之后会借助移位寄存器将数据一位一位的发送出去。如果是接收,移位寄存器会将接收到的数据一位一位地填入该寄存器。因此,USART1->DR这个数据寄存器是收发共用的,会根据程序的需要自动改变数据方向。关于该寄存器的详细描述,请参考STM32数据手册。

我们再回到与“半主机”有关的代码上,为确保没有从C库链接使用半主机的函数,那么stdio.h中有些使用半主机的函数要重写,于是就有了第5~14行的代码。至于为何这么写,有兴趣的朋友可以阅读ARM官方的两个文档《RealView编译工具开发指南》和《ARMDeveloperSuiteCompilersandLibrariesGuide》,内容比较多,理解起来也有难度。

最后,我们再补充一个在Keil编译中“使用微库”的问题,即第1行注释里提到的“useMicroLIB”,它其实是Keil编译器的一个配置选项,如图21所示。如果勾选此项,第1~14行的代码也就不需要了,只需要留下重定向fputc()函数的代码即可。因此,如果你看到有的STM32工程的串口“打印”没有出现类似的代码段1,不妨看一下是否勾选了此项。

我在高职教STM32——串口通信(五)

图21Keil软件里的useMicroLIB选项

微库可以看作是缺省标准C库的备选库,它用于必须在极少量内存环境下运行的嵌入式应用程序,它只保留了标准库里的一些常用功能,在一定程度上方便了程序的开发和移植,毕竟标准库是成熟和通用的。当然,也有弊端,使用微库编译出来的代码量会比较大,感兴趣的朋友可以在做完该实验之后,使用微库再编译一次,看看代码量究竟差了多少。

2)代码段2

这段代码主要就是一个串口初始化函数uart_init(),完成USART1_TX和USART1_RX两个引脚的GPIO初始化、USART1串口中断的初始化以及串口自身参数的初始化,源码见如下代码清单5。

我在高职教STM32——串口通信(五)

代码清单5usart.c的代码段2

第1~3行,这几个宏和变量的作用已在前面剖析usart.h源码时解释过了。

第12~24行是对PA9和PA10两个引脚的GPIO初始化。这里需要注意的是,复用功能下的GPIO模式怎么判定?查看手册得知,如表4所示,配置全双工的串口1,那么TX(PA9)需要配置为推挽复用输出,RX(PA10)配置为浮空输入或者带上拉输入。

我在高职教STM32——串口通信(五)

表4串口GPIO模式配置表

第26~31行,对于NVIC中断优先级管理,我们在前面章节已有讲解,这里不重复了。需要注意一点,因为使用到了串口的中断接收,必须在usart.h里面设置EN_USART1_RX为1(默认设置就是1)。该函数才会配置中断使能,以及开启USART1的NVIC中断。这里我们把USART1中断放在组2,优先级设置为组2里面的最低。

第33~48行,我们配置USART1通信参数为:波特率由参数baud传入,字长为8,1个停止位,没有校验位,不使用硬件流控制,收发一体工作模式,然后调用USART_Init()库函数完成配置。

第50~54行,配置完NVIC之后调用USART_ITConfig()函数使能USART1接收中断,最后调用USART_Cmd()函数使能USART1。

3)代码段3

这段代码是USART1的中断服务函数,处理串口接收到的数据,源码见代码清单6。

我在高职教STM32——串口通信(五)

代码清单6USART1中断服务函数

这个函数的实现思路是这样的,当接收到从电脑发过来的数据,把接收到的数据保存在USART_RX_BUF数组中,同时在接收状态寄存器(USART_RX_STA)中计数接收到的有效数据个数,当收到回车的第一个字节0x0d时,计数器将不再增加,等待0x0a的到来,而如果0x0a没有来到,则认为这次接收失败,重新开始下一次接收。如果顺利接收到0x0a,则标记USART_RX_STA的第15位,这样完成一次接收,并等待该位被其他程序清除,从而开始下一次的接收,而如果迟迟没有收到0x0d,那么在接收数据超过USART_REC_LEN的时候,则会丢弃前面的数据,重新接收。

第32行的#endif配对的是代码段2的第1行#ifEN_USART1_RX。当需要使用串口接收的时候,我们只要在usart.h里面设置EN_USART1_RX为1就可以了。不使用的时候,设置EN_USART1_RX为0即可,这样可以省出部分sram和flash,我们默认设置EN_USART1_RX为1,也就是开启串口接收。

5.7main.c源码剖析

主程序的源码见代码清单7,这段代码请结合图22的实验效果来阅读,控制思路已在注释中交待。

我在高职教STM32——串口通信(五)

图22本实验的串口收发效果

我在高职教STM32——串口通信(五)

代码清单7main.c文件源码

5.8测试与验证

把程序下载到麒麟座开发板中,可以看到板子上的绿色LED开始闪烁,说明程序已经在跑了。串口调试助手软件很多,我们用的是野火串口调试助手,从笔者的使用体验上,这款软件的界面和中文支持不错,接下来就可以按照图22里的步骤来测试了。至此我们就完成了串口“发送”和“接收”实验,后续其他实验也将继续沿用串口功能,尤其是“打印”必要的测量数据和调试信息。

(第五部分完,共五部分)

怎么样查找电脑中的buf(我在高职教STM32——串口通信(五))

相关新闻

返回顶部