본문 바로가기

[Harman] 반도체 설계/Avalon

Avalon - Nios II processor : GPIO

API function.

   alt_iic_isr_register(
		   KEY_IRQ_INTERRUPT_CONTROLLER_ID  ,
		   KEY_IRQ                          ,
		   (void *)key_isr                  ,
		   (void *)&button_val              ,
		   0x0);

interrupt signal 이 발생하면 key_isr function을 불러온다. 

 

인터럽트 발생 시 ISR에서는 관련 데이터를 저장 또는 처리 후 인터럽트 클리어를 해줘야함.

 - printf, uart 통신 등 다른 동작은 불가.

 

 

interrupt enable.

   IOWR_ALTERA_AVALON_PIO_IRQ_MASK(KEY_BASE, 0x7); // 0x4|0x2|0x1
   IOWR_ALTERA_AVALON_PIO_EDGE_CAP(KEY_BASE, (0x4 | 0x2 | 0x1));

IOWR_ALTERA_AVALON_PIO_IRQ_MASK(KEY_BASE, 0x7); // interrupt enable

 - 함수 포인터 세팅 X, cpu 오류 발생 가능

 - interrupt enable은 모든 세팅이 끝난 후에 켜야함

int main()
{
   int button_val;

   IOWR_ALTERA_AVALON_PWM_DIVIDER(MY_PWM_BASE,0xFF);
   IOWR_ALTERA_AVALON_PWM_DUTY(MY_PWM_BASE,0xFF);

   printf("Nios II Interrupt Lab\n\n");

   IOWR_ALTERA_AVALON_PIO_IRQ_MASK(KEY_BASE, 0x7); // 0x4|0x2|0x1
   IOWR_ALTERA_AVALON_PIO_EDGE_CAP(KEY_BASE, (0x4 | 0x2 | 0x1));

   alt_iic_isr_register(
		   KEY_IRQ_INTERRUPT_CONTROLLER_ID  ,
		   KEY_IRQ                          ,
		   (void *)key_isr                  ,
		   (void *)&button_val              ,
		   0x0);
int main()
{
   int button_val;

   IOWR_ALTERA_AVALON_PWM_DUTY(MY_PWM_BASE,0xFF);

   printf("Nios II Interrupt Lab\n\n");

   IOWR_ALTERA_AVALON_PIO_EDGE_CAP(KEY_BASE, (0x4 | 0x2 | 0x1));

   alt_iic_isr_register(
		   KEY_IRQ_INTERRUPT_CONTROLLER_ID  ,
		   KEY_IRQ                          ,
		   (void *)key_isr                  ,
		   (void *)&button_val              ,
		   0x0);

   IOWR_ALTERA_AVALON_PWM_DIVIDER(MY_PWM_BASE,0xFF);

 

 

main loop문

while(1) {
    if (print_flag) {
	    print_flag = 0;
            switch (button_val)	{
                 case 3:
                    IOWR_ALTERA_AVALON_PWM_DUTY(MY_PWM_BASE,0xF0);
                    printf("Level 4 intensity\n");
                    break;
                 case 2:
                    IOWR_ALTERA_AVALON_PWM_DUTY(MY_PWM_BASE,0xC0);
                    printf("Level 3 intensity\n");
                    break;
                 case 1:
                    IOWR_ALTERA_AVALON_PWM_DUTY(MY_PWM_BASE,0x80);
                    printf("Level 2 intensity\n");
                    break;
                 case 0:
                    IOWR_ALTERA_AVALON_PWM_DUTY(MY_PWM_BASE,0x10);
                    printf("Level 1 intensity\n");
                    break;
                 default:
                    IOWR_ALTERA_AVALON_PWM_DUTY(MY_PWM_BASE,0xFF);
                    printf("Level default\n");
                    break;
            }
        }
    }

 

32 line breakpoint > Debug As

interrupt

 


PIO Core.

SoC : cpu, memory, 하나 이상의 periphreal

 

새로운 프로젝트 생성 > my_gpio > cpu, memory Add 

 

Error.

nios2_gen2 > vector > onchip memory

 

 

interface protocols > jtag uart > Add

printf(2), scanf(1), error(0) 출력하는 IP, (2) 할당

 

메모리를 제외한 나머지는 모두 data master 연결, irq 연결

 

이후, key, led 추가

 

peripherals > PIO intel FPGA IP

 

Generate > instantiation template

 

external connection

 

 

 

key 추가 > Rising = active high, Falling = active low, 회로도 확인해야함. 

사용 중인 De1-SoC board led는 active low 동작함, datasheet 참고/

interrupt 

level = 값이 유지되는 상태에서 계속 interrupt 발생 > Add

 

copy.

 

edit > .qip 추가 (PD generate) > compile 

 

pin planner > unused pin settings > assembler (.sof .생성)

 

nios2 > software directory 생성

 

경로 주의! 경로 주의! 경로 주의! 경로 주의! 경로 주  Hello Wolrd Small   주의! 경로 주의! 경로 주의! 경로 주의! 경로 주의!

 

프로젝트 생성하고 바로 Build.

 

Rus As > sys ID 추가 안해서 무시.

 

nios II Console 확인. De1-SoC board led all off

 

 

led address > 0xff; > led all on (0xff = 1111 1111)

 

polling 방식으로 key 값 확인.

 

key, 0000

 

key, 0100
key, 0110
key, 0111

active low

 

 

interrupt

key_isr 유지됨

clear 추가

key_isr 한 번

 

interrupt 처리 후 탈출

 

led 제어