关于PQFP封装的9200的PIOA、PIOB和PIOC三组32*3=64个io口,他们的io中止有这样的特性PIO的中止AT91C_AIC_SRCTYPE_EXT_HIGH_LEVEL和AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE都是电平中止,关于PIO来说没有差异,在PIO中止处理函数里面经过检测产生io中止的相应io引脚输入值为0仍是为1,来判别是高电平中止仍是低电平中止,PIO的PIO_IER使能的相应io口线上输入改变中止–留意是改变中止,所以关于io电平中止也有必要存在电平改变之后才干被9200捕获到,也才干引发中止,履行中止处理函数,io口线上无电平改变也就无电平中止会被触法,这和51单片机的io电平中止机制不同,51单片机当启用外部电平中止之后,51处理器每个clk都会检测io的电平,假如契合中止电平,那么当即触发电平中止,所以关于51单片机,只需io口上的电平为中止电平值,那么就会不断的触法51的中止处理程序,直到io口电平变为非中止电平值51处理器才会中止触法中止,9200即使装备io为电平中止,可是也需求io线上只要发上了电平改变,9200才会触法电平改变中止,至于这个改变中止最终是变为了低电平仍是变为了高电平,那么需求在处理程序中读取io值才能够进一步判别,不过假如存在其他irq中止屏蔽I时间比较长,一起io电平中止改变持续时间又比较短,那么很可能呈现,到履行io电平中止处理程序时,读取到的io口数据现已不是引发中止的电平值了,所以io电平中止不是很好用,能够运用AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED双边缘中止或许AT91C_AIC_SRCTYPE_EXT_POSITIVE_EDGE上升沿中止来完结,关于io口最好运用AT91C_AIC_SRCTYPE_EXT_POSITIVE_EDGE上升沿中止机制,这不会呈现误数据,最坏仅仅是可能会丢掉后边的1~2个上升沿[gliethttp_20080104]
以PIOB的PB0为例:
#defineLEVEL_IRQ_PIN(0x01<<0)
AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC,((unsignedint)1AT91F_AIC_ConfigureIt(AT91C_BASE_AIC,
AT91C_ID_PIOB,
1,
AT91C_AIC_SRCTYPE_EXT_POSITIVE_EDGE,
//AT91C_AIC_SRCTYPE_INT_EDGE_TRIGGERED,//双边缘
//AT91C_AIC_SRCTYPE_EXT_HIGH_LEVEL,
//AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE,//
(void(*)(void))piob_interrupt_proc);
{volatiledummy;dummy=AT91C_BASE_PIOB->PIO_ISR;}
AT91F_PIO_InterruptEnable(AT91C_BASE_PIOB,LEVEL_IRQ_PIN);//使能PB0改变中止
{volatiledummy;dummy=AT91C_BASE_PIOB->PIO_ISR;}
AT91F_AIC_EnableIt(AT91C_BASE_AIC,AT91C_ID_PIOB);//使能PIOB控制器中止
以上就完结了PB0的上升沿中止发动,来看看中止处理函数[ads1.2]
void__irq piob_interrupt_proc(void)
{
{volatiledummy;dummy=AT91C_BASE_PIOB->PIO_ISR;}
AT91C_BASE_AIC->AIC_EOICR=0;
if(AT91F_PIO_GetInput(AT91C_BASE_PIOB)&LEVEL_IRQ_PIN)
{
//…1电平
}else
{
//…0电平
}
}