串口V2版本与串口V1版本很相似,特别是在用户使用体验上,基本感受不到有太大的变化,也是希望用户能够由V1到V2进行平滑过渡。具体的串口V1和V2的改动变化说明,还请详见串口框架V1和V2版本对比 以及 UART 设备 v2 版本 。
目前串口V2版本已经适配了STM32L475-Pandora的BSP,且默认使用的是V2版本;串口V2也适配到了ART-PI的开发板的serial_lab分支上,有ART-PI的小伙伴也可切换到该分支尝试使用。
如文章开题,这篇文章主要讲解如何适配串口V2驱动,下面以STM32F411RE-NUCLEO的BSP为例,讲解如何快速适配到该开发板上(本文示图较多,但过程并不复杂)。
从 gitee 或者github 下载。(使用gitee的小伙伴需要注意,使用仓库的分支是 master
而不是默认的 gitee_master
)
下载到本地后,切换到master分支,找到STM32F411-ST-NUCLEO的目录下:使用env工具打开menuconfig
的配置界面。
进入到 RT-Thread Components -> Device Drivers ->
下,如下图所示,可以看到关于串口的配置已经发生了变化。
再进入USING Serial device drivers ->
里面可以看到的配置信息如下图所示:
这里是默认选择使用的串口V1版本,我们切换到V2版本(如有需要,可一并使能上DMA模式)。如下所示:
然后需要修改board/Kconfig
文件,因为串口V1和V2的宏定义方面的区别有一部分是关于串口缓冲区和DMA的参数配置,这些配置文件就在board/Kconfig
文件里编写,如下图所示:
下面主要修改的就是红线框内的代码,当然啦,有模板的,可以参照stm32l4475-pandora
的BSP的Kconfig文件去编写。拿个比较工具对比下看看:
以左侧的UART1和右侧的串口2为例,左图的串口1配置参数有BSP_UART1_RX_USING_DMA
、BSP_UART1_TX_USING_DMA
、BSP_UART1_RX_BUFSIZE
、BSP_UART1_TX_BUFSIZE
这些。
那么好办了,就直接将对应的参数修改下改为右侧的串口2就行了。同理串口6也照抄一份上去,如图所示:
注意:关于FinSH控制台的配置,也就是F411上的串口2,其发送的配置参数一定是buffer为0,即轮询模式,接收的配置参数最好选择中断模式,即不配置DMA接收模式。
执行完上述配置就可以直接编译代码了,重新打开menuconfig
,查看串口2的相关配置:这里选择不使用DMA,并将串口发送设置为轮询模式(轮询模式即TX Buffer为0)。如果是使用串口6的DMA配置,那就在相关的配置界面开启DMA使能即可,这里不再演示。
然后保存并执行scons --target=mdk5
,在MDK5上打开并编译,结果报了一个错:
这是因为串口驱动里面未对USART3进行配置,却直接使用了该宏定义,简单一点,直接用宏判断处理一下即可(也可先删除掉这部分代码):
然后再进行编译即 0 Error(s) , 0 Warning(s)
。然后再下载即可。
按照上述的过程,即完成了串口V2版本的适配工作,整体来讲主要就是三步:
在Device Drivers
切换串口V2版本
编写board/Kconfig
的串口配置文件
编译下载
整体来讲是比较简单的,相信小伙伴花费几分钟就可以适配成功。关于在RT-Thread-Studio 上适配的过程与此类似,就不再赘述了,有任何疑问,可以参照STM32L475-Pandora的BSP作为模板,或者私信本人。
更多文章:
RTT串口V1版本的使用分析及问题排查指南(一)
RTT串口V1版本的使用分析及问题排查指南(二)
RTT串口V1版本的使用分析及问题排查指南(三)
串口框架V1和V2版本对比
串口 V2 适配指南
大佬威武
大佬威武
大佬NB!
作者老铁你好,我在使用V2版本的Uart串口时遇到了一个很奇怪的问题:
Uart1-2使用该版本可以正常驱动工作,但是Uart3却无法正常发送数据(可接收)。Uart1、Uart3都是无负载的,TTL转USB直接连接MCU引脚与电脑进行数据收发。
而在使用老版本时,Uart3可以进行正常收发。请问作者老铁,能不能确定一下这个问题?
@itdreamworks
是不是这个图片中描述的uart3的条件编译出的问题呢? 除此之外,uart3和其他串口没有太多区别。兄弟可以试下,有问题反馈出来。
serial_v2 里
使用 serial_v2 版本,如果设置给控制台串口 BSP_UARTx_TX_BUFSIZE 设置不为 0,会在启动打印版本信息时卡死。
原因是该配置下 _serial_fifo_tx_blocking_buf() 函数会在写入发送 fifo 后调用 rt_wait_completion() 进行等待。这导致系统启动时打印版本信息函数 rt_show_version() 会调用 rt_wait_completion() 函数,而该函数必须在线程中进行调用,否则其中的 rt_thread_suspend 将传入 NULL 值导致参数断言错误。
@myLLgf 嗯嗯,目前控制台只能设置为无缓冲区的模式,可以看这部分,配置发送轮询模式、接收中断模式(串口控制台默认模式)
请问我把给控制台串口的发送缓冲区设置成0,怎么还是卡死?
我调试时发现,rt_console_set_device函数执行完成后,在打印输出时,串口设备serial的ops内指针全部指向0,可看下图
导致每次执行
serial->ops->putc(serial, *putc_buffer);
单片机马上死机退出调试模式。我用的4.04的完整版包开发,uart1作为打印输出,发送为阻塞模式,缓冲区已设置成0。请问大神还需要哪里修改配置啊?
铁子,你这只是适配特定的开发板,那以芯片创建的工程怎么适配呢,我看了下工程结构,以芯片创建的工程里面有几个都找不到你上面写的。
@chen707070yi 试一下,设置发送为非阻塞模式。控制台串口的发送缓冲区设置成非0。:
modify
to
添加
#define RT_DEVICE_FLAG_TX_NON_BLOCKING 0x8000
in rtdef.h注释
/* #define RT_DEVICE_FLAG_TX_NON_BLOCKING 0x8000 */
in serial_v2.h解决了吗,我想以我原来写的V1框架的升级到v2,怎么弄@吕蛋蛋