悬赏1 积分未解决
串口接收中断进不去,
uart_init(uart1,115200);
uart_irq_enable(uart1);
-------------------------------------------------------------------->
下面是我的驱动代码
UART.c
#include "uart.h"
#include "stdio.h"
XUartPs UART_InitStruct[2];
/*
* UART_InitStruct[0] --> UART0
* UART_InitStruct[1] --> UART1
* If have more uart,define like this.
* */
XScuGic UART_InterruptStruct[2];
/*
* The interrupt Struct
* */
extern XUartPs_Config XUartPs_ConfigTable[2];
int uart_init(enum UARTx uart, u32 baud)
{
/* 2016.07.11 */
/* FIXME:This code is better, but have not test */
int Status;
XUartPs_Config *Config;
Config = XUartPs_LookupConfig(uart);
if (NULL == Config) {
return XST_FAILURE;
}
Status = XUartPs_CfgInitialize(&UART_InitStruct[uart], Config, Config->BaseAddress);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}
XUartPs_SetBaudRate(&UART_InitStruct[uart], baud);
/* FIXME: not test! but I think it is better */
Status = XUartPs_SelfTest(&UART_InitStruct[uart]);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}
return XST_SUCCESS;
}
u32 temp_IsrStatus;
int uart_irq_enable(enum UARTx uart)
{
/* 2016.07.11 */
/* We need know the lib of scugic --> global interrupt contrl*/
int UART_INT_IRQ_ID;
XUartPs_Handler Handle;
int Status;
u32 IntrMask;
switch(uart) {
case uart0:
UART_INT_IRQ_ID = XPS_UART0_INT_ID;
Handle = USART0_IRQHandler;
break;
case uart1:
UART_INT_IRQ_ID = XPS_UART1_INT_ID;
Handle = USART1_IRQHandler;
break;
}
Status = UartSetupInterruptSystem(&UART_InterruptStruct[uart], &UART_InitStruct[uart], UART_INT_IRQ_ID);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}
XUartPs_SetHandler(&UART_InitStruct[uart], Handle, &UART_InitStruct[uart]);
IntrMask = XUARTPS_IXR_OVER | XUARTPS_IXR_RXFULL |XUARTPS_IXR_RXOVR;
XUartPs_SetInterruptMask(&UART_InitStruct[uart], IntrMask);
XUartPs_WriteReg(UART_InitStruct[uart].Config.BaseAddress, XUARTPS_ISR_OFFSET,
0xffffffff);
/*
temp_IsrStatus = XUartPs_ReadReg(UART_InitStruct[uart].Config.BaseAddress,
XUARTPS_ISR_OFFSET);
*/
XUartPs_SetOperMode(&UART_InitStruct[uart], XUARTPS_OPER_MODE_NORMAL); /* */
//XUartPs_SetRecvTimeout(&UART_InitStruct[uart], 10);
XUartPs_EnableUart(&UART_InitStruct[uart]);
return XST_SUCCESS;
}
/* This is a tao lu */
int UartSetupInterruptSystem(XScuGic *IntcInstancePtr,
XUartPs *UartInstancePtr,
u16 UartIntrId)
{
int Status;
XScuGic_Config *IntcConfig;
IntcConfig = XScuGic_LookupConfig(INTC_DEVICE_ID);
if (NULL == IntcConfig) {
return XST_FAILURE;
}
Status = XScuGic_CfgInitialize(IntcInstancePtr, IntcConfig,
IntcConfig->CpuBaseAddress);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}
Xil_ExceptionInit(); /* No use */
Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
(Xil_ExceptionHandler) XScuGic_InterruptHandler,
IntcInstancePtr);
/*************************************************/
//Xil_ExceptionEnable();
XScuGic_Connect(IntcInstancePtr,UartIntrId,
(Xil_InterruptHandler)XUartPs_InterruptHandler,
(void *)UartInstancePtr);
if (Status != XST_SUCCESS) {
return XST_FAILURE;
}
XScuGic_Enable(IntcInstancePtr, UartIntrId); /* jump to interrupt */
Xil_ExceptionEnableMask(XIL_EXCEPTION_IRQ);
return XST_SUCCESS;
}
void uart_send_char(enum UARTx uart, u8 Data)
{
u32 BaseAddress;
switch(uart){
case uart0: {BaseAddress = XPAR_PS7_UART_0_BASEADDR;}; break;
case uart1: {BaseAddress = XPAR_PS7_UART_1_BASEADDR;}; break;
}
XUartPs_SendByte(BaseAddress,Data);
}
void uart_print(enum UARTx uart,uint8_t *ptr)
{
while (*ptr) {
uart_send_char(uart,*ptr++);
}
}
u32 show_status(enum UARTx uart)
{
u32 temp;
temp = XUartPs_ReadReg(UART_InitStruct[uart].Config.BaseAddress,
XUARTPS_ISR_OFFSET);
return temp;
}
void uart_send_string(enum UARTx uart, u8 *Pst, u16 length)
{
XUartPs_Send(&UART_InitStruct[uart],Pst,length);
}
void uart_receive_string(enum UARTx uart, u8 *Pst, u16 length)
{
XUartPs_Recv(&UART_InitStruct[uart],Pst,length);
}
u8 uart_receive_char(enum UARTx uart)
{
u32 BaseAddress;
switch(uart){
case uart0: {BaseAddress = XPAR_PS7_UART_0_BASEADDR;}; break;
case uart1: {BaseAddress = XPAR_PS7_UART_1_BASEADDR;}; break;
}
return XUartPs_RecvByte(BaseAddress);
}
void USART0_IRQHandler(void *CallBackRef, u32 Event, unsigned int EventData)
{
uart_print(uart1,"Hello World\n\r");
}
void USART1_IRQHandler(void *CallBackRef, u32 Event, unsigned int EventData)
{
uart_print(uart1,"Hello World\n\r");
}
UART.h
#pragma once
#include "xuartps_hw.h"
#include "xparameters.h"
#include "xuartps.h"
#include "xstatus.h"
#include "xscugic.h"
#define INTC_DEVICE_ID XPAR_SCUGIC_SINGLE_DEVICE_ID
enum UARTx{
uart0 = 0,uart1 = 1,
};
int uart_init(enum UARTx uart, u32 baud);
int UartSetupInterruptSystem(XScuGic *IntcInstancePtr,
XUartPs *UartInstancePtr,
u16 UartIntrId);
void uart_print(enum UARTx uart,uint8_t *ptr);
void uart_send_char(enum UARTx uart, u8 Data);
void uart_send_string(enum UARTx uart, u8 *Pst, u16 length);
u8 uart_receive_char(enum UARTx uart);
int uart_irq_enable(enum UARTx uart);
u32 show_status(enum UARTx uart);
void USART0_IRQHandler(void *CallBackRef, u32 Event, unsigned int EventData);
void USART1_IRQHandler(void *CallBackRef, u32 Event, unsigned int EventData);
我来回答