|
Миландр 1986ВЕ1Т |
|
|
|
Mar 23 2017, 09:55
|
Группа: Участник
Сообщений: 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]-для короткого!!!
|
|
|
|
|
 |
Ответов
|
Apr 6 2017, 09:42
|
Группа: Участник
Сообщений: 7
Регистрация: 23-03-17
Пользователь №: 95 986

|
Вот дошли руки до ДМА и что-то второй день ни в какую не могу заставить это работать. Кое-как из того, что написано в документации (а написано, надо сказать коряво) родил такой код: CODE static dmaCtrlData_t dmaCtrlData[16] __attribute__((aligned(512), section("ahb_lite"))); volatile char tmp1[] = "DMA test string."; volatile char tmp2[20];
int main(void) { ... инициализация клоков ...
memset(dmaCtrlData, 0x0, sizeof(dmaCtrlData));
// Reset to the initial state. MDR_DMA->CTRL_BASE_PTR = (uint32_t) dmaCtrlData; MDR_DMA->CFG = 1U; MDR_DMA->CHNL_SW_REQUEST = 0U; MDR_DMA->CHNL_PRI_ALT_CLR = 0xFFFFFFFF; MDR_DMA->CHNL_PRIORITY_CLR = 0xFFFFFFFF; MDR_DMA->CHNL_REQ_MASK_SET = 0xFFFFFFFF; MDR_DMA->CHNL_USEBURST_CLR = 0xFFFFFFFF; MDR_DMA->CHNL_ENABLE_CLR = 0xFFFFFFFF; MDR_DMA->ERR_CLR = 1U;
// Configure DMA_CH0 dmaCtrlData[0].dmaSrcEndAddr = (uint32_t) tmp1 + sizeof(tmp1) - 1; dmaCtrlData[0].dmaDstEndAddr = (uint32_t) tmp2 + sizeof(tmp1) - 1; dmaCtrlData[0].dmaControl = (0x00 << 30) | // One byte destination increment; (0x00 << 28) | // Destination transfer unit size; (0x00 << 26) | // One byte source increment; (0x00 << 24) | // Source transfer unit size; (0U << 21) | // dst_prot_ctrl (whatever this is - let it be 0); (0U << 18) | // src_prot_ctrl; (15U << 14) | // Acquire the bus and do not release until the transfer complete; ((sizeof(tmp1) - 1) << 4) | // Transfers count - 1. (0U << 3) | // next_useburst ?? (1U << 0); // Simple request mode. Auto-request mode does not work either. MDR_DMA->CHNL_REQ_MASK_CLR = 1U; MDR_DMA->CHNL_ENABLE_SET = 1U; MDR_DMA->CHNL_SW_REQUEST = 1U;
... зацикливаемся ... } Здесь пытаюсь скопировать строку из tmp1 в tmp2. Собственно для проверки, что все заполнилось правильно: 1. Значения регистров MDR_DMA и dmaCtrlData для 1 канала ДО запуска передачи (MDR_DMA->CHNL_SW_REQUEST = 1U): CODE { STATUS = 0x101f0001, CFG = 0x0, CTRL_BASE_PTR = 0x20100000, ALT_CTRL_BASE_PTR = 0x20100200, WAITONREQ_STATUS = 0x7fffffff, CHNL_SW_REQUEST = 0x0, CHNL_USEBURST_SET = 0x0, CHNL_USEBURST_CLR = 0x0, CHNL_REQ_MASK_SET = 0xfffffffe, CHNL_REQ_MASK_CLR = 0xfffffffe, CHNL_ENABLE_SET = 0x1, CHNL_ENABLE_CLR = 0x1, CHNL_PRI_ALT_SET = 0x0, CHNL_PRI_ALT_CLR = 0x0, CHNL_PRIORITY_SET = 0x0, CHNL_PRIORITY_CLR = 0x0, RESERVED0 = {0x0, 0x0, 0x0}, ERR_CLR = 0x0 }
{ dmaSrcEndAddr = 0x20000614, dmaDstEndAddr = 0x20005588, dmaControl = 0x3c101, dmaUnused = 0x0 } 2. И ПОСЛЕ: CODE { STATUS = 0x101f0001, CFG = 0x0, CTRL_BASE_PTR = 0x20100000, ALT_CTRL_BASE_PTR = 0x20100200, WAITONREQ_STATUS = 0x7fffffff, CHNL_SW_REQUEST = 0x0, CHNL_USEBURST_SET = 0x0, CHNL_USEBURST_CLR = 0x0, CHNL_REQ_MASK_SET = 0xfffffffe, CHNL_REQ_MASK_CLR = 0xfffffffe, CHNL_ENABLE_SET = 0x0, CHNL_ENABLE_CLR = 0x0, CHNL_PRI_ALT_SET = 0x0, CHNL_PRI_ALT_CLR = 0x0, CHNL_PRIORITY_SET = 0x0, CHNL_PRIORITY_CLR = 0x0, RESERVED0 = {0x0, 0x0, 0x0}, ERR_CLR = 0x0 }
{ dmaSrcEndAddr = 0x20000614, dmaDstEndAddr = 0x20005588, dmaControl = 0x3c000, dmaUnused = 0x0 } И казалось бы ДМА отработал (dmaControl перешел в режим "Стоп" и счетчик обнулился, а также сбросился Enable на первом канале)... но фиг там, содержимое tmp2 - как были нули так и остались. Для проверки - адреса: Код (volatile char (*)[17]) 0x20000604 <tmp1> (volatile char (*)[20]) 0x20005578 <tmp2> (dmaCtrlData_t (*)[16]) 0x20100000 <dmaCtrlData> Что я забыл/не учел?  Из так называемого даташита - не смог понять что за передачи с кэшированием/буферизацией и как это использовать. Аналогично - не понятно в чем разница между режимами "Основной" и "Авто-запрос".
Сообщение отредактировал IgorKossak - Apr 6 2017, 17:58
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!
|
|
|
|
|
Apr 6 2017, 10:50
|
Группа: Участник
Сообщений: 7
Регистрация: 23-03-17
Пользователь №: 95 986

