ZYNQ-调用自定义AXI接口呼吸灯IP

简介: ZYNQ-调用自定义AXI接口呼吸灯IP

学习内容


本节使用前文实现AXI接口的呼吸灯的IP,挂载到AXI总线调用驱动axi呼吸灯IP。

开发环境


vivado 18.3&SDK

PYNQ-Z2开发板

硬件平台搭建


新建工程,创建 block design。添加呼吸灯IP和ZYNQ7,对zynq进行初始化配置,然后进行自动连接。

image.png

完成自动连线后,

image.png

对AXI接口的led管脚进行引脚引出定义

image.png

完整的平台设计图:

image.png

然后我们进行generate output product 然后生成HDL封装。接着就对应引脚进行引脚约束即可(这里的LED是使用的PL资源,PYNQ的粉色开发板可以直接引用这个约束):

set_property -dict { PACKAGE_PIN R14 IOSTANDARD LVCMOS33 } [get_ports { led }]; #IO_L6N_T0_VREF_34 Sch=led[0]

完成约束后进行综合布局布线,等待生成bit流文件。bit文件生成后在FILE处,点击导出硬件资源(包含bit流文件),接着launch SDK。

软件部分编写


打开SDK后,新建application project。在hw_platform文件夹下,可以找到系统生成的驱动的实例程序,方便我们进行代码的编写调试。

image.png

#define BREATH_LED_IP_mReadReg(BaseAddress, RegOffset) \
    Xil_In32((BaseAddress) + (RegOffset))
#define BREATH_LED_IP_mWriteReg(BaseAddress, RegOffset, Data) \
    Xil_Out32((BaseAddress) + (RegOffset), (u32)(Data))
XStatus BREATH_LED_IP_Reg_SelfTest(void * baseaddr_p);

使用上面的三个函数,我们可以对AXI接口的呼吸灯的IP进行控制。具体的函数的参数数据,数据我们可以在头文件中找到相关说明。

BaseAddress这个参数可以在#include"xparameters.h"中寻到。这里为了方便引用,我们进行了定义#define LED_IP_BASEADDR XPAR_BREATH_LED_IP_0_S0_AXI_BASEADDR

RegOffset可以在#include"breath_led_ip.h"找到,这里我在代码中进行了定义#define LED_IP_REG0 BREATH_LED_IP_S0_AXI_SLV_REG0_OFFSET

Data这里对于写函数来说就是配置我们的寄存器的值,这里我们也就是完成对呼吸灯IP的开关、频率步进等参数的设置。回看前文我们对功能寄存器的设置,这里我仅仅使用了reg0,完成对呼吸灯IP的配置。

reg0[31]设置呼吸灯频率设置使能信号 reg0[0]设置控制开关 reg0[10:1]设置频率

image.png

贴出完整代码:

#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include"xparameters.h"
#include"breath_led_ip.h"
#include "xil_io.h"
#include "sleep.h"
#define LED_IP_BASEADDR XPAR_BREATH_LED_IP_0_S0_AXI_BASEADDR
#define LED_IP_REG0 BREATH_LED_IP_S0_AXI_SLV_REG0_OFFSET
int main()
{
  int led_para=0;
    init_platform();
    //自测LED IP功能是否正常
    BREATH_LED_IP_Reg_SelfTest(LED_IP_BASEADDR);
    sleep(1);
    //reg0[31]设置呼吸灯频率设置使能信号   reg0[0]设置控制开关      reg0[10:1]设置频率
    BREATH_LED_IP_mWriteReg(LED_IP_BASEADDR,LED_IP_REG0,0X800007FF);
    sleep(3);
    BREATH_LED_IP_mWriteReg(LED_IP_BASEADDR,LED_IP_REG0,0X800000AF);
    sleep(3);
    BREATH_LED_IP_mWriteReg(LED_IP_BASEADDR,LED_IP_REG0,0X800007FE);
    sleep(3);
    led_para=BREATH_LED_IP_mReadReg(LED_IP_BASEADDR,LED_IP_REG0);
    if(led_para==0X800007FE){
      print("led off\n\r");
    }
    cleanup_platform();
    return 0;
}

代码完成编写后,成功下载到板子中,首先运行自动生成的测试程序,可以看到串口打印信息成功读写。接着看到我们的LED灯,先快速呼吸闪烁,然后慢速呼吸闪烁,最后关闭LED后通过读取函数读到正确的参数配置值,打印led off信息。

image.png

Vuko公众号同步更新~


欢迎大家关注我的公众号。如果需要工程微信后台留言即可~

目录
相关文章
|
6月前
Rockchip系列之LED状态灯 串口收发数据流程以及控制状态显示(3)
Rockchip系列之LED状态灯 串口收发数据流程以及控制状态显示(3)
137 0
|
编解码
STM32:PWM驱动舵机(内含:1.接线原理图/实物图+2.代码部分+3.补充知识部分)
STM32:PWM驱动舵机(内含:1.接线原理图/实物图+2.代码部分+3.补充知识部分)
1233 1
STM32:PWM驱动舵机(内含:1.接线原理图/实物图+2.代码部分+3.补充知识部分)
|
3月前
|
机器人 异构计算 SoC
实例2:树莓派GPIO控制外部LED灯闪烁
本文是一个关于使用树莓派GPIO控制外部LED灯闪烁的实验教程,介绍了树莓派的基本概念、GPIO接口的使用、RPi.GPIO库的基本操作,以及通过Python编程实现LED灯周期性闪烁的详细步骤和代码示例。
90 1
实例2:树莓派GPIO控制外部LED灯闪烁
|
3月前
|
传感器 机器人 芯片
实例4:树莓派GPIO控制舵机转动
本文是关于使用树莓派GPIO控制舵机转动的实验教程,涵盖了舵机的基本概念、结构、工作原理以及PWM信号控制方法。实验目的是通过Python编程,实现树莓派控制舵机在0°~180°范围内周期性转动。文中提供了详细的实验步骤、代码示例以及舵机调零和校准的方法。
190 1
实例4:树莓派GPIO控制舵机转动
|
4月前
|
数据格式
LabVIEW步进电机的串口控制方法与实现
LabVIEW步进电机的串口控制方法与实现
68 0
|
6月前
串口通信如何控制步进电机转动?
串口通信如何控制步进电机转动?
103 3
|
6月前
|
Linux
Rockchip系列之LED状态灯 以太网收发数据包流程以及控制状态显示(2)
Rockchip系列之LED状态灯 以太网收发数据包流程以及控制状态显示(2)
98 1
|
6月前
|
芯片
动画图解常见串行通讯协议:SPI、I²C、UART、红外分析
动画图解常见串行通讯协议:SPI、I²C、UART、红外分析
153 0
|
测试技术 芯片
初始化串口后,低功耗模式下电流高是怎么回事?
初始化串口后,低功耗模式下电流高是怎么回事?
|
编解码 机器人 芯片
STM32:PWM硬件部分知识点讲解(内含:1.PWM简介+2.PWM波形简介(重点)+参数计算+输出比较模式/通道+3.PWM输出控制舵机+直流电机介绍)
STM32:PWM硬件部分知识点讲解(内含:1.PWM简介+2.PWM波形简介(重点)+参数计算+输出比较模式/通道+3.PWM输出控制舵机+直流电机介绍)
1963 0
STM32:PWM硬件部分知识点讲解(内含:1.PWM简介+2.PWM波形简介(重点)+参数计算+输出比较模式/通道+3.PWM输出控制舵机+直流电机介绍)