【Xilinx AX7103 MicroBalze学习笔记5】MicroBlaze 串口中断实验

目录

实验任务

实验框图

硬件设计(Vivado部分)

新建工程

 Block Design搭建

软件设计(SDK部分)

新建工程

 代码部分

往期系列博客


 

实验任务

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

实验框图

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

65bef72fef5947938d96373c8ecdea58.png

硬件设计(Vivado部分)

新建工程

将原有的 Hello World 实验工程另存为,命名为 uart_intr 保存

099fc093b76e4b8c993c2432881a2945.png

 Block Design搭建

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

 

3d0116f292e94356b1171c6a4e95aee1.png

 

380a4f93227b4db09076bd67b32c307c.png

 

 

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

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

软件设计(SDK部分)

新建工程

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

69c8fdc2f2ae4a7a8bcc77ed8ab82294.png

 代码部分

 

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

往期系列博客

【Xilinx AX7103 MicroBalze学习笔记1】MicroBlaze介绍

【Xilinx AX7103 MicroBalze学习笔记2】MicroBlaze 串口发送 Hello World 实验

【Xilinx AX7103 MicroBalze学习笔记3】MicroBlaze 利用 AXI GPIO 控制 LED 灯

【Xilinx AX7103 MicroBalze学习笔记4】MicroBlaze 按键中断实验

 

 

  • 2
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
以下是Xilinx MicroBlaze中断定时器的代码示例: ```c #include <stdio.h> #include "xparameters.h" #include "xil_exception.h" #include "xtmrctr_l.h" #define TMRCTR_DEVICE_ID XPAR_TMRCTR_0_DEVICE_ID #define INTC_DEVICE_ID XPAR_INTC_0_DEVICE_ID #define TMRCTR_INTERRUPT_ID XPAR_INTC_0_TMRCTR_0_VEC_ID volatile int TimerExpired; void TimerCounterHandler(void *CallBackRef, u8 TmrCtrNumber) { if (XTmrCtr_IsExpired(CallBackRef, TmrCtrNumber)) { XTmrCtr_Reset(CallBackRef, TmrCtrNumber); TimerExpired = 1; } } int SetupInterruptSystem(XTmrCtr *InstancePtr, u16 DeviceId, u16 IntrId) { int Status; XScuGic_Config *IntcConfig; Xil_ExceptionInit(); IntcConfig = XScuGic_LookupConfig(DeviceId); Status = XScuGic_CfgInitialize(&InterruptController, IntcConfig, IntcConfig->CpuBaseAddress); if (Status != XST_SUCCESS) { return XST_FAILURE; } Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT, (Xil_ExceptionHandler)XScuGic_InterruptHandler, &InterruptController); XScuGic_Connect(&InterruptController, IntrId, (Xil_ExceptionHandler)TimerCounterHandler, (void *)InstancePtr); XScuGic_Enable(&InterruptController, IntrId); XTmrCtr_SetHandler(InstancePtr, TimerCounterHandler, InstancePtr); XTmrCtr_SetOptions(InstancePtr, 0, XTC_INT_MODE_OPTION | XTC_AUTO_RELOAD_OPTION); XTmrCtr_Start(InstancePtr, 0); Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ); return XST_SUCCESS; } int main() { int Status; XTmrCtr TimerCounterInstancePtr; u32 TicksPerSecond = XPAR_AXI_TIMER_0_CLOCK_FREQ_HZ / 2; u32 TimerLoadValue = TicksPerSecond / 2; Status = XTmrCtr_Initialize(&TimerCounterInstancePtr, TMRCTR_DEVICE_ID); if (Status != XST_SUCCESS) { return XST_FAILURE; } Status = SetupInterruptSystem(&TimerCounterInstancePtr, INTC_DEVICE_ID, TMRCTR_INTERRUPT_ID); if (Status != XST_SUCCESS) { return XST_FAILURE; } XTmrCtr_SetResetValue(&TimerCounterInstancePtr, 0, TimerLoadValue); XTmrCtr_Start(&TimerCounterInstancePtr, 0); while (1) { if (TimerExpired) { printf("Timer expired!\n"); TimerExpired = 0; } } return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Linest-5

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值