CPU 供应商假设您永远不会忘记编写处理程序,我想我从未见过一个驱动程序包含所有可能的处理程序。
我只是在重新启用 Timer4 IT 时遇到了使用错误掩码的问题,以便改为启用 Timer5 IT(在我的情况下为 C8051F580)
所以我最终写了一个像下面这样的文件。
正如其他答案中所说,这还不够,因为我没有重置每个处理程序中的特定中断(例如为 Timer5 中断清除 TF5),但它可以让您快速找到问题所在。
宏 SPEC_INT(x) 让我为一行中的每个中断创建一个处理程序。注释行对应于我在应用程序代码中真正使用的中断。每个处理程序调用一个函数 int_general_function( )
注意,8051 不喜欢可重入函数(通常意义上的没有堆栈)。当每个处理程序调用相同的函数时,链接器 (Keil C51/BL51) 会发出L15警告。您必须在 Linker 选项、Overlay 类别中添加以下语句
int_general_function !*
为了防止(潜在的)局部变量和(潜在的)参数不共享它们在内存中的位置。
#define ALLINTERRUPT_C
#include <my_types.h>
#include <my_platform.h> //contains #include "C8051F580.h"
//A global var
u8 global_unexp_int = 0;
void int_general_function(u8 int_nb)
{
global_unexp_int = int_nb;
//Do here other useful things
//at least place a breakpoint
//if you are in debug
}
#define SPEC_INT(x) \
void i##x (void) interrupt x \
{ \
int_general_function(x); \
}
//C8051F580
SPEC_INT(INTERRUPT_INT0)
SPEC_INT(INTERRUPT_TIMER0)
SPEC_INT(INTERRUPT_INT1)
SPEC_INT(INTERRUPT_TIMER1)
//SPEC_INT(INTERRUPT_UART0)
SPEC_INT(INTERRUPT_TIMER2)
SPEC_INT(INTERRUPT_SPI0)
SPEC_INT(INTERRUPT_SMBUS0)
SPEC_INT(INTERRUPT_ADC0_WINDOW)
SPEC_INT(INTERRUPT_ADC0_EOC)
//SPEC_INT(INTERRUPT_PCA0)
SPEC_INT(INTERRUPT_COMPARATOR0)
SPEC_INT(INTERRUPT_COMPARATOR1)
SPEC_INT(INTERRUPT_TIMER3)
SPEC_INT(INTERRUPT_LIN0)
SPEC_INT(INTERRUPT_VREG)
//SPEC_INT(INTERRUPT_CAN0)
SPEC_INT(INTERRUPT_PORT_MATCH)
SPEC_INT(INTERRUPT_UART1)
SPEC_INT(INTERRUPT_PCA1)
SPEC_INT(INTERRUPT_COMPARATOR2)
//SPEC_INT(INTERRUPT_TIMER4)
SPEC_INT(INTERRUPT_TIMER5)
希望能帮助到你 ...