Xilinx AX7103 MicroBalze学习笔记——MicroBlaze 串口中断实验

本文转载自:Linest-5的CSDN博客
注:本文由作者授权转发,如需转载请联系作者本人

实验任务
利用 UART IP 以及 AXI Interrupt Contriller IP 实现通过串口发送数据产生中断,控制器接收到中断并将串口发送出来的数据重新通过串口打印出来。

实验框图
实验框图比较简单,相比较 hello world 的实验,只添加了一个中断 AXI Interrupt Contriller IP,用于实现接收串口的中断,并反馈给控制器。

硬件设计(Vivado部分)
新建工程
将原有的 Hello World 实验工程另存为,命名为 uart_intr 保存

Block Design搭建
打开 block design,添加中断 AXI Interrupt Contriller IP,并将 uart IP 中的中断信号接到中断IP上,其余自动连线即可。


最后重新 Generate Output Products 并生成顶层文件,约束文件保持不变。

重新生成比特流文件,并导入到 SDK,启动 SDK 进行软件部分的设计。

软件设计(SDK部分)
新建工程
进入到 SDK 的开发界面中,新建一个工程文件,命名为 uart_intr,并在工程中新建一个设计文件命名为main.c。

代码部分

在.c文件中将以下代码拷贝进去。

程序的大致过程为:

  • 初始化串口、控制器等
  • 配置设备的参数
  • 串口发送信息
  • 中断控制器接收到串口中断并将其传递给主控制器
  • 控制器将接收到的信息通过串口重新发送出去
  • #include "xil_exception.h"
    #include "xdebug.h"
    #include "xparameters.h"
    #include "xintc.h"
    #include "xuartlite.h"
    #include "xuartlite_l.h"

    #define UART_DEVICE_ID XPAR_UARTLITE_0_DEVICE_ID //串口器件 ID
    #define UART_INTR_ID XPAR_INTC_0_UARTLITE_0_VEC_ID //串口中断 ID
    #define INTC_ID XPAR_INTC_0_DEVICE_ID //中断控制器 ID

    #define RX_NOEMPTY XUL_SR_RX_FIFO_VALID_DATA // 接收 FIFO 非空

    static XIntc Intc; //中断控制器实例
    static XUartLite Uart; //串口实例

    void uart_handler(void *CallbackRef);

    int main(void){
    //初始化串口设备
    XUartLite_Initialize(&Uart , UART_DEVICE_ID);
    //初始化中断控制器
    XIntc_Initialize(&Intc, INTC_ID);
    //关联处理函数
    XIntc_Connect(&Intc, UART_INTR_ID,(XInterruptHandler)uart_handler,&Uart);
    //使能串口
    XUartLite_EnableInterrupt(&Uart);
    //打开中断控制器
    XIntc_Start(&Intc, XIN_REAL_MODE);
    //使能中断控制器
    XIntc_Enable(&Intc,UART_INTR_ID);
    //设置并打开中断异常处理功能
    Xil_ExceptionInit();
    Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
    (Xil_ExceptionHandler)XIntc_InterruptHandler , &Intc);
    Xil_ExceptionEnable();
    while(1);
    }

    void uart_handler(void *CallbackRef)//中断处理函数
    {
    u8 Read_data;
    u32 isr_status;
    XUartLite *InstancePtr= (XUartLite *)CallbackRef;

    //读取状态寄存器
    isr_status = XUartLite_ReadReg(InstancePtr->RegBaseAddress ,
    XUL_STATUS_REG_OFFSET);
    if(isr_status & RX_NOEMPTY){ //接收 FIFO 中有数据
    //读取数据
    Read_data=XUartLite_ReadReg(InstancePtr->RegBaseAddress ,
    XUL_RX_FIFO_OFFSET);
    //发送数据
    XUartLite_WriteReg(InstancePtr->RegBaseAddress ,
    XUL_TX_FIFO_OFFSET, Read_data);
    }
    }
    //代码源于正点原子

    最后连接到开发板,将程序烧录进去,在串口助手连接好之后(选对端口并配置波特率为115200),在串口发送hello world,可以看到串口可以接收到hello world,表示实验成功!

    最新文章

    最新文章