Имеем LPC2468, следующий код корректно работает в симуляторе,
В реале прерывание отрабатывает ровно 1-н раз ((
U32 sec_from_start = 0, ticks_per_sec, ticks_before_16_sec;
__irq void rtc_handler() {
U32 tick = T2TC;
RTC_ILR = 1;
U32 cnt = sec_from_start + 1;
sec_from_start = cnt;
if( ! (cnt & 15) )
ticks_per_sec = ((tick - ticks_before_16_sec)+15) >> 4;
ticks_before_16_sec = tick;
}
};
void after_reset() {
// ...
// init_tm_2
{ // Грубый подсчет частоты
RTC_CIIR = _BV(0) | _BV(3); // sec, day
RTC_AMR = 0xFF; // disable alarms
RTC_CISS = 0; // disable sub-sec
U32 tick = 0;
RTC_ILR = 7; // clr
do { tick = T2TC; } while(!(RTC_ILR & 1));
U32 v = tick;
RTC_ILR = 7; // clr
do { tick = T2TC; } while(!(RTC_ILR & 1));
ticks_before_16_sec = tick;
ticks_per_sec = tick - v;
}
VICVectAddr13 = (U32)(rtc_handler)
VICVectPriority13 = 0;
VICIntEnable = 1u << 13;
}
int main() {
after_reset();
for(;;) {
// ...
print_cur_time();
printf("%d %d", ticks_per_sec, sec_from_start);
}
}
На выходе имеем: sec_from_start = 1, при останове в режиме отладчика:
PCONP, RTC_CIIR, VICIntEnable, VICIRQStatus - все за то что прерывание должно быть,
но его нет ((
В чем могут быть грабли ?