Forum Discussion

jpark198's avatar
jpark198
Icon for New Contributor rankNew Contributor
5 years ago
Solved

UART Interrupt and timer interrupt at the same time

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);

}

  • 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

3 Replies

  • 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

    • jpark198's avatar
      jpark198
      Icon for New Contributor rankNew Contributor

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