Captain 0 23 марта, 2017 Опубликовано 23 марта, 2017 (изменено) · Жалоба Всех приветствую. Работал ли кто с Миландрами? Никак не могу настроить прерывания от таймера (ни одного). Код такой: 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. Что я упускаю? Изменено 23 марта, 2017 пользователем IgorKossak [codebox] для длинного кода. [code]-для короткого!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 10 23 марта, 2017 Опубликовано 23 марта, 2017 · Жалоба int cnt1, cnt2, cnt3; 6. Что я упускаю? volatile ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
HardEgor 62 23 марта, 2017 Опубликовано 23 марта, 2017 · Жалоба Смотрю по GDB - МК в прерывания не заходит, счетчики cnt1..3 не инкриментируются ни разу. Лучше в прерывании инвертировать состояние какой-нибудь ноги GPIO и смотреть осциллографом - тогда железно видно, входит в прерывание или нет. А так, да видимо volatile не хватает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Captain 0 23 марта, 2017 Опубликовано 23 марта, 2017 · Жалоба Спасибо за ответы. Могу, конечно ошибаться, но volatile не имеет смысла при -O0. Как водится, только написал пост - и сразу нашел проблему - прерывания были просто замаскированы. Установил PRIMASK =0 и все завертелось. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
novikovfb 17 23 марта, 2017 Опубликовано 23 марта, 2017 · Жалоба Спасибо за ответы. Могу, конечно ошибаться, но volatile не имеет смысла при -O0. Как водится, только написал пост - и сразу нашел проблему - прерывания были просто замаскированы. Установил PRIMASK =0 и все завертелось. а чем форум Миландра то не устроил? http://forum.milandr.ru/viewforum.php?f=22 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1891ВМ12Я 0 23 марта, 2017 Опубликовано 23 марта, 2017 · Жалоба Рад что вопрос темы успешно решен. Я работаю сейчас с одним Миландром, пытаюсь настроить SSP в режиме SPI, Вам приходилось работать с этим интерфейсом? Есть вопросы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Captain 0 24 марта, 2017 Опубликовано 24 марта, 2017 · Жалоба Рад что вопрос темы успешно решен. Я работаю сейчас с одним Миландром, пытаюсь настроить SSP в режиме SPI, Вам приходилось работать с этим интерфейсом? Есть вопросы. Да я по сути ни с чем еще и не работал на нем. Был приказ импортозамещать - вот и развлекаюсь :rolleyes: . Сейчас портирую драйвера для ChibiOS HAL (ибо вся прикладуха под ней), но до spi пока не добрался. Но Вы спрашивайте - хотя бы будет ясно какими граблями по лбу получать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 0 24 марта, 2017 Опубликовано 24 марта, 2017 · Жалоба Миландром, пытаюсь настроить SSP в режиме SPI там вроде не должно быть проблем! именно этот модуль у них стандартный... (такой же, как например, у LPC) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1891ВМ12Я 0 25 марта, 2017 Опубликовано 25 марта, 2017 · Жалоба до spi пока не добрался. Но Вы спрашивайте - хотя бы будет ясно какими граблями по лбу получать. Не, там всё в принципе работает как надо, не сложно. Однако я не могу понять как убрать задержку между словами при выдаче данных SSP/SPI. Я засунул несколько 16-битных слов в FIFO, но они вылазят с некой паузой, не знаю как ее занулить, и можно ли в принципе? Устройству требуется жесткие соотношения единиц и нулей и их длительность, пытаюсь заменить ПЛИС (где всё работает). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 10 25 марта, 2017 Опубликовано 25 марта, 2017 · Жалоба Устройству требуется жесткие соотношения единиц и нулей и их длительность, О каких примерно скоростях идет речь? Если используется DMA (что вероятно), то между DMA-запросом и DMA-транзакцией в Cortex-M может быть порядка 12 тактов (насколько я помню), поэтому правильно, что записываете по 16-бит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1891ВМ12Я 0 25 марта, 2017 Опубликовано 25 марта, 2017 · Жалоба О каких примерно скоростях идет речь? один бит 450 нс (это ~2.2 МГц) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
adnega 10 25 марта, 2017 Опубликовано 25 марта, 2017 · Жалоба один бит 450 нс (это ~2.2 МГц) Это мало. Я сталкивался с проблемой на максимальной скорости SPI (правда, на STM32F1). У миландров есть предделитель частоты для блоков. Например, у таймеров нужно вставлять NOP-ы, чтобы дать время на запись регистров, если частота тактирования таймера ниже процессорной. Код можете показать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1891ВМ12Я 0 25 марта, 2017 Опубликовано 25 марта, 2017 · Жалоба Код можете показать? test_mdr.txt Был бы рад не видеть осциллографом паузы между SSP_SendData(MDR_SSP2, 0x5555), ведь всё идет через FIFO... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 182 26 марта, 2017 Опубликовано 26 марта, 2017 · Жалоба Не, там всё в принципе работает как надо, не сложно. Однако я не могу понять как убрать задержку между словами при выдаче данных SSP/SPI. Если модуль там (как тут писали) подобен LPC-шному, то никак. В LPC, с которыми я имел дело, это никак не убирается. И DMA или не-DMA тут не при чём. Пауза между словами вносится самой схемой SSP вне зависимости от загрузки FIFO. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
1891ВМ12Я 0 26 марта, 2017 Опубликовано 26 марта, 2017 · Жалоба Если модуль там (как тут писали) подобен LPC-шному, то никак. В LPC, с которыми я имел дело, это никак не убираетсяСпасибо за информацию, а то я бился головой в стену. Если задержка фиксированная, то я смогу подгадать, чтобы ноль приходился на эту паузу... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться