Jump to content
    

STM32H503 - не вызываются прерывания LPTIM

22 минуты назад, Plain сказал:

Про CC2IE есть сноска в таблице.

В руководстве пользователя 12 таблиц в разделе, посвященном LPTIM. Ни под одной из них я упоминания CC2IE не нашел. Какую именно таблицу вы имеете ввиду?

Share this post


Link to post
Share on other sites

Table 221. LPTIM register map and reset values

Share this post


Link to post
Share on other sites

1 час назад, Plain сказал:

Table 221. LPTIM register map and reset values

image.thumb.png.cd18eb2aa453051ede844cec94946a3d.png

С этим все в порядке.

P.S. А какая частота шины APB для таймера? Я бы попробовал ее сильно снизить для эксперимента. Вдруг так окажется, что прерывания в NVIC там заведены импульсного типа и они на высокой частоте не успевают защелкнуться. Но это, конечно, скорее, исключительное "из ряда вон".

P.S. По Errata пробегались? Там есть несколько пунктов интересных про LPTIM (в т.ч. про его тактирование от PLL2 - я не знаю что у Вас там).

Share this post


Link to post
Share on other sites

1 час назад, Plain сказал:

Table 221

Ой. 13 таблиц. Но да, тут два канала и соответствующий флаг в ISR выставляется. А проблема с любым флагом. Ни одно событие, взводящее флаг в ISR, не вызывает прерывание. 

22 минуты назад, Arlleex сказал:

P.S. А какая частота шины APB для таймера? Я бы попробовал ее сильно снизить для эксперимента.

На APB включен делитель 2. Попробовал 16 - не помогает.

Share this post


Link to post
Share on other sites

Крайнее мое предложение (больше пока мыслей нет) - а расставьте барьеры DSB (а еще лучше - для теста - добавьте небольшие циклы пустого ожидания в виде NOP) между всеми операциями записи в регистры LPTIM. На STM32F4 для записи таймерных регистров я тоже однажды ловил интересные глюки с выставлением флагов (хотя не флагов прерываний).

Share this post


Link to post
Share on other sites

1 час назад, Arlleex сказал:

С этим все в порядке

Вы о чём? Речь о количестве каналов.

Share this post


Link to post
Share on other sites

В 11.06.2024 в 18:51, Сергей Борщ сказал:

Таймер стартует, импульсы на выходе вижу, в регистре LPTIMx->ISR нужные флаги появляются, а в NVIC->ISPR2 соответствующий бит не взводится и обработчик прерывания, соответственно, не вызывается. Что я делаю не так???

А в errata есть такой пункт, может быть там где-то собака порылась?:

When any interrupt bit of the LPTIM_DIER register is modified, the corresponding flag of the LPTIM_ISR register
is cleared by hardware

Share this post


Link to post
Share on other sites

1 час назад, Arlleex сказал:

а расставьте барьеры DSB (а еще лучше - для теста - добавьте небольшие циклы пустого ожидания в виде NOP) между всеми операциями записи в регистры LPTIM.

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

На XMC4xxx во многих случаях, необходимо такое обратное чтение после записи в какой-либо регистр периферии, если сразу после этого идёт другая запись, в другой регистр, зависящая от эффекта предыдущей записи. Например: запись значения X1 в регистр конфигурации периферии R1, а потом - следующая запись (в регистр R2), включающая эту периферию, режим включения которой зависит от записи X1. Если между записью R1 и R2 не вставить чтение R1, то может работать некорректно. Инструкции барьеров в этом случае не помогают. Только обратное чтение. На STM32F429 тоже сталкивался с таким в какой-то периферии (при работе на макс. частоте). В документации XMC4xxx упоминается необходимость таких обратных чтений между зависимыми записями в регистры конфигурации.

В коде операция:

LPTIM1->DIER = ...

не факт что успевает выполниться до последующего разрешения таймера. Обратное чтение LPTIM1->DIER после записи, до разрешения таймера, должно дать гарантию.

Share this post


Link to post
Share on other sites

49 минут назад, HardEgor сказал:

А в errata есть такой пункт, может быть там где-то собака порылась?:

 

Это учтено.  Флаги в ISR у меня выставляются. Если их сбросить - выставляются снова. Тут все хорошо. Ставлю куб от безысходности...

Share this post


Link to post
Share on other sites

2 часа назад, Plain сказал:

Вы о чём? Речь о количестве каналов.

Я о них же. Посмотрите в табличке.

Share this post


Link to post
Share on other sites

2 часа назад, Сергей Борщ сказал:

В кубовом проекте прерывание происходит. "Будем искать".

