Код
*PIO_SODR = (1<<18);
*PIO_CODR = (1<<18);
*PIO_CODR = (1<<18);
иосцилографом.
Используются прерывания от Real-time Timer и PITS
Код
__irq void SYS_int (void) { //Прерывание от System Controller. Время выполнения 1мкс на частоте 48МГц
if (*PIT_SR & 1) { //Проверка бита PITS(0) из PIT_SR - регистр статуса интервального таймера
*PIO_SODR = (1<<18);
*PIO_CODR = (1<<18);
if (!(*PIO_PDSR&(1<<28))) {KnobCNT++;}//Если кнопка нажата - считаем время нажатия
else if (KnobCNT) {Knob = KnobCNT; KnobCNT=0; Beep = 1;}//Если отжата и счетчик ненулевой - перезаписываем
if (Beep) { //Прерывание по Periodic Interval Timer (PIT) стр77. P2.0
Beep--; //
*PWM_ENA = 2;} //Разрешить работу канала PWM1 (CHID2) P2.0
else {*PWM_DIS = 2;} //Запретить работу канала PWM1 (CHID2)
*AIC_EOICR = *PIT_PIVR; } //Чтение PIT_PIVR сбрасывает бит PITS в PIT_SR
if (*RTT_SR & 2) { //Время выполнения 450нс на частоте 48МГц
Strob = 1; //Прерывание по Real-time Timer (RTT) (для подсчёта секунд) стр71.
*AIC_EOICR = 1;} //
} //__irq void SYS_int (void)
if (*PIT_SR & 1) { //Проверка бита PITS(0) из PIT_SR - регистр статуса интервального таймера
*PIO_SODR = (1<<18);
*PIO_CODR = (1<<18);
if (!(*PIO_PDSR&(1<<28))) {KnobCNT++;}//Если кнопка нажата - считаем время нажатия
else if (KnobCNT) {Knob = KnobCNT; KnobCNT=0; Beep = 1;}//Если отжата и счетчик ненулевой - перезаписываем
if (Beep) { //Прерывание по Periodic Interval Timer (PIT) стр77. P2.0
Beep--; //
*PWM_ENA = 2;} //Разрешить работу канала PWM1 (CHID2) P2.0
else {*PWM_DIS = 2;} //Запретить работу канала PWM1 (CHID2)
*AIC_EOICR = *PIT_PIVR; } //Чтение PIT_PIVR сбрасывает бит PITS в PIT_SR
if (*RTT_SR & 2) { //Время выполнения 450нс на частоте 48МГц
Strob = 1; //Прерывание по Real-time Timer (RTT) (для подсчёта секунд) стр71.
*AIC_EOICR = 1;} //
} //__irq void SYS_int (void)
Инициализация системного прерывания:
Код
[/code] *AIC_SMR1 = (1 << 5) | 1; //Positive edge triggered (5), 1-й уровень пиоритета
*AIC_SVR1 = (unsigned long) SYS_int; //Адрес обработчика прерывания
*AIC_IECR = (1 << 1); //Разрешить системное прерывание SYS(1)
Инициализация RTT:
[code] *RTT_MR=0x00008000 | (1<<17); //Секундный интервал и прерывания RTTINCIEN(17) = 1
*AIC_SVR1 = (unsigned long) SYS_int; //Адрес обработчика прерывания
*AIC_IECR = (1 << 1); //Разрешить системное прерывание SYS(1)
Инициализация RTT:
[code] *RTT_MR=0x00008000 | (1<<17); //Секундный интервал и прерывания RTTINCIEN(17) = 1
Инициализация PIT:
Код
*PIT_MR = (1 << 25)| //Разрешить прерывание от PIT
(1 << 24)| //Разрешить работу PIT
0xAFFFF; //Потолок счета PIT. Максимальное значение 1 048 575(FFFFFh)(20 бит)
(1 << 24)| //Разрешить работу PIT
0xAFFFF; //Потолок счета PIT. Максимальное значение 1 048 575(FFFFFh)(20 бит)
Через произвольное время 2-4 часа колом встает системное прерывание - оно не вызывается. Не могу понять куда копать, какие регистры вывести чтобы проверить. Помогите советом, добрые люди.