Перейти к содержанию
    

Всех приветствую. Работал ли кто с Миландрами? Никак не могу настроить прерывания от таймера (ни одного). Код такой:

 

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
[codebox] для длинного кода. [code]-для короткого!!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Смотрю по GDB - МК в прерывания не заходит, счетчики cnt1..3 не инкриментируются ни разу.

Лучше в прерывании инвертировать состояние какой-нибудь ноги GPIO и смотреть осциллографом - тогда железно видно, входит в прерывание или нет.

А так, да видимо volatile не хватает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за ответы. Могу, конечно ошибаться, но volatile не имеет смысла при -O0. Как водится, только написал пост - и сразу нашел проблему - прерывания были просто замаскированы. Установил PRIMASK =0 и все завертелось.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за ответы. Могу, конечно ошибаться, но volatile не имеет смысла при -O0. Как водится, только написал пост - и сразу нашел проблему - прерывания были просто замаскированы. Установил PRIMASK =0 и все завертелось.

а чем форум Миландра то не устроил? http://forum.milandr.ru/viewforum.php?f=22

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Рад что вопрос темы успешно решен.

Я работаю сейчас с одним Миландром, пытаюсь настроить SSP в режиме SPI, Вам приходилось работать с этим интерфейсом? Есть вопросы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Рад что вопрос темы успешно решен.

Я работаю сейчас с одним Миландром, пытаюсь настроить SSP в режиме SPI, Вам приходилось работать с этим интерфейсом? Есть вопросы.

Да я по сути ни с чем еще и не работал на нем. Был приказ импортозамещать - вот и развлекаюсь :rolleyes: . Сейчас портирую драйвера для ChibiOS HAL (ибо вся прикладуха под ней), но до spi пока не добрался. Но Вы спрашивайте - хотя бы будет ясно какими граблями по лбу получать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Миландром, пытаюсь настроить SSP в режиме SPI

там вроде не должно быть проблем! именно этот модуль у них стандартный...

(такой же, как например, у LPC)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

до spi пока не добрался. Но Вы спрашивайте - хотя бы будет ясно какими граблями по лбу получать.

Не, там всё в принципе работает как надо, не сложно. Однако я не могу понять как убрать задержку между словами при выдаче данных SSP/SPI. Я засунул несколько 16-битных слов в FIFO, но они вылазят с некой паузой, не знаю как ее занулить, и можно ли в принципе? Устройству требуется жесткие соотношения единиц и нулей и их длительность, пытаюсь заменить ПЛИС (где всё работает).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Устройству требуется жесткие соотношения единиц и нулей и их длительность,

О каких примерно скоростях идет речь?

Если используется DMA (что вероятно), то между DMA-запросом и DMA-транзакцией в Cortex-M может быть

порядка 12 тактов (насколько я помню), поэтому правильно, что записываете по 16-бит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

О каких примерно скоростях идет речь?

один бит 450 нс (это ~2.2 МГц)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

один бит 450 нс (это ~2.2 МГц)

Это мало. Я сталкивался с проблемой на максимальной скорости SPI (правда, на STM32F1).

У миландров есть предделитель частоты для блоков. Например, у таймеров нужно вставлять NOP-ы,

чтобы дать время на запись регистров, если частота тактирования таймера ниже процессорной.

Код можете показать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Код можете показать?
test_mdr.txt

Был бы рад не видеть осциллографом паузы между SSP_SendData(MDR_SSP2, 0x5555), ведь всё идет через FIFO...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не, там всё в принципе работает как надо, не сложно. Однако я не могу понять как убрать задержку между словами при выдаче данных SSP/SPI.

Если модуль там (как тут писали) подобен LPC-шному, то никак. В LPC, с которыми я имел дело, это никак не убирается.

И DMA или не-DMA тут не при чём. Пауза между словами вносится самой схемой SSP вне зависимости от загрузки FIFO.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если модуль там (как тут писали) подобен LPC-шному, то никак. В LPC, с которыми я имел дело, это никак не убирается
Спасибо за информацию, а то я бился головой в стену. Если задержка фиксированная, то я смогу подгадать, чтобы ноль приходился на эту паузу...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...