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 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使用,後面發掘到別的再繼續發文。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章