У меня работает без записи в EOICR, для FIQ это не нужно, т.к. у FIQ один приоритет.
;------------------------------------------------------------------------------ EXPORT _SoftDMAHandler _SoftDMAHandler ldmia r12!, {r8,r9,r10} stmia r13!, {r8,r9,r10}
ldmia r12!, {r8,r9,r10} stmia r13!, {r8,r9,r10}
ldmia r12!, {r8,r9} stmia r13!, {r8,r9} subs r11, r11, #1 subnes pc, lr, #4
_SoftDMAHandler_empty MRS r8, SPSR orr r8, r8, #F_BIT MSR SPSR_c, r8
LDR R8, =_SoftDMAHandler_empty LDR R9, _AIC_SVR STR R8, [R9]
subs pc, lr, #4 ;------------------------------------------------------------------------------ void SoftDMAInit(void) { DWORD status; status = AT91F_GetIntStatus(); AT91F_DisableIntCPSR();
// настраиваем сигнал FIQ *AT91C_PMC_PCER = 1<<AT91C_ID_PIOB; // подаем частоту на PIOB *AT91C_PIOB_PDR = AT91C_PIO_PB28; // выкл. режим PIO *AT91C_PIOB_ASR = AT91C_PIO_PB28; // выбираем устройство A (вход FIQ)
// настраиваем прерывание FIQ SoftDMASetHandler((void*)_SoftDMAHandler); *AT91C_AIC_ICCR = (1 << AT91C_ID_FIQ); // Очистка прерывания FIQ *AT91C_AIC_IECR = (1 << AT91C_ID_FIQ); // Разрешение прерывания FIQ
SoftDMASetRate(150000);
AT91F_PurgeInterrupts(); AT91F_SetIntStatus(status); }
// ------------------------------------------------------------------------------ void SoftDMASetHandler(void *handler) { *AT91C_AIC_IDCR = (1 << AT91C_ID_FIQ); // Запрещение прерывания FIQ
// Установка вектора AT91C_BASE_AIC->AIC_SVR[AT91C_ID_FIQ] = (DWORD)handler; AT91C_BASE_AIC->AIC_SMR[AT91C_ID_FIQ] = AT91C_AIC_SRCTYPE_EXT_POSITIVE_EDGE | AT91C_AIC_PRIOR_HIGHEST; }
|