Nios® V/II Embedded Design Suite (EDS)
Support for Embedded Development Tools, Processors (SoCs and Nios® V/II processor), Embedded Development Suites (EDSs), Boot and Configuration, Operating Systems, C and C++
Announcements
FPGA community forums and blogs on community.intel.com are migrating to the new Altera Community and are read-only. For urgent support needs during this transition, please visit the FPGA Design Resources page or contact an Altera Authorized Distributor.
12748 Discussions

UART Interrupt and timer interrupt at the same time

jpark198
Novice
2,763 Views

I am using max10, DE10-Lite board.

 

I try to use uart interrupt for get command code.

an i also want use timer for periodic work until input command code.

 

but uart interrupt is work only. timer interrupt does not work.

 

it is my code. i want know what is wrong.

 

#include <stdio.h>

#include "system.h"

#include "Nios_Variables.h"

#include "string.h"

#include <stdlib.h>

#include <stdint.h>

 

 

volatile uint16_t flag = 0u;

int gpio;

 

void handle_timer_interrupt(void*p, alt_u32 param);

void uart_init();

void handle_uart_interrupt(void *context,alt_u32 interrupt);

extern int alt_irq_register (alt_u32 id, void*  context,void (*alt_isr_func)(void* isr_context, alt_u32 id) );

 

int main()

{

 

  // register the timer irq to be serviced by handle_timer_interrupt() function

   alt_irq_register(TIMER_0_IRQ, 0, handle_timer_interrupt);

 

   // activate the time

   IOWR_ALTERA_AVALON_TIMER_CONTROL(TIMER_0_BASE,

            ALTERA_AVALON_TIMER_CONTROL_CONT_MSK

           | ALTERA_AVALON_TIMER_CONTROL_START_MSK

           | ALTERA_AVALON_TIMER_CONTROL_ITO_MSK);

 

   uart_init();

 

   for(;;)

   {

      if(gpio == 1)

      {

         printf("SW Lock\n\r");

      }

      else

      {

         if(flag > 0)

         {

         printf("A\n");

           flag = 0;

         }

      }

   }

 

 

 return 0;

}

 

void handle_timer_interrupt(void*p, alt_u32 param)

{

  // clear irq status in order to prevent retriggering

  IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER_0_BASE, 0);

  gpio = IORD_ALTERA_AVALON_PIO_DATA(PIO_0_BASE);

  // your isr code here

  flag++;

  

}

 

void handle_uart_interrupt(void *context,alt_u32 interrupt)

{

 unsigned short int data,status;

 status = IORD_ALTERA_AVALON_UART_STATUS(E_UART_BASE);

 while (!(status & ALTERA_AVALON_UART_STATUS_RRDY_MSK))

  status = IORD_ALTERA_AVALON_UART_STATUS(E_UART_BASE);

 data =IORD_ALTERA_AVALON_UART_RXDATA(E_UART_BASE);

 //write status reg;

 status = ALTERA_AVALON_UART_STATUS_TRDY_MSK;

 IOWR_ALTERA_AVALON_UART_STATUS(E_UART_BASE, status);

 IOWR_ALTERA_AVALON_UART_TXDATA(E_UART_BASE, data);

 IOWR_ALTERA_AVALON_UART_STATUS(E_UART_BASE, 0);

}

 

void uart_init()

{

 alt_u32 control;

 

 control = ALTERA_AVALON_UART_CONTROL_TRDY_MSK | ALTERA_AVALON_UART_CONTROL_RRDY_MSK | ALTERA_AVALON_UART_CONTROL_E_MSK;

 IOWR_ALTERA_AVALON_UART_CONTROL(E_UART_BASE, control);

 alt_irq_register(E_UART_IRQ, 0, handle_uart_interrupt);

 

}

 

0 Kudos
1 Solution
Isaac_V_Intel
Employee
2,684 Views

Hi Junbum, sorry for the late response. I was looking for the right answer.

 

Here you have an example code with the UART and Timer interruptions, the only difference is that it uses a timer init, could you compare your code with this.

 

