本帖最后由 不爱胡萝卜的仓鼠 于 2024-10-3 15:17 编辑
串口是开发板与外界通讯的很重要的一个外设,日志输出、与其他设备通讯交互都会用到,因此在点灯之后,我们就来看看串口的使用
一.K230 UART资源介绍及开发板串口引出情况
根据官网的框图和datasheet介绍可以得知,K230有5个串口
-
UART
-
Support 5 UART interface
-
9-bit serial data support
-
False start bit detection
-
Programmable fractional baud rate support
-
APB data bus widths of 32
-
Additional DMA interface signals for compatibility with DMA interface, DMA interface signal active low
-
Transmit and receive FIFO depths of 32, Supports 32x32-bit transmit first-in, first-out (FIFO) and 32x32-bit RX FIFO, Internal FIFO (RAM)
-
Busy functionality
-
Functionality based on the 16550 industry standard
-
Programmable character properties, such as:
-
Number of data bits per character (5-8)
-
Optional parity bit (with odd, even select or Stick Parity)
-
Number of stop bits (1, 1.5 or 2)
-
Line break generation and detection
-
DMA signaling with two programmable modes
-
Prioritized interrupt identification
-
Programmable FIFO enable/disable
-
Separate system resets for each clock domain to prevent metastability
其中UART0被小核sh占用,UART3被大核sh占用。留给用户的为UART1,UART2,UART4
这5个串口对应的引脚如下
接下来我们看看开发板关于串口引出了哪些,开发板正面把串口0、1、3引出了,如下图所示
背面把串口2引出了
还有串口4没有被引出,串口4对应的引脚是48、49。我看了一下开发板的原理图,这两个引脚被0号摄像头占用了
二.日志输出
串口一个很重要的功能就是日志输出,在K230调试过程中如果我输出日志怎么办?需要特别为了串口占用一个串口硬件吗?会不会有点浪费。设计师已经考虑到这个问题了,还记得在第一篇文章中提到的,开发板插上电脑就会出现一个盘符还有一个串口。对喽,这个串口就是一个虚拟串口,我们就可以通过它输出日志了。
使用这个虚拟串口输出日志也非常简单只需要使用printf函数即可,测试代码如下
#输出文本
print("test")
#输出变量
name = "01Studio CanMV K230"
print(f"开发板名称: {name}")
year = 2024
month = 9
day = 30
print(f"日期: {year}-{month}-{day}")
在IDE中就有这个虚拟串口的输出框,我们可以直接使用。结果如下
三.串口收发
串口还有一个作用就是和其他开发板或者上位机通讯,这里我们就来实现一下串口数据的收发。我直接使用背面的串口2,与CH340接线如下
这里我非常想吐槽一下,这个附赠的线的线序太坑爹了,红黑线的线序是反的,如果接线前不看线序,按照默认规则把黑色接到GND上就短路了!(拍完照片后,我就把线序调整了,后续如果有这根线的照片,那就是已经调整过线序的了)
嘉楠官方关于UART的文档:https://developer.canaan-creative.com/k230_canmv/main/zh/api/machine/K230_CanMV_UART%E6%A8%A1%E5%9D%97API%E6%89%8B%E5%86%8C.html
我们参考这个文档写一个测试代码。先测试串口数据的发送,然后一直接收数据,把收到的数据从日志串口和串口2发出去。代码如下
这里需要注意一定要在开发板通电后调用一次fpioa.set_function函数,把引脚功能配置为串口,否则串口功能是不会生效的
from machine import UART
from machine import FPIOA
import time
fpioa = FPIOA()
#初始化串口2
fpioa.set_function(11,FPIOA.UART2_TXD)
fpioa.set_function(12,FPIOA.UART2_RXD)
my_uart = UART(UART.UART2, baudrate=115200, bits=UART.EIGHTBITS, parity=UART.PARITY_NONE, stop=UART.STOPBITS_ONE)
#发送数据测试
my_uart.write('UART2 send test\r\n')
#一直接收数据
while True:
#读取一行,并以一个换行符结束。
recv_data = my_uart.readline()
#如果有读到数据
if recv_data != b'':
#把收到数据通过日志串口打印出来
print(recv_data)
#把收到的数据原样从串口2发出去
my_uart.write(recv_data)
time.sleep(0.1)
结果如下