реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> Миландр 1986ВЕ1Т
Captain
сообщение Mar 23 2017, 09:55
Сообщение #1





Группа: Участник
Сообщений: 7
Регистрация: 23-03-17
Пользователь №: 95 986



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

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]-для короткого!!!
Go to the top of the page
 
+Quote Post
adnega
сообщение Mar 23 2017, 10:08
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Captain @ Mar 23 2017, 12:55) *
Код
int cnt1, cnt2, cnt3;

6. Что я упускаю?

volatile ?
Go to the top of the page
 
+Quote Post
HardEgor
сообщение Mar 23 2017, 10:17
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 223
Регистрация: 3-03-06
Из: Tomsk
Пользователь №: 14 925



Цитата(Captain @ Mar 23 2017, 16:55) *
Смотрю по GDB - МК в прерывания не заходит, счетчики cnt1..3 не инкриментируются ни разу.

Лучше в прерывании инвертировать состояние какой-нибудь ноги GPIO и смотреть осциллографом - тогда железно видно, входит в прерывание или нет.
А так, да видимо volatile не хватает.
Go to the top of the page
 
+Quote Post
Captain
сообщение Mar 23 2017, 10:26
Сообщение #4





Группа: Участник
Сообщений: 7
Регистрация: 23-03-17
Пользователь №: 95 986



Спасибо за ответы. Могу, конечно ошибаться, но volatile не имеет смысла при -O0. Как водится, только написал пост - и сразу нашел проблему - прерывания были просто замаскированы. Установил PRIMASK =0 и все завертелось.
Go to the top of the page
 
+Quote Post
novikovfb
сообщение Mar 23 2017, 10:42
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 518
Регистрация: 29-09-11
Пользователь №: 67 450



Цитата(Captain @ Mar 23 2017, 14:26) *
Спасибо за ответы. Могу, конечно ошибаться, но volatile не имеет смысла при -O0. Как водится, только написал пост - и сразу нашел проблему - прерывания были просто замаскированы. Установил PRIMASK =0 и все завертелось.

а чем форум Миландра то не устроил? http://forum.milandr.ru/viewforum.php?f=22
Go to the top of the page
 
+Quote Post
AVR
сообщение Mar 23 2017, 12:34
Сообщение #6


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



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


--------------------
Go to the top of the page
 
+Quote Post
Captain
сообщение Mar 24 2017, 07:39
Сообщение #7





Группа: Участник
Сообщений: 7
Регистрация: 23-03-17
Пользователь №: 95 986



Цитата(AVR @ Mar 23 2017, 15:34) *
Рад что вопрос темы успешно решен.
Я работаю сейчас с одним Миландром, пытаюсь настроить SSP в режиме SPI, Вам приходилось работать с этим интерфейсом? Есть вопросы.

Да я по сути ни с чем еще и не работал на нем. Был приказ импортозамещать - вот и развлекаюсь rolleyes.gif . Сейчас портирую драйвера для ChibiOS HAL (ибо вся прикладуха под ней), но до spi пока не добрался. Но Вы спрашивайте - хотя бы будет ясно какими граблями по лбу получать.
Go to the top of the page
 
+Quote Post
KRS
сообщение Mar 24 2017, 12:27
Сообщение #8


Профессионал
*****

Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555



Цитата(AVR @ Mar 23 2017, 15:34) *
Миландром, пытаюсь настроить SSP в режиме SPI

там вроде не должно быть проблем! именно этот модуль у них стандартный...
(такой же, как например, у LPC)
Go to the top of the page
 
+Quote Post
AVR
сообщение Mar 25 2017, 15:33
Сообщение #9


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



Цитата(Captain @ Mar 24 2017, 10:39) *
до spi пока не добрался. Но Вы спрашивайте - хотя бы будет ясно какими граблями по лбу получать.

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


--------------------
Go to the top of the page
 
+Quote Post
adnega
сообщение Mar 25 2017, 16:23
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(AVR @ Mar 25 2017, 18:33) *
Устройству требуется жесткие соотношения единиц и нулей и их длительность,

О каких примерно скоростях идет речь?
Если используется DMA (что вероятно), то между DMA-запросом и DMA-транзакцией в Cortex-M может быть
порядка 12 тактов (насколько я помню), поэтому правильно, что записываете по 16-бит.
Go to the top of the page
 
+Quote Post
AVR
сообщение Mar 25 2017, 16:26
Сообщение #11


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



Цитата(adnega @ Mar 25 2017, 19:23) *
О каких примерно скоростях идет речь?

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


--------------------
Go to the top of the page
 
+Quote Post
adnega
сообщение Mar 25 2017, 16:57
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(AVR @ Mar 25 2017, 19:26) *
один бит 450 нс (это ~2.2 МГц)

Это мало. Я сталкивался с проблемой на максимальной скорости SPI (правда, на STM32F1).
У миландров есть предделитель частоты для блоков. Например, у таймеров нужно вставлять NOP-ы,
чтобы дать время на запись регистров, если частота тактирования таймера ниже процессорной.
Код можете показать?
Go to the top of the page
 
+Quote Post
AVR
сообщение Mar 25 2017, 17:24
Сообщение #13


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



Цитата(adnega @ Mar 25 2017, 19:57) *
Код можете показать?
Прикрепленный файл  test_mdr.txt ( 7.26 килобайт ) Кол-во скачиваний: 329

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


--------------------
Go to the top of the page
 
+Quote Post
jcxz
сообщение Mar 26 2017, 09:34
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(AVR @ Mar 25 2017, 17:33) *
Не, там всё в принципе работает как надо, не сложно. Однако я не могу понять как убрать задержку между словами при выдаче данных SSP/SPI.

Если модуль там (как тут писали) подобен LPC-шному, то никак. В LPC, с которыми я имел дело, это никак не убирается.
И DMA или не-DMA тут не при чём. Пауза между словами вносится самой схемой SSP вне зависимости от загрузки FIFO.
Go to the top of the page
 
+Quote Post
AVR
сообщение Mar 26 2017, 09:39
Сообщение #15


фанат Linux'а
*****

Группа: Свой
Сообщений: 1 353
Регистрация: 23-10-05
Из: SPB.RU
Пользователь №: 10 008



Цитата(jcxz @ Mar 26 2017, 12:34) *
Если модуль там (как тут писали) подобен LPC-шному, то никак. В LPC, с которыми я имел дело, это никак не убирается
Спасибо за информацию, а то я бился головой в стену. Если задержка фиксированная, то я смогу подгадать, чтобы ноль приходился на эту паузу...


--------------------
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 22:12
Рейтинг@Mail.ru


Страница сгенерированна за 0.01516 секунд с 7
ELECTRONIX ©2004-2016