Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Генерация временных меток.

Сб апр 13, 2024 20:17:20

STM32F411, STM32CubeIDE. Требуется создавать последовательность временных меток. Имеется ввиду не абсолютное значение а в тиках CNT. Долбаюсь третий день, а ни с места. Использую таймер5 - 32 разрядный, это принципиально. Для этого регистр автозагрузки задаю максимальный 0xFFFFFFFF, включаю глобальное прерывание. Использую первый канал с выводом на пин. Пытаюсь осуществить простой эксперимент, задавая массив меток EmNZ[500], Частота тиков на входе CNT ~1000 Гц:
Код:
uint32_t Dellta[10] = {200,50,150,50,250,100,50,300,250,100}; // Массив приращений для исследования
 uint16_t LenBuf = sizeof (Dellta)/4;
uint32_t EmNZ[500];
EmNZ[0] = 10000;
for(int16_t i=1; i<10; i++) EmNZ[i] = EmNZ[i-1] + Dellta[i]; // Создание массива меток
TIM5->EGR |= 3;         // Генерируется событие срабатывания компаратора и сброс счётчика и прескаллера
HAL_TIM_OC_Start_IT(&htim5, TIM_CHANNEL_1);

В stm32f4xx_it.c в TIM5_IRQHandler вписываю следующее:
Код:
void TIM5_IRQHandler(void)
{
  /* USER CODE BEGIN TIM5_IRQn 0 */

  /* USER CODE END TIM5_IRQn 0 */
  HAL_TIM_IRQHandler(&htim5);
  /* USER CODE BEGIN TIM5_IRQn 1 */
    if(TIM5->SR & (1<<1)) // Проверка события компарирования CC1IF
      {
       TIM5->SR &= ~(1<<1); // Сброс флага CC1IF
        TIM5->CCR1 = EmNZ[Count_Buf];
        Count_Buf++;
        if(Count_Buf >= LenBuf)
          {
           Count_Buf = 0;
           uint32_t wer = EmNZ[LenBuf-1] + 100;
           for(uint16_t i=0; i<LenBuf; i++) EmNZ[i] += wer;
          }
      }
  /* USER CODE END TIM5_IRQn 1 */
}

Что не так?

Re: Генерация временных меток.

Вс апр 14, 2024 08:03:18

Знать бы, что именно не получается...

Re: Генерация временных меток.

Вс апр 14, 2024 10:27:27

Знать бы, что именно не получается...

В обработчик прерывания не попадаю, соответственно и не вижу меток.

Re: Генерация временных меток.

Вс апр 14, 2024 11:20:08

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

Re: Генерация временных меток.

Вс апр 14, 2024 11:51:42

Требуется создавать последовательность временных меток. Имеется ввиду не абсолютное значение а в тиках CNT.
:facepalm: Требуется переводчик...

Re: Генерация временных меток.

Вс апр 14, 2024 21:34:15

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

Вполне могу согласиться, что изложено запутано - это от больной головы, какая-то хворь одолела. Это не ирония, а действительно голова болит очень сильно - мысли еле двигаются. Подать тактирование на сам таймер - понятно. По поводу "разрешить прерывания в самом таймере и разрешить прерывания от таймера в контроллере прерываний NVIC" буду очень признателен, если это будет изложено ввиде кода. Тогда, может быть, и сам домучаю это дело. С другой стороны подумал, что в сложившейся ситуации с головой лучше попросить написать часть кода за вознагрождение. Прилагаю задание, надеюсь, что в нем ничего не упущено. МК и среда, в которой я программирую указаны в начале темы.
Задание.jpg
(120.37 KiB) Скачиваний: 26

Re: Генерация временных меток.

Пн апр 15, 2024 08:04:28

По поводу "разрешить прерывания в самом таймере и разрешить прерывания от таймера в контроллере прерываний NVIC" буду очень признателен, если это будет изложено ввиде кода.

Как раз всё это уже есть в букваре на MCU. Смотрите Reference Manual на ваше семейство. Про настройку NVIC будет в разделе "Events & interrupts", там целый подраздел про NVIC. А в таймере, вам надо будет активировать сначала само событие [Input/Output] Capture а потом ещё и общее прерывание от таймера. Например, в регистре DIER.

