Microblaze는 직렬 포트 및 GPIO 인터럽트를 실현합니다.

소개하다

microblaze 소프트 코어를 사용하여 프로세서를 구축하고 인터럽트를 구현합니다.Microblaze_0
영상
은 128Kb 로컬 메모리에 연결된 microbalze 코어, JTAG에 의해 디버깅된 mdm 코어, 인터럽트 관리자 axi_intc, uatr 주변 장치 및 GPIO 주변 장치입니다.

GPIO 인터럽트의 구현은 vio IP 코어에 의해 실현되며 16비트 VIO는 키 입력을 시뮬레이션하기 위해 입력으로 GPIO에 연결됩니다.

UART 인터럽트는 외부 직렬 포트 디버깅 도우미를 연결하거나 SDK 터미널을 직접 사용하여 실현할 수 있습니다.

concat IP 코어는 여러 인터럽트 소스를 하나의 버스로 합성하여 인터럽트 관리자에게 제공합니다.

실험 결과


영상
jtag 디버깅 섹션은 0000에서 FFFF로의 변환을 실현하기 위해 ILA에서 캡처한 Hello Word GPIO_o를 반복합니다.

GPIO_t는 0xffff로 16gpio가 모두 입력됨을 의미하며, GPIO_o가 데이터 변환을 구현하는 이유는 이때의 신호가 tri-state gate에 의해 변환되지 않고 16gpio가 모두 tri-state 이후에 입력되기 때문이다. 게이트 전환.
영상

vio를 사용하여 GPIO의 입력을 변경하여 GPIO 컨트롤러가 인터럽트를 생성합니다. 이때 프로그램은 GPIO 인터럽트 처리 기능에 들어가 디버그 터미널에 "gpio 인터럽트"를 인쇄합니다. 직렬 포트 디버깅 도우미를 사용하여 입력 16진수, 그리고 당신은
영상영상같은 것을 볼 수 있습니다. 인터럽트를 호출하여 반환된 값인 숫자의 반환 값, 직렬 포트 디버깅 도우미는 3개의 8비트 값을 보냈고 4개의 인터럽트가 생성되었으며 처음 3개의 인터럽트는 인터럽트를 수신했습니다. , 그리고 마지막 것은 인터럽트를 보내고 있었습니다.영상영상

씨 프로그램

#include <stdio.h>
#include "platform.h"
#include "xil_printf.h"
#include "xparameters.h"
#include "xgpio.h"
#include "xuartlite.h"
#include "xuartlite_l.h"
#include "xintc.h"
#include "xil_io.h"
#include "sleep.h"

#define GPIO_EXAMPLE_DEVICE_ID  XPAR_GPIO_0_DEVICE_ID
#define UART_DEVICE_ID XPAR_UARTLITE_0_DEVICE_ID     //串口器件ID
#define INTC_DEVICE_ID   XPAR_INTC_0_DEVICE_ID      //中断控制器ID
#define AXI_GPIO_INTR_ID XPAR_INTC_0_GPIO_0_VEC_ID  //AXI GPIO中断ID
#define UART_INTR_ID   XPAR_INTC_0_UARTLITE_0_VEC_ID //串口中断ID
#define EXCEPTION_ID     XIL_EXCEPTION_ID_INT       //中断异常ID


#define RX_NOEMPTY XUL_SR_RX_FIFO_VALID_DATA // 接收 FIFO 非空

static XGpio Gpio; /* The Instance of the GPIO Driver */
static XIntc    Intc;                              //中断控制器实例
static XUartLite Uart;      //串口实例

void GpioHandler(void *CallbackRef);
void uart_handler(void *CallbackRef);

int main()
{
    
    
    init_platform();

    print("Hello World\n\r");
//设备初始化
    XGpio_Initialize(&Gpio, GPIO_EXAMPLE_DEVICE_ID);
    XGpio_SetDataDirection(&Gpio, 1, 0xffff);
    XUartLite_Initialize(&Uart , UART_DEVICE_ID);
    //初始化中断控制器
    XIntc_Initialize(&Intc, INTC_DEVICE_ID);
//关联中断ID和中断服务函数
    //中断服务函数是需要我们自己编写的, 用于响应和处理 AXI GPIO 中断的函数
   XIntc_Connect(&Intc,AXI_GPIO_INTR_ID,(Xil_ExceptionHandler)GpioHandler,&Gpio );
   XIntc_Connect(&Intc, UART_INTR_ID,(XInterruptHandler)uart_handler,&Uart);
//外设中断 使能
   //使能GPIO中断
   XGpio_InterruptEnable(&Gpio, 1);
   //使能GPIO全局中断
   XGpio_InterruptGlobalEnable(&Gpio);
   //使能串口中断
   XUartLite_EnableInterrupt(&Uart);
//启用外设对应的中断向量
   XIntc_Enable(&Intc,AXI_GPIO_INTR_ID);
   XIntc_Enable(&Intc,UART_INTR_ID);
//启动中断控制器
   XIntc_Start(&Intc, XIN_REAL_MODE);
//设置并打开中断异常处理
   Xil_ExceptionInit();
   Xil_ExceptionRegisterHandler(EXCEPTION_ID,
           (Xil_ExceptionHandler)XIntc_InterruptHandler,&Intc);
   Xil_ExceptionEnable();


    for(;1;){
    
    

    	Xil_Out32(0x40000000 , 0xffff);
    	sleep(1);
    	Xil_Out32(0x40000000 , 0x0000);
    	sleep(1);
    	print("Hello\n\r");
    	xil_printf("word\n\r");
    	sleep(1);

    }

    cleanup_platform();
    return 0;
}

void GpioHandler(void *CallbackRef){
    
    
    XGpio *GpioPtr = (XGpio *)CallbackRef;
        print("gpio interrupt\n\r");
        XGpio_InterruptDisable(GpioPtr, 1);  //关闭中断
        XGpio_InterruptClear(GpioPtr, 1);    //清除中断
        XGpio_InterruptEnable(GpioPtr, 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);
     xil_printf("%x\n",Read_data);
     print("\n\r");
     }
     print("uart interrupt\n\r");
}

git_hub 프로젝트 소스 파일

참고: 위의 인터럽트 프로그램을 구현하려면 프로세서의 로컬 메모리가 기본 8kb일 수 없으며 64kb로 변경해야 합니다. 그렇지 않으면 메모리가 너무 작아 프로그램을 실행할 수 없습니다.

추천

출처blog.csdn.net/QUACK_G/article/details/126286727