跳转到主要内容

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

judy 提交于

本文转载自:<span id="profileBt"><a href="https://blog.csdn.net/m0_61298445/article/details/124438644">Linest-5的C…;
<font color="#FF8000">注:本文由作者授权转发,如需转载请联系作者本人</font>

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

<strong>实验框图</strong>
实验框图比较简单,相比较 hello world 的实验,只添加了一个中断 AXI Interrupt Contriller IP,用于实现接收串口的中断,并反馈给控制器。
<center><img src="http://xilinx.eetrend.com/files/2022-07/%E5%8D%9A%E5%AE%A2/100562373-26…; alt=""></center>

<strong>硬件设计(Vivado部分)</strong>
<strong>新建工程</strong>
将原有的 Hello World 实验工程另存为,命名为 uart_intr 保存
<center><img src="http://xilinx.eetrend.com/files/2022-07/%E5%8D%9A%E5%AE%A2/100562373-26…; alt=""></center>

<strong>Block Design搭建</strong>
打开 block design,添加中断 AXI Interrupt Contriller IP,并将 uart IP 中的中断信号接到中断IP上,其余自动连线即可。
<center><img src="http://xilinx.eetrend.com/files/2022-07/%E5%8D%9A%E5%AE%A2/100562373-26…; alt=""></center>
<center><img src="http://xilinx.eetrend.com/files/2022-07/%E5%8D%9A%E5%AE%A2/100562373-26…; alt=""></center>

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

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

<strong>软件设计(SDK部分)</strong>
<strong>新建工程</strong>
进入到 SDK 的开发界面中,新建一个工程文件,命名为 uart_intr,并在工程中新建一个设计文件命名为main.c。
<center><img src="http://xilinx.eetrend.com/files/2022-07/%E5%8D%9A%E5%AE%A2/100562373-26…; alt=""></center>

<strong>代码部分</strong>

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

程序的大致过程为:

<li>初始化串口、控制器等</li>
<li>配置设备的参数</li>
<li>串口发送信息</li>
<li>中断控制器接收到串口中断并将其传递给主控制器</li>
<li>控制器将接收到的信息通过串口重新发送出去</li>

#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,表示实验成功!