ZYNQ研究----(2)基于开发板制作串口测试程序
硬件環(huán)境:TLZ7100開(kāi)發(fā)板
軟件環(huán)境:Vivado 2017.4
工程功能:(1)創(chuàng)建工程,加入IO控制,串口通信
? ? ? ? ? ? ? ? ? ?(2)IO控制方法有MIO、EMIO、AXI總線接口
? ? ? ? ? ? ? ? ? ? (3)加入串口,使用串口發(fā)送指令,控制不同的LED亮滅
暫定串口指令格式:<1,on> <1,off>
IO控制路數(shù):
LED1? ?A24? ??PS_MIO9
LED2? C7? ? ? ?IO_L4P_T0_34
LED3? H8? ? ??IO_L15N_T2_DQS_34
KEY1? ?F24? ?PS_MIO0
串口?
TX??PS_MIO12
RX???PS_MIO13
?
步驟:1、創(chuàng)建Vivado工程,芯片選擇xc7z100ffg900-2
2、創(chuàng)建Block Design
3、添加ZYNQ
4、更改ZYNQ配置參數(shù)
?5、DDR選擇
6、點(diǎn)擊Run Block Auto
7、點(diǎn)擊Creat HDL Wrapper
8、點(diǎn)擊Generate Bitstream
9、點(diǎn)擊File->Export->Export Hardware
10、點(diǎn)擊File->Launch SDK
11、打開(kāi)SDK后,選擇File->New->Application project,選擇helloword例程
12、可以看到加載的系統(tǒng)地址分配表
同時(shí)IP對(duì)應(yīng)的參數(shù)配置會(huì)自動(dòng)生成xparameters.h文件,如下圖,此次例化了uart1,因此此處的串口收發(fā)指向串口1
13、在main.c中加入如下代碼
#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
u8 u8RecData[10] = {0,};
u8 u8Cnt = 0;
#include "xgpiops.h"
#include "sleep.h"
XGpioPs GpioPs_Init()
{
?? ?XGpioPs_Config* GpioConfigPtr;
?? ?XGpioPs psGpioInstancePtr;
?? ?GpioConfigPtr = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);
?? ?XGpioPs_CfgInitialize(&psGpioInstancePtr, GpioConfigPtr, GpioConfigPtr->BaseAddr);
?? ?return psGpioInstancePtr;
}
int main()
{
? ? init_platform();
? ? static XGpioPs psGpioInstancePtr;
?? ?int iPinNumber = 9; ? ? ? //MIO9,與LED相連
?? ?u32 uPinDirection = 0x1; //1表示輸出,0表示輸入
?? ?psGpioInstancePtr = GpioPs_Init(psGpioInstancePtr); ? //GPIO初始化
?? ?XGpioPs_SetDirectionPin(&psGpioInstancePtr, iPinNumber, uPinDirection); //MIO9配置為輸出
?? ?XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, iPinNumber, 1); ? //使能MIO9
?? ?print("UART-LED Test\n\r");
? ? while(1)
? ? {
?? ??? ?while(XUartPs_RecvByte(STDOUT_BASEADDRESS) != '<')
?? ??? ?{
?? ??? ??? ?;
?? ??? ?}
?? ??? ?u8RecData[0] = '<';
?? ??? ?u8Cnt = 1;
? ? ?? ?while(1)//回車
? ? ?? ?{
? ? ?? ??? ?u8RecData[u8Cnt] = XUartPs_RecvByte(STDOUT_BASEADDRESS);
? ? ?? ??? ?if(u8RecData[u8Cnt] == 13)
? ? ?? ??? ?{
? ? ?? ??? ??? ?break;
? ? ?? ??? ?}
? ? ?? ??? ?u8Cnt++;
? ? ?? ?}
?? ??? ?if(u8RecData[1] == '1')
?? ??? ?{
?? ??? ??? ?if(u8RecData[2] ==',')
?? ??? ??? ?{
?? ??? ??? ??? ?if(u8RecData[3] == 'o')
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?if(u8RecData[4] == 'n')
?? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ?XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber, 1); //點(diǎn)亮
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ?else
?? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ?XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber, 0); //熄滅
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ?}
?? ??? ??? ?}
? ? ?? ?}
? ? }
? ? cleanup_platform();
? ? return 0;
}
14、添加RUN->Debug configurations
15、 點(diǎn)擊Debug,進(jìn)入調(diào)試模式
16、點(diǎn)擊Debug全速運(yùn)行,在SecureCRT輸入<1,on>,LED1亮,輸入<1,off>,LED1滅。
?
加入EMIO
1、在Vivado中雙擊ZYNQ核,更改為下圖所示
2、右擊.bd文件,選擇Creat HDL Wrapper生成頂層文件
3、 加入約束,選擇
4、點(diǎn)擊creat file,生成.xdc文件
寫(xiě)入
set_property PACKAGE_PIN C7 [get_ports GPIO_0_0_tri_io[0]]
set_property IOSTANDARD LVCMOS15 [get_ports GPIO_0_0_tri_io[0]]
5、點(diǎn)擊生成bit文件
6、導(dǎo)入到硬件,打開(kāi)SDK
7、重新加載工程,刪除工程(不刪除bsp和plantform)
8、創(chuàng)建新的app proj,選擇helloword,將helloword.c更改為
#include <stdio.h>
#include "platform.h"
#include "sleep.h"
#include "xgpiops.h"
#include "xil_printf.h"
u8 u8RecData[10] = {0,};
u8 u8Cnt = 0;
XGpioPs GpioPs_Init()
{
?? ?XGpioPs_Config* GpioConfigPtr;
?? ?XGpioPs psGpioInstancePtr;
?? ?GpioConfigPtr = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);
?? ?XGpioPs_CfgInitialize(&psGpioInstancePtr, GpioConfigPtr, GpioConfigPtr->BaseAddr);
?? ?return psGpioInstancePtr;
}
int main()
{
? ? init_platform();
? ? static XGpioPs psGpioInstancePtr;
?? ?int iPinNumber = 9; ? ? ? //MIO9,與LED相連
?? ?int iPinNumber_EMIO = 54; ? ? ? //EMIO0,與LED相連
?? ?u32 uPinDirection = 0x1; //1表示輸出,0表示輸入
?? ?psGpioInstancePtr = GpioPs_Init(psGpioInstancePtr); ? //GPIO初始化
?? ?XGpioPs_SetDirectionPin(&psGpioInstancePtr, iPinNumber, uPinDirection); //MIO9配置為輸出
?? ?XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, iPinNumber, 1); ? //使能MIO9
?? ?XGpioPs_SetDirectionPin(&psGpioInstancePtr, iPinNumber_EMIO, uPinDirection); //EMIO0配置為輸出
?? ?XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, iPinNumber_EMIO, 1); ? //使能EMIO0
?? ?print("UART-LED Test\n\r");
? ? while(1)
? ? {
?? ??? ?while(inbyte() != '<')
?? ??? ?{
?? ??? ??? ?;
?? ??? ?}
?? ??? ?u8RecData[0] = '<';
?? ??? ?u8Cnt = 1;
? ? ?? ?while(1)//回車
? ? ?? ?{
? ? ?? ??? ?u8RecData[u8Cnt] = inbyte();
? ? ?? ??? ?if(u8RecData[u8Cnt] == 13)
? ? ?? ??? ?{
? ? ?? ??? ??? ?break;
? ? ?? ??? ?}
? ? ?? ??? ?u8Cnt++;
? ? ?? ?}
?? ??? ?if(u8RecData[1] == '1')
?? ??? ?{
?? ??? ??? ?if(u8RecData[2] ==',')
?? ??? ??? ?{
?? ??? ??? ??? ?if(u8RecData[3] == 'o')
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?if(u8RecData[4] == 'n')
?? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ?XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber, 1); //點(diǎn)亮
?? ??? ??? ??? ??? ??? ?XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber_EMIO, 1);//EMIO的第0位輸出1
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ?else
?? ??? ??? ??? ??? ?{
?? ??? ??? ??? ??? ??? ?XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber, 0); //熄滅
?? ??? ??? ??? ??? ??? ?XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber_EMIO, 0);//EMIO的第0位輸出0
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ?}
?? ??? ??? ?}
? ? ?? ?}
? ? }
? ? cleanup_platform();
? ? return 0;
}
9、將bit文件下載至FPGA
選擇Debug configurations,設(shè)置如下
10、點(diǎn)擊debug,在SecureCRT輸入<1,on>,LED1、LED2亮,輸入<1,off>,LED1、LED2滅。
AXI總線掛載IO控制LED閃爍
1、加入AXI GPIO
2、選擇輸出,1位
?3、點(diǎn)擊自動(dòng)連線
4、生成頂層文件
5、加入引腳約束,見(jiàn)下
set_property PACKAGE_PIN C7 [get_ports GPIO_0_0_tri_io[0]]
set_property IOSTANDARD LVCMOS15 [get_ports GPIO_0_0_tri_io[0]]
set_property PACKAGE_PIN H8 [get_ports gpio_rtl_0_tri_o[0]]
set_property IOSTANDARD LVCMOS15 [get_ports gpio_rtl_0_tri_o[0]]
6、生成bit文件
7、導(dǎo)出到硬件
8、打開(kāi)SDK
9、更改helloword.c代碼如下
#include <stdio.h> #include "platform.h" #include "sleep.h" #include "xgpiops.h"//emio #include "led_ip.h"//自定義IP #include "xil_printf.h" #include "xgpio.h" //axi_gpio#define XPAR_LEDS_ID XPAR_LED_GPIO_BASEADDR //led_gpio #define LED_CHANNEL 1u8 u8RecData[10] = {0,}; u8 u8Cnt = 0;XGpioPs GpioPs_Init() {XGpioPs_Config* GpioConfigPtr;XGpioPs psGpioInstancePtr;GpioConfigPtr = XGpioPs_LookupConfig(XPAR_PS7_GPIO_0_DEVICE_ID);XGpioPs_CfgInitialize(&psGpioInstancePtr, GpioConfigPtr, GpioConfigPtr->BaseAddr);return psGpioInstancePtr; }int main() {static XGpio LED_Ptr;//定義GPIO指針int XStatus;init_platform();static XGpioPs psGpioInstancePtr;int iPinNumber = 9; //MIO9,與LED相連int iPinNumber_EMIO = 54; //EMIO0,與LED相連u32 uPinDirection = 0x1; //1表示輸出,0表示輸入psGpioInstancePtr = GpioPs_Init(psGpioInstancePtr); //GPIO初始化XGpioPs_SetDirectionPin(&psGpioInstancePtr, iPinNumber, uPinDirection); //MIO9配置為輸出XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, iPinNumber, 1); //使能MIO9XGpioPs_SetDirectionPin(&psGpioInstancePtr, iPinNumber_EMIO, uPinDirection); //EMIO0配置為輸出XGpioPs_SetOutputEnablePin(&psGpioInstancePtr, iPinNumber_EMIO, 1); //使能EMIO0XStatus = XGpio_Initialize(&LED_Ptr,XPAR_AXI_GPIO_0_DEVICE_ID);//初始化 LEDif(XST_SUCCESS != XStatus)print("GPIO INIT FAILED\n\r");XGpio_SetDataDirection(&LED_Ptr, LED_CHANNEL,0x00);//通道1;設(shè)置方向 0 輸出 1輸入, 0x00表示8位都是輸出print("UART-LED Test\n\r");while(1){while(inbyte() != '<'){;}u8RecData[0] = '<';u8Cnt = 1;while(1)//回車{u8RecData[u8Cnt] = inbyte();if(u8RecData[u8Cnt] == 13){break;}u8Cnt++;}if(u8RecData[1] == '1'){if(u8RecData[2] ==','){if(u8RecData[3] == 'o'){if(u8RecData[4] == 'n'){XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber, 1); //點(diǎn)亮XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber_EMIO, 1);//EMIO的第0位輸出1//LED_IP_mWriteReg(XPAR_LED_IP_0_LED_AXI_BASEADDR,0,1);XGpio_DiscreteWrite(&LED_Ptr, LED_CHANNEL,0x01); //led8寫(xiě)入1}else{XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber, 0); //熄滅XGpioPs_WritePin(&psGpioInstancePtr, iPinNumber_EMIO, 0);//EMIO的第0位輸出0//LED_IP_mWriteReg(XPAR_LED_IP_0_LED_AXI_BASEADDR,0,0);XGpio_DiscreteWrite(&LED_Ptr, LED_CHANNEL,0x00); //led寫(xiě)入0}}}}}cleanup_platform();return 0; }10、編譯,生成.eif文件
11、進(jìn)入debug,需要注意,此時(shí)要勾選對(duì)FPGA的bit文件燒寫(xiě)
12、全速運(yùn)行
13、在SecureCRT輸入<1,on>,LED1、LED2、LED3亮,輸入<1,off>,LED1、LED2、LED3滅。
總結(jié)
以上是生活随笔為你收集整理的ZYNQ研究----(2)基于开发板制作串口测试程序的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 苦练IoT应用开发,还能加速变现,这个机
- 下一篇: 写给我弟