Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2018-сен-21 08:35

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 195 ]  На страницу Пред.  1 ... 8, 9, 10, 11, 12, 13  След.
Автор Сообщение
 Заголовок сообщения: Re: 1986ВЕ92У, MDR32F9Q2I
СообщениеДобавлено: 2016-авг-20 09:28 
Не в сети

Зарегистрирован: 2016-авг-18 11:09
Сообщения: 19
В поддержку написал, жду пруф-кода работы с прерыванием по таймауту.
В принципе, на более низких частотах прерывание по таймауту у меня тоже срабатывало. Но на частотах заведомо ниже 1/12 CPU_CLK.
Если решение не будет найдено, нужно будет искать четвёртый таймер в этом процессоре :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1986ВЕ92У, MDR32F9Q2I
СообщениеДобавлено: 2016-авг-23 09:39 
Не в сети

Зарегистрирован: 2016-авг-18 11:09
Сообщения: 19
Продолжаем рубрику непредсказуемого поведения микроконтроллера 1986ВЕ92У.
Логика работы программы проста - настраиваю два SSP модуля для работы с периферией, поскольку из предыдущих постов выяснилось, что прерывания по таймауту не работают как положено, было решено взводить таймера по прерыванию модуля SSP по заполнению FIFO на 4 слова. Таймера отсчитывают время, за которое посылка гарантированно доставляется, после чего по прерыванию таймера осуществляется выгрузка буфера FIFO модуля SSP, в котором гарантированно лежит 6 слов в естественном порядке.
Линии ERRLED/SERLED отображают вызов прерываний. Одинарный продолжительный строб символизирует прерывание по SSP, два коротких стробика - прерывание по таймеру.
Как показывают приведённые осцилограммы, прерывание таймера осуществляется не всегда. С чем это может быть связано?
Опережая события, скажу, что в основном цикле выполняется практически NOP, иных прерываний, кроме изложенных не происходит.
CPU_CLK = 80 МГц.

Код:
// Секция инициализации таймеров
   
   MDR_RST_CLK->TIM_CLOCK |= RST_CLK_TIM_CLOCK_TIM2_CLK_EN | RST_CLK_TIM_CLOCK_TIM3_CLK_EN;
   TIMER_BRGInit (MDR_TIMER2, SSP_HCLKdiv16);
   TIMER_BRGInit (MDR_TIMER3, SSP_HCLKdiv16);
   
      TIMER_InitStructure.TIMER_CounterMode      = TIMER_CntMode_ClkFixedDir;
      TIMER_InitStructure.TIMER_CounterDirection = TIMER_CntDir_Up;
      TIMER_InitStructure.TIMER_Prescaler        = (uint16_t) 50;
      TIMER_InitStructure.TIMER_Period           = 12; //was 1600
      TIMER_InitStructure.TIMER_IniCounter       = 0;
      TIMER_InitStructure.TIMER_EventSource      = 0;
      TIMER_InitStructure.TIMER_ARR_UpdateMode   = TIMER_ARR_Update_On_CNT_Overflow;
      TIMER_CntInit(MDR_TIMER2, &TIMER_InitStructure);
      TIMER_CntInit(MDR_TIMER3, &TIMER_InitStructure);
      
      NVIC_EnableIRQ(Timer2_IRQn);
      NVIC_EnableIRQ(Timer3_IRQn);
      TIMER_ITConfig(MDR_TIMER2, TIMER_STATUS_CNT_ARR, ENABLE);
      TIMER_ITConfig(MDR_TIMER3, TIMER_STATUS_CNT_ARR, ENABLE);
      

      // Секция прерываний
      
      void SSP1_IRQHandler(void){
   uint16_t data;
SSP_ClearITPendingBit(MDR_SSP1, SSP_IT_RX);
   SERLED_ON;
   StartTimerADC1;   

      while(SSP_GetFlagStatus(MDR_SSP1, SSP_FLAG_RNE)){
      data = MDR_SSP1->DR;
      curDataIn[curCh1Pointer] = data;
      dataIn[dataIn1Pointer%N][curCh1Pointer] = data;
      
   setMBReg((curCh1Pointer), data);
   curCh1Pointer++;
      }
      SERLED_OFF;
      
}

void SSP2_IRQHandler(void){
   uint16_t data;
SSP_ClearITPendingBit(MDR_SSP2, SSP_IT_RX);
   ERRLED_ON;
   StartTimerADC2;

      while(SSP_GetFlagStatus(MDR_SSP2, SSP_FLAG_RNE)){
      data = MDR_SSP2->DR;
      curDataIn[curCh2Pointer+6] = data;
      dataIn[dataIn2Pointer%N][curCh2Pointer+6] = data;
      
   setMBReg((curCh2Pointer+6), data);
   curCh2Pointer++;
      }
      ERRLED_OFF;
      
}