/* 

* "Hello World" example. 

* This example prints 'Hello from Nios II' to the STDOUT stream. It runs on 

* the Nios II 'standard', 'full_featured', 'fast', and 'low_cost' example 

* designs. It runs with or without the MicroC/OS-II RTOS and requires a STDOUT 

* device in your system's hardware. 

* The memory footprint of this hosted application is ~69 kbytes by default 

* using the standard reference design. 

* For a reduced footprint version of this template, and an explanation of how 

* to reduce the memory footprint for a given application, see the 

* "small_hello_world" template. 

*/# include <stdio.h># include <unistd.h># include <fcntl.h># include "sys/alt_stdio.h"# include "system.h"# include "alt_types.h"# include "altera_avalon_uart_regs.h"# include "altera_avalon_timer_regs.h"# include "sys/alt_irq.h" 

# define Switches (volatile char *) 0x00041040# define LEDs (char *) 0x00041050# define UART0_BASE (char *) 0x00041000# define UART0_IRQ 1# define TIMER0_IRQ 2# define TIMER0_BASE (char *) 0x00041020 

 

void uart0_put_char(unsigned char ch) 

while((IORD_ALTERA_AVALON_UART_STATUS(UART0_BASE) & 0x040) != 0x040){ ;} 

IOWR_ALTERA_AVALON_UART_TXDATA(UART0_BASE,ch); 

 

