ZYNQ系列的实用奇葩操作(6)--PS-PL互联之裸机下操作AXI外设

上一章节我们在PL端实现了一个自定义外设,本节描述如何在裸机环境下控制这个外设(这里指没有开启MMU功能的条件下,比如一般使用FreeRTOS不会开启MMU,也可用本篇文章的方式操作)。

    还记得之前讲的CPU指针和CPU的Memory Map吗?现在需要把这些知识掏出来用啦。

   同样地,VIVADO可以很贴心的分配地址。既然地址这么重要,那就给个特写吧:

图片

       记住这里面的Master Base Address=0x4000_0000,这是CPU访问这个外设的基地址。

    后面建立一个hello word裸机工程。常规操作,直接跳过。外设对应的地址可以在两个地方体现:

 在Hardware Platform Specification里显示出了接口类型和基地址:

图片

xparameters.h文件里也定义了CPU对应所有外设的基地址。

图片

   XPAR_MYIP_V1_0_S00_AXI_0_BASEADDR就是刚才VIVADO分配的自定义外设的基地址。有了地址就可以点灯了:

图片

图片

核心语句是:

p_axi_reg0 = (uint32_t *)XPAR_MYIP_V1_0_S00_AXI_0_BASEADDR;

      上述代码是将AXI外设寄存器的地址赋值给p_axi_reg0这个指针,结合之前几章的知识可知对这个指针指向的地址的读写操作就会对应到PL端的slv_reg寄存器的读写操作。

   以上代码从功能上讲是对的,从移植性来讲还差点:

    1.地址赋值使用的是固定的(uint32_t *),ZYNQ是32位CPU这样操作没有问题,但在ZYNQ MPSOC这种64位的CPU上需要使用(uint64_t *),我们要尽量写和架构无关代码(这也是每个SDK都会将C语言标准的integer、short integer、char等类型重新typedef一遍的原因,这些重定义可不是闲的没事干)。

    2.每个寄存器的每一位对应的含义都是存在开发人员大脑里的,不满足好的代码需要能解释自身的要求

    

图片

   

    怎么办呢?作为一个老油条要有老油条的油脂对吧?

    玩过单片机和内核驱动的小伙伴都知道外设使用了结构体这种神器来描述,我们也来抄一抄:

    

图片

    这样的代码含油量一下就提起来了~

  本篇文章终于将之前的理论打穿到实操,小伙伴们加油,后面一篇讲如何在LINUX下使用这个外设。

公众号:嵌入通信的砖 每周更新嵌入式技术

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值