|
NIOS 软核 E模式,50MHz时钟,嵌入signaltapII 逻辑分析仪,PIO沿中断,Quartus9.1, NIOS II 9.1 IDE。
测试代码非常简单,只包含一个中断服务程序pio_interrupt(void* context, alt_u32 id)和一个main()。
USB Blaster下载代码后(包含singaltapII编译),启动逻辑分析仪,设置触发条件为按键的下降沿。在中断服务程序中直接将BUTTON_PIO直接输出到LED_PIO。
singaltapII 显示的波形为实际的逻辑波形。
观察的结果是,NIOS II 的中断相应时间是33uS,相当于1600多个时钟周期,比AVR8位单片机还慢,不知道其他人有没有作过类似的测试。
逻辑分析仪的采样时钟也是50MHz。下面是外部中断测试的原代码,已经验证,很简单,很容易就跑起来。不信大家自己试试。
#include "altera_avalon_pio_regs.h"
#include "sys/alt_irq.h"
#include "system.h"
#include <stdio.h>
static void pio_interrupt(void* context, alt_u32 id);
int main()
{
printf("NIOS WORKING\n"); //display to make sure NIOS working
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,0xf); //initial LED_PIO
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE,0); //clear any existing event
IOWR_ALTERA_AVALON_PIO_IRQ_MASK(BUTTON_PIO_BASE,0xf); //enable pio interrupt
alt_irq_register(BUTTON_PIO_IRQ, NULL, pio_interrupt); //register isr
return(0);
}
//isr
static void pio_interrupt(void* context, alt_u32 id)
{
IOWR_ALTERA_AVALON_PIO_DATA(LED_PIO_BASE,
IORD_ALTERA_AVALON_PIO_DATA(BUTTON_PIO_BASE)
); //output BUTTON_PIO to LED_PIO
IOWR_ALTERA_AVALON_PIO_EDGE_CAP(BUTTON_PIO_BASE,0); //clear edge
}
SignalTapII逻辑分析仪实测波形 (原文件名:SignalTapII.JPG)
SingalTapII 设置界面 (原文件名:SignalTapIISetup.JPG)
USER_PB[0]的下降沿与LEDG[0]的下降沿之间相差33us(1600多个时钟)
作为对比:ATMEGA128 跑8MHZ时钟, 响应外部中断的时间(external interrupt response time) 没记错的话,实测为3us左右 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|