void Timer2_IRQHandler(void){
   SERLED_ON;
   SERLED_OFF;
   

   MDR_TIMER2->STATUS = 0; // stop timer
   TIMER_Cmd(MDR_TIMER2, DISABLE);
   while(SSP_GetFlagStatus(MDR_SSP1, SSP_FLAG_RNE)){
      uint16_t data;
      data = MDR_SSP1->DR;
      curDataIn[curCh1Pointer] = data;
      dataIn[dataIn1Pointer%N][curCh1Pointer] = data;
      
   curCh1Pointer++;
      }
   ReadyToReceiveADC1 = 1;
   curCh1Pointer = 0;
   dataIn1Pointer=(dataIn1Pointer+1)%N;
   
      SERLED_ON;
      SERLED_OFF;
}

void Timer3_IRQHandler(void){
   ERRLED_ON;
   ERRLED_OFF;
   MDR_TIMER3->STATUS = 0; // stop timer
   TIMER_Cmd(MDR_TIMER3, DISABLE);
   while(SSP_GetFlagStatus(MDR_SSP2, SSP_FLAG_RNE)){
      uint16_t data;
      data = MDR_SSP2->DR;
      curDataIn[curCh2Pointer+6] = data;
      dataIn[dataIn2Pointer%N][curCh2Pointer+6] = data;
      
   curCh2Pointer++;
      }
   ReadyToReceiveADC2 = 1;
   curCh2Pointer = 0;
   dataIn2Pointer=(dataIn2Pointer+1)%N;
   
      ERRLED_ON;
      ERRLED_OFF;
}


Вложение:
5.png
5.png [ 53.58 КБ | Просмотров: 4668 ]


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1986ВЕ92У, MDR32F9Q2I
СообщениеДобавлено: 2016-авг-23 11:18 
Не в сети

Зарегистрирован: 2016-авг-18 11:09
Сообщения: 19
Вопрос с таймером снят. В параллельном процессе случайно была забыта команда TIMERx_Cmd(MDR_TIMER3, DISABLE); Она выключала третий таймер периодически, что выливалось в пропуск прерывания.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1986ВЕ92У, MDR32F9Q2I
СообщениеДобавлено: 2016-сен-09 10:04 
Не в сети

Зарегистрирован: 2015-окт-29 15:54
Сообщения: 31
Опять проблемы с JTAG на ВЕ92. Плата LDM Helper. По uart контроллер прошивается нормально, все, кажется, работает. Если же попробовать записать хоть что-то в PORTB (JTAG выведен на нем) ULINK2 перестает видеть микроконтроллер (JTAG communication failure). Помогает только отсутствие в программе записи в PORTB и перепрошивка с помощью uart. Если отключить актирование PORTB, ULINK нормально видит МК. Всю голову сломал уже, в чем может быть причина?? Код пока выложить не могу, но там все элементарно и этот код ранее нормально работал.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1986ВЕ92У, MDR32F9Q2I
СообщениеДобавлено: 2016-сен-09 10:20 
Не в сети

Зарегистрирован: 2010-авг-30 19:12
Сообщения: 395
Цитата:
Если же попробовать записать хоть что-то в PORTB (JTAG выведен на нем) ULINK2 перестает видеть микроконтроллер (JTAG communication failure).

Неоднократно обсуждалось. Запись в порт надо вести через библиотеку (и при этом должен быть определен макрос USE_JTAG_A)

_________________
О сколько нам открытий чудных
Готовит просвященья дух,
И опыт - сын ошибок трудных ... (Пушкин)

Пергаменты не утоляют жажду ("Фауст",Гете)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1986ВЕ92У, MDR32F9Q2I
СообщениеДобавлено: 2016-сен-09 14:18 
Не в сети

Зарегистрирован: 2015-окт-29 15:54
Сообщения: 31
редактор писал(а):
Цитата:
Если же попробовать записать хоть что-то в PORTB (JTAG выведен на нем) ULINK2 перестает видеть микроконтроллер (JTAG communication failure).

Неоднократно обсуждалось. Запись в порт надо вести через библиотеку (и при этом должен быть определен макрос USE_JTAG_A)

Спасибо! Эта информация прошла мимо меня, видимо. В errata этого тоже нет. Чем вызвана особенность и как работать с портом без библиотеки в таком случае?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1986ВЕ92У, MDR32F9Q2I
СообщениеДобавлено: 2016-сен-09 18:18 
Не в сети

