Перейти к содержанию
    

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Table 221. LPTIM register map and reset values

image.thumb.png.cd18eb2aa453051ede844cec94946a3d.png

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Table 221

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

LPTIM1->DIER = ...

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 после записи пробовал - не помогало.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

image.thumb.png.485ce05481a7a8b2714dd94e0dd33001.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...