ZYNQ UARTLite接收不定长数据
UARTLite接收不定長數(shù)據(jù)
1. Vivado建立UARTLite的IP核工程
(不做介紹,過程略)
2. 創(chuàng)建SDK或vitis應(yīng)用工程
(不做介紹,過程略)
3. 添加UARTLite官方例程xuartlite_intr_example
(不做介紹,過程略)
4. 編譯、燒寫,驗證硬件是否OK
5. 分析官方例程
官方例程xuartlite_intr_example是打開中斷,將發(fā)送引腳與接收引腳短接,如果接收的數(shù)據(jù)長度等于發(fā)送的數(shù)據(jù)長度,且接收數(shù)據(jù)等于發(fā)送數(shù)據(jù),則例程運(yùn)行正常。
例程中沒有給出中斷處理函數(shù),而是給出了將自定義封裝到發(fā)送完成或接收完成中斷的函數(shù)。
尋找XUartLite_SetRecvHandler函數(shù)聲明的位置,在xuartlite_intr.c中,
這個函數(shù)將用戶函數(shù)送入了結(jié)構(gòu)體中的RecvHandler中,在xuartlite_intr.c中尋找調(diào)用RecvHandler的函數(shù),找到ReceiveDataHandler函數(shù)。
我們再看看誰調(diào)用了ReceiveDataHandler函數(shù),原來是XUartLite_InterruptHandler函數(shù),它應(yīng)該就是xUARTLite的中斷函數(shù)本尊了。
這個函數(shù)很簡單,就是發(fā)生發(fā)動或接收中斷,就調(diào)用對應(yīng)的函數(shù)。接下來我們回到ReceiveDataHandler函數(shù)。
這個函數(shù)可以分為三部分:
第一部分,判斷接收緩存剩余要接收的字節(jié)數(shù)是否為0(也就是是否接收到指定字節(jié)長度的數(shù)據(jù))。
如果還沒有達(dá)到指定長度,會跳到XUartLite_ReceiveBuffer函數(shù),接收剩余字節(jié),直到接收FIFO為空。(不管是否接收完畢)。
第二部分,判斷接收數(shù)據(jù)緩存是否為0,如果為零,則調(diào)用用戶自定義的中斷函數(shù)RecvHandler,并將回調(diào)函數(shù)和已經(jīng)接收到的字節(jié)長度發(fā)送到該中斷函數(shù)。
第三部分,記錄中斷次數(shù)。
7. 修改官方源文件xuartlite_intr.c。
經(jīng)過前邊的介紹,我們可以知道只要修改ReceiveDataHandler函數(shù)的第二部分即可實(shí)現(xiàn)不定長數(shù)據(jù)的接收。修改方法為,將剩余字節(jié)數(shù)的判斷去掉,直接執(zhí)行用戶中斷函數(shù)RecvHandler的調(diào)用。
對于例程中給出的自定義函數(shù),我們可以增加一個接收標(biāo)志的置位,
8. 編譯、燒寫,測試功能。
總結(jié)
以上是生活随笔為你收集整理的ZYNQ UARTLite接收不定长数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: xil_printf打印遇到的问题
- 下一篇: 第2章 信号、接口和引脚(XIlinx