Re: Генерация временных меток.

Пн апр 15, 2024 16:00:59

По поводу "разрешить прерывания в самом таймере и разрешить прерывания от таймера в контроллере прерываний NVIC" буду очень признателен, если это будет изложено ввиде кода.

Как раз всё это уже есть в букваре на MCU. Смотрите Reference Manual на ваше семейство. Про настройку NVIC будет в разделе "Events & interrupts", там целый подраздел про NVIC. А в таймере, вам надо будет активировать сначала само событие [Input/Output] Capture а потом ещё и общее прерывание от таймера. Например, в регистре DIER.

На просьбу представить слова "разрешить прерывания в самом таймере и разрешить прерывания от таймера в контроллере прерываний NVIC" в виде кода меня отсылают к документации. Это похвально, если у того, кто отсылает, есть желание заставить оппонента стать знатоком этих устройств и подтянуть хотябы до своего уровня. Скорее всего Вы этим живёте, а у меня это эпизодическая работа, составляющая не более 1% от того, чем приходится заниматься по технике. То есть мне не надо глубокого знания в этой области, а нужен результат, даже сдался , что не свойственно мне в технике, и снизошёл до просьбы о разработке за деньги. И это не помогает.
Разрешение прерывания по совпадению задаю так TIM5->DIER |= 2; (взвод CC1IE) Это правильно? Глобальное прерывание задаю в Кубе.
Таймер запускаю так HAL_TIM_OC_Start_IT(&htim5, TIM_CHANNEL_1); Что ещё нужно?

Re: Генерация временных меток.

Пн апр 15, 2024 17:20:27

Чтение документации не подразумевает получения глубоких знаний предмета. Я же вам сказал конкретные разделы, это десяток страниц в сумме из, внимание, 1750 (RM0090 Reference Manual для STM32F4). Ну ладно, дело ваше. Если продолжаете пользоваться кубом, то посмотрите в его визардах, там поди тоже есть как правильно настроить нужное вам прерывание, я кубом для генерации кода не пользуюсь, только для расчёта коэффициентов тактового дерева.

Re: Генерация временных меток.

Пн апр 15, 2024 17:28:49

Куб весь излазал, пока толку нет. В моём последнем посте есть три последнии строчки и два вопроса. Конкретно можете ответить именно на них?

Re: Генерация временных меток.

Пн апр 15, 2024 18:01:33

Куб весь излазал, пока толку нет. В моём последнем посте есть три последнии строчки и два вопроса. Конкретно можете ответить именно на них?

В коде выше, я вижу, что вы запускаете таймер и переназначаете его CCR1 уже в обработчике прерывания, в который вы и не попадаете. А как вы в него попадёте, если я не вижу у вас настройку CCR1 при запуске таймера? Это самое очевидное, что я заметил. Если у вас стоит вопрос так, что знаний минимально, то лучше показывайте весь проект целиком в архиве, чтобы те, кто понимает не задавал лишних вопросов а просто смотрел в код.

Добавлено after 2 minutes 12 seconds:
PS Я понял, что вы хотите генерировать последовательность временных интервалов по таблице. Для этого CCRx не нужен, можно просто использовать ARR, флаг UIE и прерывание на нём. Переназначаем ARR не трогая таймер и UPDATE будет генерироваться по достижении нового значения. ICCR/OCCR нужны несколько для других задач.

Re: Генерация временных меток.

Пн апр 15, 2024 19:01:23

Куб весь излазал, пока толку нет. В моём последнем посте есть три последнии строчки и два вопроса. Конкретно можете ответить именно на них?

В коде выше, я вижу, что вы запускаете таймер и переназначаете его CCR1 уже в обработчике прерывания, в который вы и не попадаете. А как вы в него попадёте, если я не вижу у вас настройку CCR1 при запуске таймера? Это самое очевидное, что я заметил. Если у вас стоит вопрос так, что знаний минимально, то лучше показывайте весь проект целиком в архиве, чтобы те, кто понимает не задавал лишних вопросов а просто смотрел в код.

