PYNQ-关于PYNQ的UART的使用(RPI接口)

简介: 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,那么就去这里找找吧

image.png

在这个库我们发现了嵌入式的常用的一些驱动协议接口的设置函数

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也就是这里的810

image.png

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

目录
相关文章
|
19天前
|
Java Android开发
Rockchip系列之客制化GPIO接口应用部分(5)
Rockchip系列之客制化GPIO接口应用部分(5)
13 0
|
19天前
|
存储 Linux 开发工具
Rockchip系列之浅度分析UART接口系列(1)
Rockchip系列之浅度分析UART接口系列(1)
52 1
|
19天前
|
存储 Android开发
Rockchip系列之客制化GPIO接口Driver部分(2)
Rockchip系列之客制化GPIO接口Driver部分(2)
16 0
|
Perl
PYNQ-关于PYNQ的GPIO的使用(RPI接口和arduino接口)或者常用的IO设备(如UART SPI IIC TIMER)
PYNQ-关于PYNQ的GPIO的使用(RPI接口和arduino接口)或者常用的IO设备(如UART SPI IIC TIMER)
507 0
PYNQ-关于PYNQ的GPIO的使用(RPI接口和arduino接口)或者常用的IO设备(如UART SPI IIC TIMER)
|
2月前
|
存储 缓存 芯片
STM32--USART串口
STM32--USART串口
|
11月前
|
移动开发 API
STM32使用HAL库操作GPIO
使用HAL库的优点在于不用手动添加初始化的代码了,CubeMX会根据软件设置自动生成
151 0
|
12月前
|
XML 测试技术 网络安全
开发工具:USB转IIC/I2C/SPI/UART适配器模块可编程开发板
总的思路是通过USB或者UART接口发送一些协议字符串,由模块转换成上面几种接口的硬件时序电信号,实现与这几种接口芯片、设备的快速测试。 首先声明一下,大家都是搞硬件开发的,这几种接口当然是很简单的事,但有些时候对于一个新的设备或者芯片的测试,有个现成的工具当然更顺手,节省时间,也更可靠嘛。
|
存储 芯片 异构计算
|
传感器
STM32的HAL库开发系列 - GPIO基本函数
STM32的HAL库开发系列 - GPIO基本函数
192 0