void uart0_put_str(unsigned char * str){ 

while(*str){ 

uart0_put_char(*str); 

str++; 

 

void uart_handle(void *context,alt_u32 interrupt) 

unsigned short int data,status; 

status = IORD_ALTERA_AVALON_UART_STATUS(UART0_BASE); 

data =IORD_ALTERA_AVALON_UART_RXDATA(UART0_BASE); 

*LEDs=(char)data; 

 

void uart_init() 

alt_u32 control; 

volatile unsigned long uart_capture; 

control = ALTERA_AVALON_UART_CONTROL_TRDY_MSK | ALTERA_AVALON_UART_CONTROL_RRDY_MSK | ALTERA_AVALON_UART_CONTROL_E_MSK; 

IOWR_ALTERA_AVALON_UART_CONTROL(UART0_BASE, control); 

if (alt_irq_register(UART0_IRQ, (void*)uart_capture, uart_handle)){ 

alt_putstr("UART0_IRQ Register Successful\n"); 

}else{ 

alt_putstr("UART0_IRQ Register UnSuccessful\n"); 

void handle_timer_interrupt (void* context, alt_u32 id){ 

static alt_u32 value = 0x00; 

value = value + 1; 

if(value % 1000 == 0){ 

*LEDs=(char)value; 

IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER0_BASE,0); // Clear the interrupt flag 

 

void timer_init(){ 

IOWR_ALTERA_AVALON_TIMER_CONTROL (TIMER0_BASE,ALTERA_AVALON_TIMER_CONTROL_ITO_MSK | ALTERA_AVALON_TIMER_CONTROL_CONT_MSK | ALTERA_AVALON_TIMER_CONTROL_START_MSK); 

alt_irq_register(TIMER0_IRQ, 0, handle_timer_interrupt); 

 

int main(){ 

printf("Hello from NIOS II \n"); 

uart_init(); 

printf("uart init successful"); 

timer_init(); 

printf("timer init successful"); 

//usleep(1000000); 

printf("Hello from NIOS III \n"); 

*LEDs = 0xAA; 

printf("Switch Status : %x " , (char)*Switches); 

uart0_put_str("Hello World"); 

while(1){ 

//*LEDs = *Switches; 

printf("hello"); 

return 0; 

 

 

 Regards,

Isaac

View solution in original post

0 Kudos
3 Replies
Isaac_V_Intel
Employee
2,685 Views

Hi Junbum, sorry for the late response. I was looking for the right answer.

 

Here you have an example code with the UART and Timer interruptions, the only difference is that it uses a timer init, could you compare your code with this.

 

/* 

* "Hello World" example. 

* This example prints 'Hello from Nios II' to the STDOUT stream. It runs on 

* the Nios II 'standard', 'full_featured', 'fast', and 'low_cost' example 

* designs. It runs with or without the MicroC/OS-II RTOS and requires a STDOUT 

* device in your system's hardware. 

* The memory footprint of this hosted application is ~69 kbytes by default 

* using the standard reference design. 

* For a reduced footprint version of this template, and an explanation of how 

* to reduce the memory footprint for a given application, see the 

* "small_hello_world" template. 

*/# include <stdio.h># include <unistd.h># include <fcntl.h># include "sys/alt_stdio.h"# include "system.h"# include "alt_types.h"# include "altera_avalon_uart_regs.h"# include "altera_avalon_timer_regs.h"# include "sys/alt_irq.h" 

# define Switches (volatile char *) 0x00041040# define LEDs (char *) 0x00041050# define UART0_BASE (char *) 0x00041000# define UART0_IRQ 1# define TIMER0_IRQ 2# define TIMER0_BASE (char *) 0x00041020 

 

void uart0_put_char(unsigned char ch) 

while((IORD_ALTERA_AVALON_UART_STATUS(UART0_BASE) & 0x040) != 0x040){ ;} 

IOWR_ALTERA_AVALON_UART_TXDATA(UART0_BASE,ch); 

 

void uart0_put_str(unsigned char * str){ 

while(*str){ 

uart0_put_char(*str); 

str++; 

 

void uart_handle(void *context,alt_u32 interrupt) 

unsigned short int data,status; 

status = IORD_ALTERA_AVALON_UART_STATUS(UART0_BASE); 

data =IORD_ALTERA_AVALON_UART_RXDATA(UART0_BASE); 

*LEDs=(char)data; 

 

void uart_init() 

alt_u32 control; 

volatile unsigned long uart_capture; 

control = ALTERA_AVALON_UART_CONTROL_TRDY_MSK | ALTERA_AVALON_UART_CONTROL_RRDY_MSK | ALTERA_AVALON_UART_CONTROL_E_MSK; 

IOWR_ALTERA_AVALON_UART_CONTROL(UART0_BASE, control); 

if (alt_irq_register(UART0_IRQ, (void*)uart_capture, uart_handle)){ 

alt_putstr("UART0_IRQ Register Successful\n"); 

}else{ 

alt_putstr("UART0_IRQ Register UnSuccessful\n"); 

void handle_timer_interrupt (void* context, alt_u32 id){ 

static alt_u32 value = 0x00; 

value = value + 1; 

if(value % 1000 == 0){ 

*LEDs=(char)value; 

IOWR_ALTERA_AVALON_TIMER_STATUS(TIMER0_BASE,0); // Clear the interrupt flag 

 

void timer_init(){ 

IOWR_ALTERA_AVALON_TIMER_CONTROL (TIMER0_BASE,ALTERA_AVALON_TIMER_CONTROL_ITO_MSK | ALTERA_AVALON_TIMER_CONTROL_CONT_MSK | ALTERA_AVALON_TIMER_CONTROL_START_MSK); 

alt_irq_register(TIMER0_IRQ, 0, handle_timer_interrupt); 

 

int main(){ 

printf("Hello from NIOS II \n"); 

uart_init(); 

printf("uart init successful"); 

timer_init(); 

printf("timer init successful"); 

//usleep(1000000); 

printf("Hello from NIOS III \n"); 

*LEDs = 0xAA; 

printf("Switch Status : %x " , (char)*Switches); 

uart0_put_str("Hello World"); 

while(1){ 

//*LEDs = *Switches; 

printf("hello"); 

return 0; 

 

 

 Regards,

Isaac

0 Kudos
Isaac_V_Intel
Employee
2,684 Views

Hi Junbun,

 

Did the code works for your issue?

 

Best regards,

Isaac.

0 Kudos
jpark198
Novice
2,684 Views

I solved this problem and closed it, but it doesn't seem to close.

0 Kudos
Reply