Всех приветствую. Работал ли кто с Миландрами? Никак не могу настроить прерывания от таймера (ни одного). Код такой:
CODE
int cnt1, cnt2, cnt3;
/*
* Прерывание таймера 1 (14)
* Смещение в таблице векторов 0x40 + 14 * 4 = 0x78
*/
void Vector78(void) {
cnt1 += 1;
MDR_TIMER1->STATUS = (uint32_t) 0;
}
/*
* Прерывание таймера 2 (15)
* Смещение в таблице векторов 0x40 + 15 * 4 = 0x7C
*/
void Vector7C(void) {
cnt2 += 1;
MDR_TIMER2->STATUS = (uint32_t) 0;
}
/*
* Прерывание таймера 3 (16)
* Смещение в таблице векторов 0x40 + 16 * 4 = 0x80
*/
void Vector80(void) {
cnt3 += 1;
MDR_TIMER3->STATUS = (uint32_t) 0;
}
int main(void) {
int cnt4 = 0;
cnt1 = cnt2 = cnt3 = 0;
... Код включения тактирования ядра и таймеров в другом модуле ...
MDR_TIMER1->CNTRL = (uint32_t) 0;
MDR_TIMER1->CNT = (uint32_t) 0;
MDR_TIMER1->PSG = (uint32_t) 0;
MDR_TIMER1->ARR = (uint32_t) 4095;
MDR_TIMER1->IE = TIMER_IE_CNT_ARR_EVENT_IE | TIMER_IE_CNT_ZERO_EVENT_IE;
MDR_TIMER1->STATUS = (uint32_t) 0;
MDR_TIMER1->CNTRL = (uint32_t) 1;
MDR_TIMER3->CNTRL = (uint32_t) 0;
MDR_TIMER3->CNT = (uint32_t) 0;
MDR_TIMER3->PSG = (uint32_t) 0;
MDR_TIMER3->ARR = (uint32_t) 4095;
MDR_TIMER3->IE = TIMER_IE_CNT_ARR_EVENT_IE | TIMER_IE_CNT_ZERO_EVENT_IE;
MDR_TIMER3->STATUS = (uint32_t) 0;
MDR_TIMER3->CNTRL = (uint32_t) 1;
MDR_TIMER2->CNTRL = (uint32_t) 0;
MDR_TIMER2->CNT = (uint32_t) 0;
MDR_TIMER2->PSG = (uint32_t) 0;
MDR_TIMER2->ARR = (uint32_t) 4095;
MDR_TIMER2->IE = TIMER_IE_CNT_ARR_EVENT_IE | TIMER_IE_CNT_ZERO_EVENT_IE;
MDR_TIMER2->STATUS = (uint32_t) 0;
MDR_TIMER2->CNTRL = (uint32_t) 1;
NVIC_EnableIRQ(TIMER1_IRQn);
NVIC_EnableIRQ(TIMER2_IRQn);
NVIC_EnableIRQ(TIMER3_IRQn);
while (true) {
cnt4 += 1;
}
}
Смотрю по GDB - МК в прерывания не заходит, счетчики cnt1..3 не инкриментируются ни разу.
Что уже проверял:
1. Все таймеры точно затактировались и считают:
Код
(gdb) p *0x40070000 // Регистр TIMER1->CNT
$82 = 3285
$83 = 1406
$84 = 2573
$85 = 1891
2. Вектора в таблице правильные:
Код
(gdb) p Vector78
$86 = {void (void)} 0x300 <Vector78>
(gdb) p *0x00000078
$87 = 769 // 0x300 == (769 & 1)
3. Флаги статуса прерываний подняты:
Код
(gdb) p *0x40070058 // Регистр TIMER1->IE
$88 = 3 // Прерывания по 0 и по ARR разрешены
(gdb) p *0x40070054 // Регистр TIMER1->STATUS
$89 = 3 // Оба события
4. В NVIC прерывания разрешены:
Код
(gdb) p *0xE000E100
$90 = 114688 // Биты 14,15,16
5. Всяко пробовал таскать строку включения прерывания таймера (до включения счетчика и после). Безрезультатно.
6. Что я упускаю?
Сообщение отредактировал IgorKossak - Mar 23 2017, 15:45
Причина редактирования: [codebox] для длинного кода. [code]-для короткого!!!