|
Цитата(HardEgor @ Apr 6 2017, 12:56)  Там на форуме есть ссылки на SPL с готовыми примерами. Потом появился pack для Keil - Milandr.MDR1986BExx.1.4.2.pack, там тоже примеры есть. Еще на форуме выкладывали, как я понял, тестовые программы без SPL, называются так Examples_for_1986VE1_31_01_2012.rar или так 1986VE1T_demoprogramms___part1.rar
Правда у меня DMA в режиме ping-pong так и не заработал и я плюнул на него. Если что, могу ссылочкой на свой архив с упомянутыми файлами поделиться. Да, нашел эти примеры. Там ДМА работает с УАРТом, но не суть. Проблема в том, что написано РОВНО то же самое, что и у меня... прямо строка в строку. Я сейчас даже порядок инициализации такой же как там сделал.
|
|
|
|
|
Apr 6 2017, 11:25
|
Гуру
     
Группа: Свой
Сообщений: 2 223
Регистрация: 3-03-06
Из: Tomsk
Пользователь №: 14 925

|
Цитата(Captain @ Apr 6 2017, 17:50)  Да, нашел эти примеры. Там ДМА работает с УАРТом, но не суть. Проблема в том, что написано РОВНО то же самое, что и у меня... прямо строка в строку. Я сейчас даже порядок инициализации такой же как там сделал. Также пробовал примеры с ДМА использовать, но не заработало. Так как не очень критично было - копать не стал. Там вообще похоже документацию студенты писали - где-то прямой перевод документации ARM, где-то собственное творчество и в общем оно между собой не всегда стыкуется  Например про Ethernet написано что прерывания есть, а по факту, в чипе они не подключены к NVIC, про прерывания написано что бывают по уровню и по фронту, но по факту все прерывания NVIC работают по уровню, а если надо по фронту - то используйте таймер и его прерывание, и т.д. и т.п . У них работает саппорт, и даже отвечает на технические вопросы. Поэтому засылайте им запрос с исходником и обязательно приложите реквизиты своей фирмы.
|
|
|
|
Сообщений в этой теме
Captain Миландр 1986ВЕ1Т Mar 23 2017, 09:55 adnega Цитата(Captain @ Mar 23 2017, 12:55) Кодi... Mar 23 2017, 10:08 HardEgor Цитата(Captain @ Mar 23 2017, 16:55) Смот... Mar 23 2017, 10:17 Captain Спасибо за ответы. Могу, конечно ошибаться, но vol... Mar 23 2017, 10:26 novikovfb Цитата(Captain @ Mar 23 2017, 14:26) Спас... Mar 23 2017, 10:42 AVR Рад что вопрос темы успешно решен.
Я работаю сейча... Mar 23 2017, 12:34 Captain Цитата(AVR @ Mar 23 2017, 15:34) Рад что ... Mar 24 2017, 07:39  AVR Цитата(Captain @ Mar 24 2017, 10:39) до s... Mar 25 2017, 15:33   adnega Цитата(AVR @ Mar 25 2017, 18:33) Устройст... Mar 25 2017, 16:23    AVR Цитата(adnega @ Mar 25 2017, 19:23) О как... Mar 25 2017, 16:26     adnega Цитата(AVR @ Mar 25 2017, 19:26) один бит... Mar 25 2017, 16:57      AVR Цитата(adnega @ Mar 25 2017, 19:57) Код м... Mar 25 2017, 17:24   jcxz Цитата(AVR @ Mar 25 2017, 17:33) Не, там ... Mar 26 2017, 09:34    AVR Цитата(jcxz @ Mar 26 2017, 12:34) Если мо... Mar 26 2017, 09:39     jcxz Цитата(AVR @ Mar 26 2017, 11:39) Спасибо ... Mar 26 2017, 09:57    adnega Цитата(jcxz @ Mar 26 2017, 12:34) Пауза м... Mar 26 2017, 21:09     jcxz Цитата(adnega @ Mar 26 2017, 23:09) Это к... Mar 26 2017, 21:27      adnega Цитата(jcxz @ Mar 27 2017, 00:27) Не знаю... Mar 27 2017, 07:43       jcxz Ещё раз повторю - дело не в фифо (естественно он п... Mar 27 2017, 07:56     AVR Цитата(adnega @ Mar 27 2017, 00:09) В Док... Mar 27 2017, 13:12      jcxz Цитата(AVR @ Mar 27 2017, 15:12) Я понима... Mar 27 2017, 19:48      KRS Цитата(AVR @ Mar 27 2017, 16:12) Я понима... Mar 28 2017, 04:09       jcxz Цитата(KRS @ Mar 28 2017, 06:09) Вот у At... Mar 28 2017, 06:25 KRS Цитата(AVR @ Mar 23 2017, 15:34) Миландро... Mar 24 2017, 12:27 KRS пауза из-за CS
посмотрите на картинку SPI там видн... Mar 27 2017, 12:52 jcxz Цитата(KRS @ Mar 27 2017, 14:52) пауза из... Mar 27 2017, 13:09    Captain Цитата(HardEgor @ Apr 6 2017, 14:25) Такж... Apr 6 2017, 11:55
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|