Добавлено after 2 minutes 12 seconds:
PS Я понял, что вы хотите генерировать последовательность временных интервалов по таблице. Для этого CCRx не нужен, можно просто использовать ARR, флаг UIE и прерывание на нём. Переназначаем ARR не трогая таймер и UPDATE будет генерироваться по достижении нового значения. ICCR/OCCR нужны несколько для других задач.

Слава Богу, спустились на землю, а то я уж и не знал, что делать. То, что Вы предлагаете, мне не подойдёт поскольку в Вашем варианте оперируете приращениями, а мне принципиально нужно задавать метки в абсолютных величинах, выраженных в тиках. Да, для эксперимента массив Dellta[10] задаю приращениями, но в программе, четырьмя строчками ниже, из них формирую массив абсолютных значений EmNZ[i]. Кроме того в обработчике прерывания по достижении десяти меток значения в этом массиве увеличиваю на величину, достаточную для продолжения работы без остановки таймера. Тем самым, по моему ожиданию, процесс становится бесконечным (хочеться без дополнительного напряга посмотреть генерацию на осцилографе). Тут нужно понимать, что, если хоть одна метка в какой-то момент окажеться меньше значения счётчика, то процесс заглохнет. Кроме того чтобы процесс завёлся нужно изначально как-то его запустить. Так понимаю, что это можно сделать принудительно программно задав соответствующее событие TIM5->EGR |= 3;
А как надо настроить CCR1?
Да, работать приращениями просто недопустимо, поскольку необходимо иметь две последовательности меток, два канала.

Добавлено after 15 minutes 52 seconds:
Да, совсем забыл сказать, что в Кубе, заходя в закладку NVIC для таймера 5 есть всего одно глобальное прерывание, в то время как для таймера 1 их четыре в том числе и "TIM1 capture compare interrupt". Что бы это значило? Что для таймера 5 нет такой возможности? Знатоки STM32F411 что скажете?

Re: Генерация временных меток.

Пн апр 15, 2024 19:54:26

Юрий48, и всё же вам следует читать документацию на свой контроллер, если вы не хотите тыкаться как слепой котёнок. Я был не прав касаемо 411, его Reference Manual имеет номер RM0383 и этот МК выделяется из общего семейства F4. Однако, например, вот в его RM на бит статуса прерывания таймера TIMx_SR CCxF прямо сказано:
Изображение
Т.е., уже взведённый флаг не вызовет прерывание на следующее событие, его надо ручками снимать. Мне не нравится режим общения, когда я за вас читаю документацию в ответ на ваши вопросы, поэтому очередной раз призываю вас делать это самостоятельно. Если у вас нет доступа к сайту ST, то можете воспользоваться этой ссылкой, там в разделе документации на нужное семейство найти документы на STM32F41x.

Re: Генерация временных меток.

Пн апр 15, 2024 20:56:11

Т.е., уже взведённый флаг не вызовет прерывание на следующее событие, его надо ручками снимать.

Это видел и учёл в программе. В обработчике этот бит проверяется и сбрасывается, см. первый пост.
Мне не нравится режим общения, когда я за вас читаю документацию в ответ на ваши вопросы, поэтому очередной раз призываю вас делать это самостоятельно. Если у вас нет доступа к сайту ST, то можете воспользоваться этой ссылкой, там в разделе документации на нужное семейство найти документы на STM32F41x.

Спасибо за ссылку и извините за дополнительный напряг. Этот документ просматривал. По причине не знания языка и нахождения в самом начале работы с МК мне трудно с лёту выхватывать нужные места (надо же понимать что выхватывать) и делать правильные выводы, вот например: Как уже упоминал, в Кубе для таймера 5 всего одно глобальное прерывание в то время как для таймера 1 их четыре в том числе и "TIM1 capture compare interrupt". Для меня сразу встаёт вопрос: "А вообще для таймера 5 возможно прерывание по сравнению". А как же тогда CC1IF? Так понимаю, и Вы с ходу не ответите на этот вопрос. Это нужен человек, который реально сталкивался с такой задачей.
Вот, Вы упоминали "А как вы в него попадёте, если я не вижу у вас настройку CCR1 при запуске таймера". О каких настройках CCR1 идёт речь?
Что-то у нас только диалог, неужели задача неинтересная и такая, что её трудно реализовать, но это не к Вам.

