当前位置:   article > 正文

【Xilinx AX7103 MicroBalze学习笔记5】MicroBlaze 串口中断实验_microblaze如何使用fifo

microblaze如何使用fifo

目录

实验任务

实验框图

硬件设计(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文件中将以下代码拷贝进去。

程序的大致过程为:

  • 初始化串口、控制器等
  • 配置设备的参数
  • 串口发送信息
  • 中断控制器接收到串口中断并将其传递给主控制器
  • 控制器将接收到的信息通过串口重新发送出去
  1. #include "xil_exception.h"
  2. #include "xdebug.h"
  3. #include "xparameters.h"
  4. #include "xintc.h"
  5. #include "xuartlite.h"
  6. #include "xuartlite_l.h"
  7. #define UART_DEVICE_ID XPAR_UARTLITE_0_DEVICE_ID //串口器件 ID
  8. #define UART_INTR_ID XPAR_INTC_0_UARTLITE_0_VEC_ID //串口中断 ID
  9. #define INTC_ID XPAR_INTC_0_DEVICE_ID //中断控制器 ID
  10. #define RX_NOEMPTY XUL_SR_RX_FIFO_VALID_DATA // 接收 FIFO 非空
  11. static XIntc Intc; //中断控制器实例
  12. static XUartLite Uart; //串口实例
  13. void uart_handler(void *CallbackRef);
  14. int main(void){
  15. //初始化串口设备
  16. XUartLite_Initialize(&Uart , UART_DEVICE_ID);
  17. //初始化中断控制器
  18. XIntc_Initialize(&Intc, INTC_ID);
  19. //关联处理函数
  20. XIntc_Connect(&Intc, UART_INTR_ID,(XInterruptHandler)uart_handler,&Uart);
  21. //使能串口
  22. XUartLite_EnableInterrupt(&Uart);
  23. //打开中断控制器
  24. XIntc_Start(&Intc, XIN_REAL_MODE);
  25. //使能中断控制器
  26. XIntc_Enable(&Intc,UART_INTR_ID);
  27. //设置并打开中断异常处理功能
  28. Xil_ExceptionInit();
  29. Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
  30. (Xil_ExceptionHandler)XIntc_InterruptHandler , &Intc);
  31. Xil_ExceptionEnable();
  32. while(1);
  33. }
  34. void uart_handler(void *CallbackRef)//中断处理函数
  35. {
  36. u8 Read_data;
  37. u32 isr_status;
  38. XUartLite *InstancePtr= (XUartLite *)CallbackRef;
  39. //读取状态寄存器
  40. isr_status = XUartLite_ReadReg(InstancePtr->RegBaseAddress ,
  41. XUL_STATUS_REG_OFFSET);
  42. if(isr_status & RX_NOEMPTY){ //接收 FIFO 中有数据
  43. //读取数据
  44. Read_data=XUartLite_ReadReg(InstancePtr->RegBaseAddress ,
  45. XUL_RX_FIFO_OFFSET);
  46. //发送数据
  47. XUartLite_WriteReg(InstancePtr->RegBaseAddress ,
  48. XUL_TX_FIFO_OFFSET, Read_data);
  49. }
  50. }
  51. //代码源于正点原子

最后连接到开发板,将程序烧录进去,在串口助手连接好之后(选对端口并配置波特率为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 按键中断实验

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/461697
推荐阅读
相关标签
  

闽ICP备14008679号