前阵子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个灯
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 <stdio.h>
#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文件,没事,可以删掉,重新生成应该是新的了,可以查看有无新的引脚