Re: Генерация временных меток.

Вт апр 16, 2024 04:50:34

Вы путаете количество векторов с количеством событий прерываний. Вектор у 5 таймера один, а событий несколько. И эти события разрешаются в регистре DIER. В самом обработчике нужно распарсить события, проверяя разрешения и флаги.

Re: Генерация временных меток.

Вт апр 16, 2024 10:55:23

Вы путаете количество векторов с количеством событий прерываний. Вектор у 5 таймера один, а событий несколько. И эти события разрешаются в регистре DIER. В самом обработчике нужно распарсить события, проверяя разрешения и флаги.

Ну у него в коде есть проверка на событие. Но он говорит, что он вообще не попадает в прерывание.

Добавлено after 3 minutes 48 seconds:
Вот, Вы упоминали "А как вы в него попадёте, если я не вижу у вас настройку CCR1 при запуске таймера". О каких настройках CCR1 идёт речь?

Давайте, чтобы исключить все возможные очевидные вопросы у меня и у других вы просто покажете весь проект со всеми исходниками?

Добавлено after 3 minutes:
Т.е., уже взведённый флаг не вызовет прерывание на следующее событие, его надо ручками снимать.

Это видел и учёл в программе. В обработчике этот бит проверяется и сбрасывается, см. первый пост.

Это вы учли на момент уже вызванного прерывания. А что если флаг взведён до того, как вы подали TIM5->EGR |= 3;? Оно бывает по-всякому на этапе инициализации и не стоит додумывать, что всё получится автоматически. Наверное, вы даже не пробовали остановить в отладке и посмотреть, что именно творится в регистрах оборудования, верно?

Re: Генерация временных меток.

Вт апр 16, 2024 12:02:33

Давайте, чтобы исключить все возможные очевидные вопросы у меня и у других вы просто покажете весь проект со всеми исходниками?
Царское предложение, благодарен. Вот ссылка. STM32CubeIDE 1.12.0. Поскольку не получалось пытался проводить всякие эксперименты, поэтому код замусорен, уж извините.
Наверное, вы даже не пробовали остановить в отладке и посмотреть, что именно творится в регистрах оборудования, верно?

Смотрел, счётчик крутится.

Re: Генерация временных меток.

Вт апр 16, 2024 12:14:32

вы подали TIM5->EGR |= 3;
Читать write-only регистр - явная глупость. Говорящая о том, что автор даже не открывал мануал на контроллер.

Такая же глупость как и чтение:
TIM5->SR &= ~(1<<1); // Сброс флага CC1IF


PS: Совет ТС-у только один: Наконец-то открыть и прочитать refence manual на контроллер.

Re: Генерация временных меток.

Вт апр 16, 2024 12:35:03

вы подали TIM5->EGR |= 3;
Читать write-only регистр - явная глупость. Говорящая о том, что автор даже не открывал мануал на контроллер.

Такая же глупость как и чтение:
TIM5->SR &= ~(1<<1); // Сброс флага CC1IF


PS: Совет ТС-у только один: Наконец-то открыть и прочитать refence manual на контроллер.

Вы можете объяснить в чём глупость. Да, я глупый, говорил уже об этом. Вы считаете, что в этом случае мануал поможет? Но я уверен, что пару-тройку строчек вполне может помочь бывшему депутату государственной думы.

Re: Генерация временных меток.

Вт апр 16, 2024 13:33:39

Вы можете объяснить в чём глупость. Да, я глупый, говорил уже об этом. Вы считаете, что в этом случае мануал поможет? Но я уверен, что пару-тройку строчек вполне может помочь бывшему депутату государственной думы.

Вот, кстати, действительно дельный совет. Конструкции типа |= или &= сначала считывают регистр а потом пишут в него. А значит, если в SR были другие события они тоже считаются и запишутся. А для write_only регистра это означит, что все события могут обнулиться. Действительно, почитайте хотя-бы секцию описания регистров, чтобы записать для себя их режимы.

PS Я некоторое время могу не отвечать по причине того, что сегодня у меня умер кот. А это священное животное для данного форума. Эх...
Ответить