NiosII Uart Interrupt Handler
Hi!!
I wrote Uart Interrupt Handler For NiosII. and use it.
[CODE]
//-----------------------------------------------------------------------------
//Description : Uart Interrupt Handler & Q Buffer For NiosII
//Vision : V1.0
//Filename : InterruptHandlerForUart.c
// Copyright 2006, Cheong Min LEE
// Email: lcm2559@yahoo.co.kr
// The test may be run in NiosII standalone mode
//-----------------------------------------------------------------------------
#include "system.h"
#include "altera_avalon_uart_regs.h"
#define RX_BUFFER_SIZE_1 1024
#define TX_BUFFER_SIZE_1 1024
#define RX_BUFFER_SIZE_2 1024
#define TX_BUFFER_SIZE_2 1024
unsigned short TxHead_1=0;
unsigned short TxTail_1=0;
unsigned char tx_buffer_1[TX_BUFFER_SIZE_1];
unsigned short RxHead_1=0;
unsigned short RxTail_1=0;
unsigned char rx_buffer_1[RX_BUFFER_SIZE_1];
unsigned short TxHead_2=0;
unsigned short TxTail_2=0;
unsigned char tx_buffer_2[TX_BUFFER_SIZE_2];
unsigned short RxHead_2=0;
unsigned short RxTail_2=0;
unsigned char rx_buffer_2[RX_BUFFER_SIZE_2];
void InitUart1(unsigned int BaudRate)
{
unsigned int divisor;
divisor = (ALT_CPU_FREQ/BaudRate) +1;
IOWR_ALTERA_AVALON_UART_DIVISOR(UART1_BASE, divisor);
IOWR_ALTERA_AVALON_UART_CONTROL(UART1_BASE, ALTERA_AVALON_UART_CONTROL_RRDY_MSK);
}
void InitUart2(unsigned int BaudRate)
{
unsigned int divisor;
divisor = (ALT_CPU_FREQ/BaudRate) +1;
IOWR_ALTERA_AVALON_UART_DIVISOR(UART2_BASE, divisor);
IOWR_ALTERA_AVALON_UART_CONTROL(UART2_BASE, ALTERA_AVALON_UART_CONTROL_RRDY_MSK);
}
void IsrUart1(void* context, unsigned int id)
{
int sr;
sr = IORD_ALTERA_AVALON_UART_STATUS(UART1_BASE);
if(sr & ALTERA_AVALON_UART_STATUS_RRDY_MSK);
{
rx_buffer_1[RxHead_1] = IORD_ALTERA_AVALON_UART_RXDATA(UART1_BASE);
IOWR_ALTERA_AVALON_UART_STATUS(UART1_BASE, 0);
if (++RxHead_1 > (RX_BUFFER_SIZE_1-1)) RxHead_1 = 0;
}
if(sr & ALTERA_AVALON_UART_STATUS_TRDY_MSK)
{
if(IORD_ALTERA_AVALON_UART_CONTROL(UART1_BASE) & ALTERA_AVALON_UART_CONTROL_TRDY_MSK);
{
if (TxTail_1 != TxHead_1)
{
IOWR_ALTERA_AVALON_UART_TXDATA(UART1_BASE, tx_buffer_1[TxTail_1]);
if (++TxTail_1 > (TX_BUFFER_SIZE_1 -1)) TxTail_1 = 0;
}
else IOWR_ALTERA_AVALON_UART_CONTROL(UART1_BASE, ALTERA_AVALON_UART_CONTROL_RRDY_MSK);
}
}
}
void IsrUart2(void* context, unsigned int id)
{
int sr;
sr = IORD_ALTERA_AVALON_UART_STATUS(UART2_BASE);
if(sr & ALTERA_AVALON_UART_STATUS_RRDY_MSK);
{
rx_buffer_2[RxHead_2] = IORD_ALTERA_AVALON_UART_RXDATA(UART2_BASE);
IOWR_ALTERA_AVALON_UART_STATUS(UART2_BASE, 0);
if (++RxHead_2 > (RX_BUFFER_SIZE_2-1)) RxHead_2 = 0;
}
if(sr & ALTERA_AVALON_UART_STATUS_TRDY_MSK)
{
if(IORD_ALTERA_AVALON_UART_CONTROL(UART2_BASE) & ALTERA_AVALON_UART_CONTROL_TRDY_MSK);
{
if (TxTail_2 != TxHead_2)
{
IOWR_ALTERA_AVALON_UART_TXDATA(UART2_BASE, tx_buffer_2[TxTail_2]);
if (++TxTail_2 > (TX_BUFFER_SIZE_2 -1)) TxTail_2 = 0;
}
else IOWR_ALTERA_AVALON_UART_CONTROL(UART2_BASE, ALTERA_AVALON_UART_CONTROL_RRDY_MSK);
}
}
}
unsigned char EmptyUart1()
{
if(RxHead_1 == RxTail_1) return 1;
return 0;
}
unsigned char EmptyUart2()
{
if(RxHead_2 == RxTail_2) return 1;
return 0;
}
unsigned char GetUart1(void)
{
unsigned char rxChar;
/* buffer is empty */
rxChar=rx_buffer_1[RxTail_1];
if (++RxTail_1 > (RX_BUFFER_SIZE_1-1)) RxTail_1=0;
return rxChar;
}
unsigned char GetUart2(void)
{
unsigned char rxChar;
/* buffer is empty */
rxChar=rx_buffer_2[RxTail_2];
if (++RxTail_2 > (RX_BUFFER_SIZE_2-1)) RxTail_2=0;
return rxChar;
}
unsigned char PutUart1(unsigned char in_char)
{
unsigned short size;
unsigned int z;
z = IORD_ALTERA_AVALON_UART_STATUS(UART1_BASE) & ALTERA_AVALON_UART_STATUS_TRDY_MSK;
if ((TxHead_1==TxTail_1) && z) IOWR_ALTERA_AVALON_UART_TXDATA(UART1_BASE, in_char);
else
{
if (TxHead_1 >= TxTail_1) size = TxHead_1 - TxTail_1;
else size = ((TX_BUFFER_SIZE_1-1) - TxTail_1) + TxHead_1;
if (size > (TX_BUFFER_SIZE_1 - 3)) return (-1);
tx_buffer_1[TxHead_1] = in_char;
if (++TxHead_1 > (TX_BUFFER_SIZE_1-1)) TxHead_1 = 0;
z = IORD_ALTERA_AVALON_UART_CONTROL(UART1_BASE) | ALTERA_AVALON_UART_CONTROL_TRDY_MSK;
IOWR_ALTERA_AVALON_UART_CONTROL(UART1_BASE, z);
}
return(1);
}
unsigned char PutUart2(unsigned char in_char)
{
unsigned short size;
unsigned int z;
z = IORD_ALTERA_AVALON_UART_STATUS(UART2_BASE) & ALTERA_AVALON_UART_STATUS_TRDY_MSK;
if ((TxHead_2==TxTail_2) && z) IOWR_ALTERA_AVALON_UART_TXDATA(UART2_BASE, in_char);
else
{
if (TxHead_2 >= TxTail_2) size = TxHead_2 - TxTail_2;
else size = ((TX_BUFFER_SIZE_2-1) - TxTail_2) + TxHead_2;
if (size > (TX_BUFFER_SIZE_2 - 3)) return (-1);
tx_buffer_2[TxHead_2] = in_char;
if (++TxHead_2 > (TX_BUFFER_SIZE_2-1)) TxHead_2 = 0;
z = IORD_ALTERA_AVALON_UART_CONTROL(UART2_BASE) | ALTERA_AVALON_UART_CONTROL_TRDY_MSK;
IOWR_ALTERA_AVALON_UART_CONTROL(UART2_BASE, z);
}
return(1);
}
//-----------------------------------------------------------------------------
//Description : Uart Interrupt Handler & Q Buffer For NiosII
//Vision : V1.0
//Filename : InterruptHandlerForUart.h
// Copyright 2006, Cheong Min LEE
// Email: lcm2559@yahoo.co.kr
// The test may be run in NiosII standalone mode
//-----------------------------------------------------------------------------
#ifndef _INTERRUPTHANDLERFORUAR_H_
#define _INTERRUPTHANDLERFORUAR_H_
/************************************************** ***************************
* Public function prototypes
************************************************** **************************/
void InitUart1(unsigned int BaudRate);
void InitUart2(unsigned int BaudRate);
void IsrUart1();
void IsrUart2();
unsigned char EmptyUart1();
unsigned char EmptyUart2();
unsigned char GetUart1(void);
unsigned char GetUart2(void);
unsigned char PutUart1(unsigned char in_char);
unsigned char PutUart2(unsigned char in_char);
#endif //_INTERRUPTHANDLERFORUAR_H_
//-----------------------------------------------------------------------------
//Description : Uart Interrupt Handler & Q Buffer For NiosII
//Vision : V1.0
//Filename : UartMain.c
// Copyright 2006, Cheong Min LEE
// Email: lcm2559@yahoo.co.kr
// The test may be run in NiosII standalone mode
//-----------------------------------------------------------------------------
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <alt_types.h>
#include <io.h>
#include "system.h"
#include "sys/alt_irq.h"
#include "InterruptHandlerForUart.h"
#define BAUD_RATE_0 115200
#define BAUD_RATE_1 115200
void InitUart()
{
int context_uart1,context_uart2;
InitUart1(BAUD_RATE_0);
InitUart2(BAUD_RATE_1);
alt_irq_register(UART1_IRQ,&context_uart1,IsrUart1 ); // install UART1 ISR
alt_irq_register(UART2_IRQ,&context_uart2,IsrUart2 ); // install UART2 ISR
alt_irq_enable (UART1_IRQ);
alt_irq_enable (UART2_IRQ);
}
int main()
{
unsigned char ch;
printf("\n\nHello NiosII!!!!!\n");
InitUart();
while(1) {
if(!EmptyUart1()) {
ch = GetUart1();
PutUart2(ch);
}
if(!EmptyUart2()) {
ch = GetUart2();
PutUart1(ch);
}
} //while
return 0;
}
May be some modification required by own SOPC Builder status.
Try to test this code and reply some helpful words......