Поделитесь опытом, кто знает. Использую МК CC2430. Настроено внешнее прерывание. При перепаде уровня на ножке (внешнее воздействие) происходит двойной вызов процедуры обработки прерывания.
Вот как описывается этот обработчик.
// IAR 8051
#define HAL_MCU_LITTLE_ENDIAN() __LITTLE_ENDIAN__
#define HAL_ISR_FUNC_DECLARATION(f,v) \
_PRAGMA(vector=v) __near_func __interrupt void f(void)
#define HAL_ISR_FUNC_PROTOTYPE(f,v) \
_PRAGMA(vector=v) __near_func __interrupt void f(void)
#define HAL_ISR_FUNCTION(f,v) \
HAL_ISR_FUNC_PROTOTYPE(f,v); HAL_ISR_FUNC_DECLARATION(f,v)
void InterruptInit(void)
{
//Активация внешнего прерывания на нулевом порту P0_1
PICTL |= 0x09;
P0IFG &= ~0x02;
P0IE = 1; //Port 0 interrupt Enable
}
static ISR_FUNC_PTR fptr;
//Привязка процедуры обработки к вектору прерывания
void ButIntConnect(ISR_FUNC_PTR isr)
{
istate_t key;
HAL_INT_LOCK(key);
fptr = isr;
HAL_INT_UNLOCK(key);
}
//обработка события при нажатии на кнопку
void push_but(void)
{
but = TRUE;
index++;
}
HAL_ISR_FUNCTION(P1_ISR,P0INT_VECTOR)
{
if (fptr != NULL){
(*fptr)();
P0IFG &= ~0x02;
}
}
//======= MAIN ======
void main()
{
InterruptInit();
ButIntConnect(&push_but);
while(TRUE){
if(but == TRUE){
but = FALSE;
}
}