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
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 값 확인.
active low
interrupt
key_isr 유지됨
clear 추가
key_isr 한 번
interrupt 처리 후 탈출
led 제어
'[Harman] 반도체 설계 > Avalon' 카테고리의 다른 글
SoC Design with Nios II Processor. (2) | 2023.10.21 |
---|---|
Avalon Memory-Mapped Interfaces - pwm. (0) | 2023.10.16 |
Avalon Memory-Mapped Interfaces - Register. (0) | 2023.10.16 |
Avalon Memory-Mapped Interfaces. (0) | 2023.10.14 |
Quartus II project - Nios II(Avalon Model) (0) | 2023.10.07 |