CSDN话题挑战赛第2期
参赛话题:学习笔记
学习之路,长路漫漫,写学习笔记的过程就是把知识讲给自己听的过程。这个过程中,我们去记录思考的过程,便于日后复习,梳理自己的思路。学习之乐,独乐乐,不如众乐乐,把知识讲给更多的人听,何乐而不为呢?
- 项目中解决的问题
STM32大容量芯片最多可以提供多达5路UART,其中前3路(UART1~UART3)还支持同步传输,并且可以配置成LIN通信模式,因此,STM32官方手册称其为USART1~USART3;剩余两路为UART4和UART5。为了叙述方便,这里统一称为COM1~COM5串行接口。
RS232底层协议是比较复杂的,在学习FPGA的过程中,经常会用到Verilog编写的串口程序,状态机切换还是比较多的。其实NI也提供了LabVIEW下的FPGA串口IP核,就是利用LabVIEW的状态机架构来实现整个RS232通信协议的,感兴趣的用户可以从NI官网下载相关程序学习一下。好在STM32内部已经帮我们实现了最底层的串口收发过程,用户只需要从收发缓冲区中读取或者写入字节数据就可以了,非常简单。
另外,对于刚刚接触LabVIEW的新用户来说,经常会把VISA函数当成串口函数,实际上NI-VISA驱动包本质上是将整个仪器行业的通信协议(RS232、GPIB、USB、Ethernet等)封装在一起,供不同行业的工程师使用,这样可以简化仪器通信。其实,这里的VISA函数是一种运行在上位机、高度封装的多态VI。
本节介绍的是我们专门针对STM32芯片设计和优化过的串口函数,一共有5路COM口,并且每路之间都相互独立,默认情况下,都开辟了1KB大小的接收缓冲区。因此,对于那些需要多路串口并行工作的应用来说,使用我们提供的串口VI将会非常方便。
- 做题思路
通常情况下,串口只需要6个基本操作函数就可以满足绝大多数的应用,STM32也不例外,如图
(1)串口初始化
为了保证串口初始化后的波特率是正确的,需要先利用Sys子面板中的STM32_Clock_Init.vi函数对STM32系统时钟进行倍频操作,然后再执行串口初始化。
串口初始化函数的输入端参数比较多,除了基本的VISA资源名(COM1~COM5)、波特率(4800~115200)、数据位(8~9位)、校验(无、奇偶校验)、停止位(1.0、1.5、2.0位)之外,还有两个比较重要的参数:读取终止符和是否启用终止符。
其中,VISA资源名里面提供了5路COM口,每路COM口对应STM32实际的物理引脚,可以打开该VI的前面板进行查看;波特率最大可以设置为115200bps,即115.2Kbps;数据位一般选择默认的8位就可以了;COM4与COM5不支持半位停止位,故只能选择1.0或2.0位,而COM1~COM3支持全部;终止符默认为换行符“\n”即0x0A,常用的终止符还有回车符0x0D;一旦启用终止符,那么串口在读取数据时,遇到事先设置的终止符,就会立刻停止,将终止符之前的数据全部读取出来;如果没有遇到终止符,则会按照预设的字节数进行读取。以上这些配置过程均由UART子面板中的VISA Configure Serial Port.vi函数来完成,如图
(2)串口接收缓冲区字节数
一般情况下,在读取串口缓冲区中的数据之前,需要指定读取字节的数量。为了能够将缓冲区中所有数据一次性读取出来,我们可以先利用UART子面板中的VISA Serial Port Byte.vi函数来获取当前接收缓冲区中的字节数量,然后再赋给串口读函数即可,如图(3)串口写入
为了简化STM32中的串口数据发送流程,用户直接将字符串或者字节数组放到STM32串口发送缓冲区就可以了,底层的UART控制器会自动执行发送操作。串口写入发送可以利用UART子面板中的VISA Serial Write.vi函数来实现,如图
(4)串口读取
如果在串口初始化的时候没有开启终止符,并且要求读取的字节数小于接收缓冲区现有的字节数,那么返回的字符串长度就会等于指定读取的字节数长度,反之UART控制器会将缓冲区中所有的数据全部返回;当然,如果开启了终止符,那么只会读取终止符之前这些数据,与读取字节数无关。当然,更多情况下,可以先获取缓冲区中的字节数,然后赋给读函数即可。串口读数据可以使用UART子面板中的VISA Serial Read.vi函数实现,如图
(5)清除串口缓冲区
如果接收缓冲区有历史残留的数据,用户在读取之前可以利用UART子面板中的VISA Clear Port.vi函数先清空一下,如图
(6)串口关闭
当STM32进入待机或者休眠模式时,为了减少系统的功耗,需要将串口临时关闭,禁止串口时钟。该功能可以利用UART子面板中的VISA Clear Serial Port.vi函数来完成,如图