最近做一个项目,是用s3c2440a做主控。在使用其外部中断EINT0时,发现一个奇怪的问题:
外部中断0初始化:
void init_exint0(void)
{
pISR_EINT0 = (unsigned)Exint0_handler;
rGPFCON &= ~(3<<0); //初始化GPF0为外部中断0
rGPFCON |= (2<<0);
rGPFUP |= (1<<0); //禁止上拉
rEXTINT0 &= ~(0xf<<0);
rEXTINT0 |= (0xb<<0); //下降沿触发
rSRCPND |= (1<<0);
rINTPND |= (1<<0);
rINTMSK &= ~(1<<0); //使用IRQ_EINT0
}
中断处理程序:
void __irq Exint0_handler(void)
{
eint0_time ++;
ClearPending(BIT_EINT0);
}
之后,AVR连接输入100个周期方波(PD5直接接到2440的外部中断0)
_delay_ms(20);
PORTD |= (1<<5);
_delay_ms(20);
PORTD &= ~(1<<5);
发现,eint0_time总会少于100,也就是说,总会丢掉一些中断。大概在2%~5%。
后来发现2440的EXTINT0寄存器设置有问题:
貌似bit3是保留位,没有标明,那么设置为下降沿触发应该是0x0b或者0x02。
以上的实验就是设置为0x0b,却会丢失2%~5%的中断。
当设置为0x02时,中断触发就正常了,没有丢失。
搞清楚是什么原因,似乎是s3c2440a的一个bug,以此篇博文记下,以便日后查询。