microblaze使用

前阵子LD要求,做一个项目的microblaze部分。

特意写个记录一下调试过程,记录过程中遇到的坑:

1.问题1:xil_printf 替代printf打印

裸机vitis调试的时候,发现串口打印不正常,后面定位到是这个打印函数的问题。

2.问题2:microblaze导出始终有问题,导出的uartlite的打印乱码

同事帮忙定位到是开发板的时钟选择错误

3.microblaze导出AXI GPIO点灯功能

Block Design里面选择microblaze和AXI GPIO,AXI GPIO的宽度是灯的数量,即数据宽度为7是对应7个灯

microblaze使用_第1张图片

4.点灯参考代码,参考的链接是MicroBlaze:Xilinx官方软核学习与一些实验测试_microblaze 编译后 程序存储-CSDN博客

#include "xparameters.h"
#include "xgpio.h"
#include "xil_printf.h"
#include "sleep.h"
#define LED_ID XPAR_GPIO_0_DEVICE_ID // led器件ID
#define LED_CHANNEL 1                // LED通道
XGpio Gpio; // GPIO实例

int main(void)
{
    int i = 0;
    xil_printf("GPIO LED TEST\n\r");
    // 初始化GPIO
    XGpio_Initialize(&Gpio, LED_ID);
    // 为指定的信道设置方向 ,0 输出 ,1输入
    XGpio_SetDataDirection(&Gpio, LED_CHANNEL, 0);
    while (1)
    {
        // 向指定通道写入数据,LED每0.5秒流转一次
        XGpio_DiscreteWrite(&Gpio, LED_CHANNEL, 0x01 << i);
        // 循环计数,表示第几个灯亮
        if (i == 3)
            i = 0;
        else
            i = i + 1;
        // 延时0.5秒
        usleep(500000);
    }
    return 0;
}

5.如果发现vitis编译的microblaze始终编译不过的时候

多半是因为对于zynq7000系列的microblaze项目,需要添加PS部分(即使不使用)。可以添加个zynq核,但不使用即可,编译生成wrapper,重新导入vitis。

6.读写寄存器

// 参考代码
#include 
#include "platform.h"
#include "xil_io.h"
#include "xparameters.h"
#include "xil_printf.h"
int main(void)
{
    int word1,word2,word3,word4;
    int offset = 0x14000;
    int addr = 0;
    addr = XPAR_USP_RF_DATA_CONVERTER_0_BASEADDR + offset + 0x8;
    Xil_Out16(addr, 0xb);//写寄存器
    word1 = Xil_In32(addr);//读寄存器
    xil_printf("0x%08x , baseaddr = 0x%08x, Word1 = 0x%08x\n\r", 8, addr, word1);
    return(0);
}

7.目前自己写的vivado工程有问题,查一下,时钟也修改过了

主要是没有create新的wrapper,导致里面的gpio其实没有生成最新的,绑定xdc没用到

在生成新工程时使用的是vivado->file->save as新工程,重新generate会导致多生成wrapper文件,没事,可以删掉,重新生成应该是新的了,可以查看有无新的引脚

你可能感兴趣的:(单片机,嵌入式硬件,linux)