PYNQ是赛灵思开发的一个面向创客的板子,其实仔细查下官方的文档操作还是很方便的,但是东西太杂了,,,实在不好找到,下面这篇博客将解决关于PYNQ是uart的使用的部分问题,欢迎大家补充
学习内容
PYNQ的串口使用
开发环境
PYNQ 这里我用的是2.3的官方镜像,jupyter-Notebook
官方文档参考
[https://pynq.readthedocs.io/en/latest/pynq_libraries.html#pynqmicroblaze]
在官方文档中可以看到是这样说的:
PYNQ库
典型的嵌入式系统支持的外围设备的固定组合(例如SPI,IIC,UART,视频,USB)。也可能有一些GPIO(通用输入/输出引脚)可用。GPIO的可用的在CPU基于嵌入式系统的数量通常是有限的,且GPIO也由主CPU控制。作为被管理系统的其余部分的主CPU,GPIO性能通常是有限的。
ZYNQ平台通常比一个典型的嵌入式系统提供更多的IO引脚。专用的硬件控制器和附加软处理器可以在PL中实现,并连接到外部接口。这意味着,这些接口性能比其他嵌入式系统高得多。
PYNQ在Linux上运行它默认使用以下ZYNQ PS外设:SD卡引导系统和宿主Linux文件系统,以太网连接到笔记本Jupyter,UART的Linux终端的接入和USB。
USB端口等标准接口可以用来关断的,现成的USB和其他外围设备连接到该PS ZYNQ在那里他们可以在Python / Linux的控制。该PYNQ图像目前包括最常用的USB摄像头驱动程序,无线外设等标准的USB设备。
其他外围设备可以连接到并从ZYNQ PL访问。例如HDMI,音频,按钮,开关,LED,以及通用接口,包括Pmods,和Arduino的。由于PL是可编程的,可以使用之前,其提供了一种用于这些外设或接口控制器的覆盖必须被加载。
硬件IP的库包含在Vivado其可用于连接到广泛的接口标准和协议。PYNQ提供一个Python API对一些普通外设,包括视频(HDMI IN和OUT),GPIO装置(按钮,开关,指示灯)和传感器和致动器。该PYNQ API还可以扩展到支持额外的IP。
ZYNQ平台通常具有一个或多个报头或接口,其允许外部外围设备的连接,或直接连接到所述ZYNQ PL引脚。关的,现成的外围设备的范围可以连接到PMOD和Arduino的接口。其他外设可以通过适配器连接到这些端口,或用面包板。请注意,虽然外围可以物理地连接到ZYNQ PL销,控制器必须构建覆盖和软件驱动程序提供的,可用于外围之前。
该PYNQ库提供支持,为PynqMicroBlaze子系统,使预编译的应用程序被加载,并且新的应用程序进行创建和编译Jupyter。
PYNQ还提供了一种覆盖的低电平控制包括存储器映射的IO读取/写入,存储器分配(例如,用于使用由PL主)覆盖的,控制和管理(下载的覆盖,在覆盖读取IP支持),以及PL的低电平控制(下载的比特流)。
可以发现在官方的PYNQ Microblaze的库中我们可以找到想要的UART,那么就去这里找找吧
在这个库我们发现了嵌入式的常用的一些驱动协议接口的设置函数
emmm虽然官方库给出来了,但是由于PYNQ的国内的使用者还算少,所以咱们对于他们官方函数的使用还是不清晰,经过本人的不断的试错和朋友的帮助,现在可以完成在PYNQ进行发和收
首先,还是看下官方的说明吧:
UART Devices
This device driver controls a UART master(此设备驱动器控制一个UART主设备)
uart type
Handle to a UART master device.(处理UART主设备)
头文件查到的是这样的 /* * UART API */ typedef int uart;
uart uart_open(unsigned int tx, unsigned int rx)
Open a UART device on the specified pins(打开特定管脚的uart设备)
uart uart_open_device(unsigned int device)
Open a UART device by base address or index(由基地址或索引打开UART设备)
void uart_read(uart dev_id, char* read_data, unsigned int length)
Read a fixed length of data from the UART(读取数据的固定长度从UART)
void uart_write(uart dev_id, char* write_data, unsigned int length)
Write a block of data to the UART(写数据到UART块)
void uart_close(uart dev_id)
Close the handle.(关闭串口)
函数讲解
这里我们需要用到的是uart uart_open(unsigned int tx, unsigned int rx),void uart_read(uart dev_id, char* read_data, unsigned int length),void uart_write(uart dev_id, char* write_data, unsigned int length)
打开串口函数:uart uart_open(unsigned int tx, unsigned int rx)
根据自己的需要设置引脚,这里我们随便设置两个引脚:这个引脚的数字具体参考官方的原理图:我这里设置的是1415
是RPIO_14RPIO_15也就是这里的8和10
串口的接收函数:void uart_read(uart dev_id, char* read_data, unsigned int length)
dev_id:这里是之前uart type,也就是uart_open()函数的返回值
char* read_data:这里是串口接收的数据存储的地址
unsigned int length: 接收的数据是固定长度的,这里是定义接收的字符串长度的
串口的发送函数:void uart_write(uart dev_id, char* write_data, unsigned int length)
dev_id:这里是之前uart type,也就是uart_open()函数的返回值,这里返回值的具体定义还在扒代码。。
char* read_data:这里是串口发送的数据存储的地址
unsigned int length: 发送的数据是固定长度的,这里是定义发送的字符串长度的
代码解读
首先加载官方的overlays,并且把mb.lib包含下:
from pynq.overlays.base import BaseOverlay from pynq.lib import MicroblazeLibrary base = BaseOverlay('base.bit') print('finish')
打开串口
lib = MicroblazeLibrary(base.RPI, ['uart']) device = lib.uart_open(14,15)
串口发送测试:
list2 = [101] for num in range(10,20): lib.uart_write(device,list2, len(list2)) number=[101,110]
这里是我测试的代码,写的可能比较乱,当时只是为测试来着
number=[101,110] flag=0 flag1=0 while(1): if(base.buttons[3].read()==1): if(flag==0): print(number) flag=1 #lib.uart_read(device,number,len(number)) lib.uart_write(device,number,len(number)) lib.uart_read(device,number,len(number)) if(base.buttons[1].read()==1&flag1==0): flag1==1 lib.uart_read(device,number,len(number)) print(number) elif(base.buttons[0].read()==1): break base.rgbleds[5].write(2)
给出一段只接收的代码:
number=[101,110] while(1): lib.uart_read(device,number,len(number))
理论上这样就可以读取长度为2的数据了,
注意:这里读取到的数据都是数字,如果要对字符串进行操作的话,还需要对存数据的列表进行转换操作,后面给出字符串的转换操作
字符串的转换操作
可能比较笨,欢迎py大佬指教
nit_dat=['0','0','.','0','0','c','m','0','0','.','0','C','0','0','0']#初始化传感器数据 rxd_dat=[ord(i) for i in init_dat]#接收数据缓冲区 show_dat=[chr(i) for i in rxd_dat] #使用列表推导式把列表中的单个元素全部转化为str类型 print(show_dat) finalshow_dat= "".join(show_dat) print(finalshow_dat)
暂时先分享这样一个uart使用,后面发掘到别的再继续发文。