Следите за руками. Вот так не работает:


  LPTIM1->DIER = 0
      | 0 * LPTIM_DIER_UEIE                                   // Update event DMA request enable
      | 0 * LPTIM_DIER_CMP2OKIE                               // CCR2 update complete interrupt enable
      | 1 * LPTIM_DIER_CC2IE                                  // Capture/Compare 2 interrupt enable
      | 0 * LPTIM_DIER_REPOKIE                                // RCR update interrupt enable
      | 0 * LPTIM_DIER_UEIE                                   // Update event interrupt enable
      | 0 * LPTIM_DIER_DOWNIE                                 // Direction change to down interrupt enable
      | 0 * LPTIM_DIER_UPIE                                   // Direction change to up interrupt enable
      | 0 * LPTIM_DIER_ARROKIE                                // ARR update complete interrupt enable
      | 0 * LPTIM_DIER_CMP1OKIE                               // CCR1 update complete interrupt enable
      | 0 * LPTIM_DIER_EXTTRIGIE                              // External trigger valid edge interrupt enable
      | 0 * LPTIM_DIER_ARRMIE                                 // Autoreload match interrupt enable
      | 0 * LPTIM_DIER_CC1IE                                  // Capture/Compare 1 interrupt enable
      ;
  // enable timer
  LPTIM1->CR = 0
      | 0 * LPTIM_CR_RSTARE                                   // Reset after read enable, can be set when LPTIM is enabled
      | 0 * LPTIM_CR_COUNTRST                                 // Reset counter, can be set when LPTIM is enabled
      | 0 * LPTIM_CR_CNTSTRT                                  // Start in continuous mode, can be set when LPTIM is enabled
      | 0 * LPTIM_CR_SNGSTRT                                  // Start in single pulse mode, can be set when LPTIM is enabled
      | 1 * LPTIM_CR_ENABLE                                   // Enable
      ;

А вот так работает:

  // enable timer
  LPTIM1->CR = 0
      | 0 * LPTIM_CR_RSTARE                                   // Reset after read enable, can be set when LPTIM is enabled
      | 0 * LPTIM_CR_COUNTRST                                 // Reset counter, can be set when LPTIM is enabled
      | 0 * LPTIM_CR_CNTSTRT                                  // Start in continuous mode, can be set when LPTIM is enabled
      | 0 * LPTIM_CR_SNGSTRT                                  // Start in single pulse mode, can be set when LPTIM is enabled
      | 1 * LPTIM_CR_ENABLE                                   // Enable
      ;

  LPTIM1->DIER = 0
      | 0 * LPTIM_DIER_UEIE                                   // Update event DMA request enable
      | 0 * LPTIM_DIER_CMP2OKIE                               // CCR2 update complete interrupt enable
      | 1 * LPTIM_DIER_CC2IE                                  // Capture/Compare 2 interrupt enable
      | 0 * LPTIM_DIER_REPOKIE                                // RCR update interrupt enable
      | 0 * LPTIM_DIER_UEIE                                   // Update event interrupt enable
      | 0 * LPTIM_DIER_DOWNIE                                 // Direction change to down interrupt enable
      | 0 * LPTIM_DIER_UPIE                                   // Direction change to up interrupt enable
      | 0 * LPTIM_DIER_ARROKIE                                // ARR update complete interrupt enable
      | 0 * LPTIM_DIER_CMP1OKIE                               // CCR1 update complete interrupt enable
      | 0 * LPTIM_DIER_EXTTRIGIE                              // External trigger valid edge interrupt enable
      | 0 * LPTIM_DIER_ARRMIE                                 // Autoreload match interrupt enable
      | 0 * LPTIM_DIER_CC1IE                                  // Capture/Compare 1 interrupt enable
      ;

Хотя в в обоих случаях отладчик показывает, что нужные биты в DIER устанавливаются.

Для регистров CCRx, ARR, RCR в документации явно указано, что писать их можно только при активированном (enabled) таймере, для CFGR - наоборот, при неактивном. На запись в DIER никаких ограничений в документации нет.

Куб оказался ни при чем, но помог. В его проекте DIER вообще не трогался и влияющих на него галочек я не обнаружил. Куб просто запускал таймер и когда я, остановив программу, отладчиком включал нужные биты в DIER на уже включенном активированном и запущенном таймере - прерывания запускались.

Вычитывать DIER после записи пробовал - не помогало.

Share this post


Link to post
Share on other sites

Поздравляю с открытием клуба трансформации в ёжиков !

Share this post


Link to post
Share on other sites

2 часа назад, Сергей Борщ сказал:

Следите за руками. Вот так не работает:
...
А вот так работает:
...

А если для обоих случаев посмотреть, что возвращает ISR->DIEROK?

image.thumb.png.485ce05481a7a8b2714dd94e0dd33001.png

Share this post


Link to post
Share on other sites

16 часов назад, Arlleex сказал:

А если для обоих случаев посмотреть, что возвращает ISR->DIEROK?

Да, вы правы - в первом случае DIEROK не выставляется.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...