本文转载自: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,表示实验成功!