В проекте для SAM7 добавил одноимённые функции:
Код
unsigned char SREG;
////unsigned long int IMR;
/*===============================================
Процедуры CLI и SEI заменяют соответствующие АВР-овские,
выключают и включают все прерывания
===============================================
*/
void CLI(){ //// Отключает все прерывания
AT91C_BASE_AIC->AIC_IDCR=0xFFFFFFFF;
SREG=0x00;
}
void SEI(){ //// Включает все прерывания
AT91C_BASE_AIC->AIC_IDCR=0;
SREG=0x80;
}
////unsigned long int IMR;
/*===============================================
Процедуры CLI и SEI заменяют соответствующие АВР-овские,
выключают и включают все прерывания
===============================================
*/
void CLI(){ //// Отключает все прерывания
AT91C_BASE_AIC->AIC_IDCR=0xFFFFFFFF;
SREG=0x00;
}
void SEI(){ //// Включает все прерывания
AT91C_BASE_AIC->AIC_IDCR=0;
SREG=0x80;
}
Процедура отправки очередного байта в ком-порт выглядит так:
Код
void Out2COM(){
char i;
if (AT91C_BASE_US0->US_CSR & AT91C_US_TXEMPTY){ //// регистр к передаче готов
CLI();
if(OutBufCOMIdxWR==OutBufCOMIdxRD){ // буфер пуст
OutBufCOMIdxWR=OutBufCOMIdxRD=0;
if (AT91C_BASE_US0->US_CSR & AT91C_US_ENDTX){ //// Если передача закончена // Разрешаем прием по COM
USART_ReadBuffer(AT91C_BASE_US0, &i, 1);
COM_mode &= ~0x83; // нет пилотов и нет принятых пакетов и нет Tx
AT91C_BASE_US0->US_IER = AT91C_US_RXBUFF; //// разрешаем прерывания приема СОМ
}
}
else{
AT91C_BASE_US0->US_THR = OutBufCOM[OutBufCOMIdxRD++]; //// выдали в порт
}
COMWaitCnt=0;
SEI();
}
else if(COMWaitCnt++>5000){LedErrorOn(); while(1);} // по WatchDog'у должны сброситься
}
char i;
if (AT91C_BASE_US0->US_CSR & AT91C_US_TXEMPTY){ //// регистр к передаче готов
CLI();
if(OutBufCOMIdxWR==OutBufCOMIdxRD){ // буфер пуст
OutBufCOMIdxWR=OutBufCOMIdxRD=0;
if (AT91C_BASE_US0->US_CSR & AT91C_US_ENDTX){ //// Если передача закончена // Разрешаем прием по COM
USART_ReadBuffer(AT91C_BASE_US0, &i, 1);
COM_mode &= ~0x83; // нет пилотов и нет принятых пакетов и нет Tx
AT91C_BASE_US0->US_IER = AT91C_US_RXBUFF; //// разрешаем прерывания приема СОМ
}
}
else{
AT91C_BASE_US0->US_THR = OutBufCOM[OutBufCOMIdxRD++]; //// выдали в порт
}
COMWaitCnt=0;
SEI();
}
else if(COMWaitCnt++>5000){LedErrorOn(); while(1);} // по WatchDog'у должны сброситься
}
В итоге МК пытаясь при инициализации отправить свой адрес в порт (адрес приходит нормально и МК не виснет, крутится в главном цикле main), в обработчик PIT он так и не попадает. Если убрать из процедуры отправки байта вызов CLI, то PIT работает, но вместо посылки (адреса устройства приходит байт 0x0D), видимо передачу прерывает PIT