Зарегистрирован: 2010-сен-21 12:57
Сообщения: 666
Откуда: г. Санкт-Петербург
nikitab900 писал(а):
редактор писал(а):
Цитата:
Если же попробовать записать хоть что-то в PORTB (JTAG выведен на нем) ULINK2 перестает видеть микроконтроллер (JTAG communication failure).

Неоднократно обсуждалось. Запись в порт надо вести через библиотеку (и при этом должен быть определен макрос USE_JTAG_A)

Спасибо! Эта информация прошла мимо меня, видимо. В errata этого тоже нет. Чем вызвана особенность и как работать с портом без библиотеки в таком случае?

При записи данных в регистр RXTX(portB-> RXTX = data ) младшие 5 бит д.б. равны 0(не использовать код вида portB->RXTX |=data).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1986ВЕ92У, MDR32F9Q2I
СообщениеДобавлено: 2016-сен-12 11:38 
Не в сети

Зарегистрирован: 2015-окт-29 15:54
Сообщения: 31
Т.е. если я хочу использовать jtagA, то я никаким образом не смогу использовать младшие биты PORTB для выдачи дискретных сигналов??


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1986ВЕ92У, MDR32F9Q2I
СообщениеДобавлено: 2016-сен-12 12:16 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1141
Откуда: Тула
nikitab900 писал(а):
Т.е. если я хочу использовать jtagA, то я никаким образом не смогу использовать младшие биты PORTB для выдачи дискретных сигналов??

Да, поскольку это ВЗАИМОИСКЛЮЧАЮЩИЕ вещи.
Реально же, при работе через, SWD нужно не трогать ноги только две ноги SWDIO/TMS, SWDCLK/CLK.
Ещё можно использовать JtagB.

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1986ВЕ92У, MDR32F9Q2I
СообщениеДобавлено: 2016-сен-12 14:17 
Не в сети

Зарегистрирован: 2015-окт-29 15:54
Сообщения: 31
Спасибо! Обращаясь к битам этого порта через битбэндинг можно ли просто просто записать в первые пять бит единицы, чтобы не было проблем с jtag, да?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1986ВЕ92У, MDR32F9Q2I
СообщениеДобавлено: 2016-сен-12 14:28 
Не в сети

Зарегистрирован: 2009-июл-21 14:13
Сообщения: 1141
Откуда: Тула
Писать что-либо в порт через битбанг во время работы JTAG нельзя.
Битбанг есть упрощённый способ операции чтение-модификация-запись.

_________________
сочувствующий…


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1986ВЕ92У, MDR32F9Q2I
СообщениеДобавлено: 2016-сен-12 14:33 
Не в сети

Зарегистрирован: 2015-окт-29 15:54
Сообщения: 31
только что записал MDR_PORTB->RXTX = 0x1F, jtag опять отвалился. Так как проиниализировать эти первые 5 бит, чтобы нормально работать с другими выводами порта и не положить jtag?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1986ВЕ92У, MDR32F9Q2I
СообщениеДобавлено: 2016-сен-12 14:39 
Не в сети

Зарегистрирован: 2010-сен-21 12:57
Сообщения: 666
Откуда: г. Санкт-Петербург
Нельзя писать в младшие 5 бит единицы, а Вы пишите
nikitab900 писал(а):
только что записал MDR_PORTB->RXTX = 0x1F, jtag опять отвалился. Так как проиниализировать эти первые 5 бит, чтобы нормально работать с другими выводами порта и не положить jtag?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1986ВЕ92У, MDR32F9Q2I
СообщениеДобавлено: 2016-сен-12 15:10 
Не в сети

Зарегистрирован: 2015-окт-29 15:54
Сообщения: 31
Запутался. Можно пару строчек того, как мне записать "единицу" в PORTB пин 10 не положив jtag?

добавлено:
все, разобрался. Проинициализировать нулями их нужно, не так прочел предыдущий пост. Всем большое спасибо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: 1986ВЕ92У, MDR32F9Q2I
СообщениеДобавлено: 2017-янв-03 17:19 
Не в сети
Аватара пользователя

Зарегистрирован: 2015-апр-24 14:25
Сообщения: 12
Здравствуйте.
Можно ли при помимо основной программы во флэш-пзу загрузить программу в озу и запустить её, не теряя возможности вернуться к выполнению основной программы из флэш-пзу при прерывании таймера? Желательно на непривелегированном уровне, чтобы не портила флеш и не лазила в периферию?
С уважением.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 195 ]  На страницу Пред.  1 ... 8, 9, 10, 11, 12, 13  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: Bing [Bot] и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB