我是靠谱客的博主 故意菠萝,最近开发中收集的这篇文章主要介绍PYNQ-关于PYNQ的UART的使用(RPI接口)学习内容开发环境官方文档参考函数讲解代码解读字符串的转换操作,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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)

根据自己的需要设置引脚,这里我们随便设置两个引脚:这个引脚的数字具体参考官方的原理图:我这里设置的是14 15
RPIO_14 RPIO_15也就是这里的810
在这里插入图片描述

串口的接收函数: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使用,后面发掘到别的再继续发文。

最后

以上就是故意菠萝为你收集整理的PYNQ-关于PYNQ的UART的使用(RPI接口)学习内容开发环境官方文档参考函数讲解代码解读字符串的转换操作的全部内容,希望文章能够帮你解决PYNQ-关于PYNQ的UART的使用(RPI接口)学习内容开发环境官方文档参考函数讲解代码解读字符串的转换操作所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(56)

评论列表共有 0 条评论

立即
投稿
返回
顶部