Easyelectronics.ru

Электроника для всех
Текущее время: 23 янв 2021, 01:22

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



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 29 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: РАБОТА ПРЕРЫВАНИЙ в HAL библиотеках.
СообщениеДобавлено: 17 ноя 2020, 10:52 
Заглядывает иногда

Зарегистрирован: 17 ноя 2020, 10:45
Сообщения: 40
Пробую написать программу на STM32 используя HAL библиотеки. В программе инициализируются три таймера номер 3 (TIM3) , номер 5 (TIM5), номер 2 (TIM2).

TIM3 тактируется от внутреннего источника (от шины), работает в режиме ШИМ и формирует на выходе меандр с частотой 1,2 МГц.

TIM5 тактируется от TIM3, работает в режиме ШИМ.

TIM2 тактируется от TIM3, работает в режиме сравнения.

Как хотелось бы чтобы работало:

Таймеры запускаются одновременно. Разрешается прерывание по TIM2 по значению Pulse в STM32CubeMX. TIM2 отсчитывает интервал времени в течение которого TIM5 сформирует на выходе два импульса ШИМ с заданной частотой и заполнением. Когда TIM2 досчитывает до конца временного интервала (значение Pulse в STM32CubeMX), формируется прерывание.

В обработчике прерывания меняется заполнение импульсов, которые формирует TIM5. Запрещается прерывание TIM2 по значению Pulse и разрешается прерывание TIM2 по переполнению.

Далее таймеры продолжают считать. TIM5 формирует один импульс с измененным заполнением и возникает переполнение по переполнению TIM2.

В обработчике прерывания меняется заполнение импульсов, которые формирует TIM5, на изначальное значение. Запрещается прерывание TIM2 по переполнению, разрешается прерывание TIM2 по значению Pulse.

И так по кругу... TIM5 на выходе должен формировать последовательность импульсов: два с одинаковым заполнением, один с меньшим, опять два с одинаковым, опять один с меньшим и т.д.



Написал такой код main.c:
Код:
MX_GPIO_Init();
  MX_TIM3_Init();
  MX_TIM2_Init();
  MX_TIM5_Init();

  HAL_TIM_PWM_Start  (&htim2, TIM_CHANNEL_1);
  HAL_TIM_PWM_Start  (&htim2, TIM_CHANNEL_2);
  HAL_TIM_OC_Start_IT(&htim2, TIM_CHANNEL_3);
  HAL_TIM_PWM_Start  (&htim5, TIM_CHANNEL_1);
  HAL_TIM_PWM_Start  (&htim3, TIM_CHANNEL_1);

  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }


Обработка прерываний такая:

Код:
void HAL_TIM_OC_DelayElapsedCallback (TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM2)
    {
    if(htim->Channel == HAL_TIM_ACTIVE_CHANNEL_3) // Необходимо сформировать последний в кадре импульс INT.
      {
      HAL_TIM_PWM_Stop   (&htim3, TIM_CHANNEL_1);
       
      HAL_TIM_PWM_Stop   (&htim2, TIM_CHANNEL_1); // Выключение таймера. Таймер работал в режиме работы с формированием прерывания.
      HAL_TIM_PWM_Stop   (&htim2, TIM_CHANNEL_2); // Выключение таймера. Таймер работал в режиме работы с формированием прерывания.
      HAL_TIM_OC_Stop_IT (&htim2, TIM_CHANNEL_3); // Выключение таймера. Таймер работал в режиме работы с формированием прерывания.
      HAL_TIM_PWM_Stop   (&htim5, TIM_CHANNEL_1);     // Выключение таймера. Таймер работал в режиме работы без формированием прерывания.

      TIM5->CCR1 = 4;

      __HAL_TIM_ENABLE_IT(&htim2, TIM_IT_UPDATE);
      HAL_TIM_PWM_Start  (&htim2, TIM_CHANNEL_1);
      HAL_TIM_PWM_Start  (&htim2, TIM_CHANNEL_2);
      HAL_TIM_OC_Start   (&htim2, TIM_CHANNEL_3);
      HAL_TIM_PWM_Start  (&htim5, TIM_CHANNEL_1);
           
      HAL_TIM_PWM_Start  (&htim3, TIM_CHANNEL_1);
      }
    else
      return;
    }
}


//---Прерывание по переполнению счетчика--------------------------------------------------------------------------------------------
void HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM2)
    {
    HAL_TIM_PWM_Stop   (&htim3, TIM_CHANNEL_1);
    HAL_TIM_PWM_Stop   (&htim2, TIM_CHANNEL_1); // Выключение таймера. Таймер работал в режиме работы с формированием прерывания.
    HAL_TIM_PWM_Stop   (&htim2, TIM_CHANNEL_2); // Выключение таймера. Таймер работал в режиме работы с формированием прерывания.
    HAL_TIM_OC_Stop    (&htim2, TIM_CHANNEL_3); // Выключение таймера. Таймер работал в режиме работы с формированием прерывания.
    HAL_TIM_PWM_Stop   (&htim5, TIM_CHANNEL_1); // Выключение таймера. Таймер работал в режиме работы без формированием прерывания.
    __HAL_TIM_DISABLE_IT (&htim2, TIM_IT_UPDATE );
       
    TIM5->CCR1 = 3;
           
    HAL_TIM_PWM_Start  (&htim2, TIM_CHANNEL_1);
    HAL_TIM_PWM_Start  (&htim2, TIM_CHANNEL_2);
    HAL_TIM_OC_Start_IT(&htim2, TIM_CHANNEL_3);
    HAL_TIM_PWM_Start  (&htim5, TIM_CHANNEL_1);
    HAL_TIM_PWM_Start  (&htim3, TIM_CHANNEL_1);
    }
else return;
   
}



Начинаю отлаживать. Пробую сначала работу без второго обработчика прерывания. Вижу следующую картину
Вложение:
1.jpg
1.jpg [ 40.89 Кб | Просмотров: 748 ]

Верхний сигнал это сигналы TIM3, нижний - сигналы TIM5. Видно два первых импульса, прерывание - когда все таймеры остановлены, и последующие импульсы с меньшим заполнением. Все как хотел. Дальше проверяю с двумя обработчиками прерываний. Устанавливаю точку остановки (break) во втором обработчике прерываний на строчке TIM5->CCR1 = 3. Ожидаю увидеть два первых импульса, прерывание и один импульс с меньшим заполнением.

Вижу следующее:
Вложение:
2.jpg
2.jpg [ 37.71 Кб | Просмотров: 748 ]

Два первых импульса есть, прерывание есть и тишина. Где один импульс с меньшим заполнением?

Ниже картина от начала времен без остановки:
Вложение:
3.jpg
3.jpg [ 46.32 Кб | Просмотров: 748 ]

Виден странный перепад на линии TIM3 и импульсы с изначальным заполнением.
Предположение такое - по какой-то причине второе прерывание возникает сразу после выхода из первого, и короткий импульс не успевает сформироваться.

Подскажите в чем проблема?
Уточнение:

Первое прерывание возникает по TIM2 по совпадению регистра CNT со значением Pulse в STM32CubeMX. Pulse = 12-1 = 11. На осциллограммах видно что два первоначальных импульса формируются за 12 тактов, после чего формируется прерывание. Второе прерывание должно формироваться по переполнению TIM2. Для TIM2 Counter Period = 18-1 = 17.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: РАБОТА ПРЕРЫВАНИЙ в HAL библиотеках.
СообщениеДобавлено: 17 ноя 2020, 12:32 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1396
RedOrm писал(а):
И так по кругу... TIM5 на выходе должен формировать последовательность импульсов: два с одинаковым заполнением, один с меньшим, опять два с одинаковым, опять один с меньшим и т.д.

Убираешь прерывания, добавляешь DMA работающий в кольцевом режиме который пишет данные в CCRx TIM5 из массива в котором хранятся 3 значения, запросы для DMA генерит сам этот таймер, главное буферизацию CCR не забыть включить.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: РАБОТА ПРЕРЫВАНИЙ в HAL библиотеках.
СообщениеДобавлено: 17 ноя 2020, 15:10 
Заглядывает иногда

Зарегистрирован: 17 ноя 2020, 10:45
Сообщения: 40
Цитата:
Убираешь прерывания
- идея с прерываниями совсем не рабочая? Хотел разобраться как они работают, в чем у меня косяк.

Цитата:
добавляешь DMA работающий в кольцевом режиме который пишет данные в CCRx TIM5 из массива в котором хранятся 3 значения, запросы для DMA генерит сам этот таймер, главное буферизацию CCR не забыть включить.
Можно поподробнее. Кольцевой режим - это Circular mode?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: РАБОТА ПРЕРЫВАНИЙ в HAL библиотеках.
СообщениеДобавлено: 17 ноя 2020, 15:44 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1396
RedOrm писал(а):
идея с прерываниями совсем не рабочая? Хотел разобраться как они работают, в чем у меня косяк.

Почему не рабочая, просто мне лень с ней разбираться, тем более если есть лучшее решение :)

Цитата:
Можно поподробнее. Кольцевой режим - это Circular mode?

Да. Проверил на H750:
Show

Если таймер 32-х битный и DMA такой-же как у F4/F7/H7, то настраивать нужно на копирование 32->32, если DMA более простой, то он будет нулями дополнять, можно хоть 8->32 делать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: РАБОТА ПРЕРЫВАНИЙ в HAL библиотеках.
СообщениеДобавлено: 18 ноя 2020, 00:40 
Старожил
Аватара пользователя

Зарегистрирован: 20 май 2013, 22:29
Сообщения: 458
Тоже лень разбираться. Но видимо это классика, когда заполняются теневые регистры (макс значение таймера, величина ШИМ), а не реальные регистры, потому что включена буферизация этих регистров. Запись в реальные регистры произойдёт только в момент события переполнения таймера.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: РАБОТА ПРЕРЫВАНИЙ в HAL библиотеках.
СообщениеДобавлено: 18 ноя 2020, 10:22 
Заглядывает иногда

Зарегистрирован: 17 ноя 2020, 10:45
Сообщения: 40
Цитата:
Да. Проверил на H750


Никогда не писал на С++ под контроллеры. У меня STM32H743. В коде не увидел упоминания о TIM5. Мне нужно чтобы TIM3 отчитывал интервал времени, по истечении которого TIM5 изменит заполнение.

Идея использовать DMA мне тоже больше нравится. Правда опыта в его использовании 0. Подскажите, в моем случае запросы DMA должен формировать TIM3, и DMA же будет перезаписывать регистр сравнения для TIM5? и когда именно TIM3 будет формировать запросы в DMA? В TIM3 я использую три канала. Соответственно есть три регистра сравнения и регистр переполнения (ARR который). Когда именно TIM3 будет формировать запросы в DMA? По совпадению с каким-то регистром сравнения? по переполнению? или это как то настраивается в самом таймере?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: РАБОТА ПРЕРЫВАНИЙ в HAL библиотеках.
СообщениеДобавлено: 18 ноя 2020, 10:42 
Заглядывает иногда

Зарегистрирован: 17 ноя 2020, 10:45
Сообщения: 40
В вопросе я описал ситуацию, когда требуется формировать 2 одинаковых импульса, а затем один с меньшим заполнением. А в действительности хотелось бы иметь возможность формировать количество начальных (широких) импульсов произвольно. Скажем 1000. Использовать массив на 1001 элемент вроде не очень. Поэтому было бы целесообразно формировать запросы DMA перед непосредственно последним коротким импульсом. Тогда все широкие импульсы будут формироваться по первому значению массива, а один узкий - по второму.

Правильно рассуждаю?

Правильно ли я настраиваю это дело в STM32CubeMX? Требуемый период формируется TIM2 на канале 3. Соответственно моим настройкам запрос DMA будет формироваться по сравнению значения в регистре CNT со значением в регистре сравнения. Тогда DMA должен брать значения из массива из двух значений, а не из трех.

Вот настройки TIM2:
Вложение:
Скриншот (18.11.2020 08-47-28).jpg
Скриншот (18.11.2020 08-47-28).jpg [ 82.7 Кб | Просмотров: 596 ]

Вложение:
Скриншот (18.11.2020 08-47-43).jpg
Скриншот (18.11.2020 08-47-43).jpg [ 152.77 Кб | Просмотров: 596 ]


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: РАБОТА ПРЕРЫВАНИЙ в HAL библиотеках.
СообщениеДобавлено: 18 ноя 2020, 12:15 
Заглядывает иногда

Зарегистрирован: 17 ноя 2020, 10:45
Сообщения: 40
При генерации проекта Cube формирует для DMA одну функцию:
void MX_DMA_Init(void)
Код:
{

  /* DMA controller clock enable */
  __HAL_RCC_DMA1_CLK_ENABLE();

  /* DMA interrupt init */
  /* DMA1_Stream0_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(DMA1_Stream0_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(DMA1_Stream0_IRQn);

}


Больше никаких настроек. Зачем тогда я выбираю в Cube режимы работы и т.д.? Если в итоге никаких настроек не генерируется.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: РАБОТА ПРЕРЫВАНИЙ в HAL библиотеках.
СообщениеДобавлено: 18 ноя 2020, 12:58 
Заглядывает иногда

Зарегистрирован: 17 ноя 2020, 10:45
Сообщения: 40
Посмотрел примеры. Хоть Cube и не генерит ожидаемые функции, примеры у людей работают. Похоже эти настройки где-то закопаны очень глубоко, ну да ладно. Вопрос теперь такой: вызовы DMA должен формировать TIM2, а значения должны перезаписываться между буфером и регистром TIM5. Как это сделать?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: РАБОТА ПРЕРЫВАНИЙ в HAL библиотеках.
СообщениеДобавлено: 18 ноя 2020, 13:20 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1396
RedOrm писал(а):
В коде не увидел упоминания о TIM5.

Без разницы какой таймер, поменяются несколько 5-к на 3-ки и буфер станет uint32_t. Зачем вообще тратить один из двух 32-х битных таймеров на шим, где 32 бита не нужно?

Цитата:
в моем случае запросы DMA должен формировать TIM3, и DMA же будет перезаписывать регистр сравнения для TIM5? и когда именно TIM3 будет формировать запросы в DMA? В TIM3 я использую три канала. Соответственно есть три регистра сравнения и регистр переполнения (ARR который). Когда именно TIM3 будет формировать запросы в DMA? По совпадению с каким-то регистром сравнения? по переполнению? или это как то настраивается в самом таймере?

Вот эта строка:
Код:
tim.enableDmaRequests<TimDmaReq::CapCom1>();   // TIM_DIER_CC1DE

Вместо CapCom1 может быть CapCom4 или Update(или все вместе)... Сам таймер генерящий запросы выбирается через DMAMUX.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: РАБОТА ПРЕРЫВАНИЙ в HAL библиотеках.
СообщениеДобавлено: 18 ноя 2020, 13:52 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1396
RedOrm писал(а):
А в действительности хотелось бы иметь возможность формировать количество начальных (широких) импульсов произвольно. Скажем 1000. Использовать массив на 1001 элемент вроде не очень. Поэтому было бы целесообразно формировать запросы DMA перед непосредственно последним коротким импульсом. Тогда все широкие импульсы будут формироваться по первому значению массива, а один узкий - по второму.

По разному можно сделать, возможно стоит рассмотреть вариант с таймером у которого есть RCR(repetition counter)... На самом деле у таймеров имеется еще одна продвинутая возможность работать с DMA, когда идет работа сразу с группой регистров таймера, а регистры расположены в таком порядке(если есть RCR): PSC, ARR, RCR, CCR1..CCR4. Другими словами можно заставить DMA обновлять сразу, например, ARR/RCR/СCR1, таким образом будет меняться период, заполнение и число повторений.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: РАБОТА ПРЕРЫВАНИЙ в HAL библиотеках.
СообщениеДобавлено: 18 ноя 2020, 15:01 
Заглядывает иногда

Зарегистрирован: 17 ноя 2020, 10:45
Сообщения: 40
Происходит непонятная херь. Делаю два эксперимента.

Эксперимент 1. Настраиваю в STM32CubeMX два таймера TIM3 и TIM5. В качестве источников тактовой частоты для обоих выбираю Internal Clock (200 MHz). Для обоих устанавливаю значение Channel1 PWM Generation CH1, значение Counter Period 167, значение Pulse 84.
Для TIM5 настраиваю DMA: DMA Request TIM5_CH1, Stream DMA1 Stream 0, Direction Memory To Peripheral, Priority Low, Mode Circular, Incremental Address Memory, Data Width World.
Генерю проект. Пишу код:

Код:
uint32_t PWMbuf [] = { 84, 84 , 42 };

MX_GPIO_Init();
MX_DMA_Init();
MX_TIM3_Init();
MX_TIM5_Init();

HAL_TIM_PWM_Start (&htim3, TIM_CHANNEL_1);
HAL_TIM_PWM_Start_DMA (&htim5, TIM_CHANNEL_1, PWMbuf, 3);

while (1)
  {

  }


Вижу на осциллографе
Вложение:
Скриншот (18.11.2020 12-50-26).jpg
Скриншот (18.11.2020 12-50-26).jpg [ 144.44 Кб | Просмотров: 545 ]


Верхний сигнал - выход TIM3, нижний - выход TIM5. Все шикарно, я счастлив, все как и хотел.

Эксперимент 2. Теперь делаю второй эксперимент. Он отличается от первого тем что TIM5 тактируется не от Internal Clock (200 MHz), а от TIM3. Для этого настраиваю в Cube TIM5 так: Slave Mode External Clock Mode 1, Trigger source ITR2, значение Counter Period 6, значение Pulse 4.
Генерю проект. Пишу код:

Код:
uint32_t PWMbuf [] = { 4, 4 , 2 };

MX_GPIO_Init();
MX_DMA_Init();
MX_TIM3_Init();
MX_TIM5_Init();

HAL_TIM_PWM_Start (&htim3, TIM_CHANNEL_1);
HAL_TIM_PWM_Start_DMA (&htim5, TIM_CHANNEL_1, PWMbuf, 3);

while (1)
  {

  }


Вижу на осциллографе:
Вложение:
Скриншот (18.11.2020 13-00-06).jpg
Скриншот (18.11.2020 13-00-06).jpg [ 179.64 Кб | Просмотров: 545 ]


Где импульсы? Что за избирательная нелюбовь к частоте тактирования от TIM3? Уже несколько раз замечал, что в случае выбора частоты тактирования не Internal Clock все идет не по плану. Где я косячу?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: РАБОТА ПРЕРЫВАНИЙ в HAL библиотеках.
СообщениеДобавлено: 18 ноя 2020, 15:13 
Заглядывает иногда

Зарегистрирован: 17 ноя 2020, 10:45
Сообщения: 40
Настройки TIM5 для второго эксперимента:
Вложение:
Скриншот (18.11.2020 13-11-17).jpg
Скриншот (18.11.2020 13-11-17).jpg [ 79.38 Кб | Просмотров: 542 ]

Вложение:
Скриншот (18.11.2020 13-11-44).jpg
Скриншот (18.11.2020 13-11-44).jpg [ 151.15 Кб | Просмотров: 542 ]

Вложение:
Скриншот (18.11.2020 13-11-58).jpg
Скриншот (18.11.2020 13-11-58).jpg [ 76.45 Кб | Просмотров: 542 ]


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: РАБОТА ПРЕРЫВАНИЙ в HAL библиотеках.
СообщениеДобавлено: 18 ноя 2020, 15:22 
Заглядывает иногда

Зарегистрирован: 17 ноя 2020, 10:45
Сообщения: 40
Косяк нашел


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: РАБОТА ПРЕРЫВАНИЙ в HAL библиотеках.
СообщениеДобавлено: 18 ноя 2020, 15:34 
Заглядывает иногда

Зарегистрирован: 17 ноя 2020, 10:45
Сообщения: 40
Reflector писал(а):
Вместо CapCom1 может быть CapCom4 или Update(или все вместе)...

Это я так понял выбор момента когда будет вызван запрос DMA.

А как настроить чтобы момент вызова запроса DMA определялся каналом 3 TIM2 и при этом менялось значение в регистре TIM5? Такое вообще возможно? Чтобы запрос DMA формировался одним таймером а значение перезаписывать в другой?

Можно конечно сформировать массив размером равный количеству повторяемых импульсов плюс 1 и формировать и запрос и перезапись в одном таймере. Но тогда мне потребуется массив где-то на 130 значений, а как это сделать избежав использования и прерываний и большого массива?


Последний раз редактировалось RedOrm 18 ноя 2020, 15:46, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: РАБОТА ПРЕРЫВАНИЙ в HAL библиотеках.
СообщениеДобавлено: 18 ноя 2020, 15:46 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1396
RedOrm писал(а):
Это я так понял выбор момента когда будет вызван запрос DMA. А как настроить чтобы момент вызова запроса DMA определялся каналом 3 TIM2 и при этом менялось значение в регистре TIM5? Такое вообще возможно?

Еще раз:
Код:
tim.enableDmaRequests<TimDmaReq::CapCom1>();   // TIM_DIER_CC1DE

Для какого объекта вызывается данная строка? Для tim, т.е. в данном случае речь идет о первом канале TIM3. Таймер генерит запросы DMA, чтобы DMA их обрабатывал нужно выбрать для него TIM3 посредством DMAMUX. В итоге DMA берет значение из массива и копирует его куда требуется, если нужно менять регистр TIM5, то прописываешь в качестве приемника адрес этого регистра.
Код:
stream.initMemToPeriph(buf, DmaSrc::_16b_Inc, &TIM3->CCR1, DmaDst::_16b, 3, DmaPrio::Medium, DmaMode::Circular);

Тут написано, что нужно скопировать 3 значения из buf по 16 бит с инкрементом в &TIM3->CCR1 по 16 бит без инкремента...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: РАБОТА ПРЕРЫВАНИЙ в HAL библиотеках.
СообщениеДобавлено: 18 ноя 2020, 15:55 
Заглядывает иногда

Зарегистрирован: 17 ноя 2020, 10:45
Сообщения: 40
Reflector писал(а):
Тут написано, что нужно скопировать 3 значения из buf по 16 бит с инкрементом в &TIM3->CCR1 по 16 бит без инкремента...

Это шикарно. Но в Вашем коде и запросы DMA формирует TIM3 и значение Вы меняете в TIM3, а я хочу чтобы запросы DMA формировал TIM2 и при этом менять значение в TIM5. Как это в Cube настроить? Вообще возможно?

Reflector писал(а):
В итоге DMA берет значение из массива и копирует его куда требуется, если нужно менять регистр TIM5, то прописываешь в качестве приемника адрес этого регистра.

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: РАБОТА ПРЕРЫВАНИЙ в HAL библиотеках.
СообщениеДобавлено: 18 ноя 2020, 16:02 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1396
RedOrm писал(а):
Из этой фразы выходит что в принципе возможно то что я хочу. Только мне придется вручную указать адрес назначения куда писать, потому что Cube настраивает так, чтобы и запрос DMA и адрес где будет перезапись, все находится в одном таймере. Так?

Я не пользуюсь кубом и не знаю как он там все настраивает, но адреса для DMA могут быть какими-угодно...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: РАБОТА ПРЕРЫВАНИЙ в HAL библиотеках.
СообщениеДобавлено: 18 ноя 2020, 16:05 
Заглядывает иногда

Зарегистрирован: 17 ноя 2020, 10:45
Сообщения: 40
Reflector писал(а):
RedOrm писал(а):
но адреса для DMA могут быть какими-угодно...

Тогда я полагаю мне достаточно вручную поменять адрес для перезаписи в DMA. Так?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: РАБОТА ПРЕРЫВАНИЙ в HAL библиотеках.
СообщениеДобавлено: 18 ноя 2020, 16:15 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1396
RedOrm писал(а):
Так?

Так.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: РАБОТА ПРЕРЫВАНИЙ в HAL библиотеках.
СообщениеДобавлено: 18 ноя 2020, 16:17 
Заглядывает иногда

Зарегистрирован: 17 ноя 2020, 10:45
Сообщения: 40
А что за библиотеки вы используете с классами? Рукопашные?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: РАБОТА ПРЕРЫВАНИЙ в HAL библиотеках.
СообщениеДобавлено: 18 ноя 2020, 16:20 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1396
RedOrm писал(а):
Рукопашные?

Именно так, причем на днях я их переделал под GCC 10, а они и раньше мало у кого работали :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: РАБОТА ПРЕРЫВАНИЙ в HAL библиотеках.
СообщениеДобавлено: 18 ноя 2020, 18:20 
Заглядывает иногда

Зарегистрирован: 17 ноя 2020, 10:45
Сообщения: 40
Попробовал на хал реализовать. Значение в регистре TIM5 меняю, но получилось так
Вложение:
Скриншот (18.11.2020 16-19-30).jpg
Скриншот (18.11.2020 16-19-30).jpg [ 156.57 Кб | Просмотров: 509 ]


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: РАБОТА ПРЕРЫВАНИЙ в HAL библиотеках.
СообщениеДобавлено: 30 ноя 2020, 18:50 
Заглядывает иногда

Зарегистрирован: 17 ноя 2020, 10:45
Сообщения: 40
Reflector писал(а):
адреса для DMA могут быть какими-угодно...

А возможно, что при возникновении запроса от таймера, DMA изменял значения по нескольким адресам? Например один адрес в настройках таймера 1, второй адрес в настройках АЦП, третий адрес в настройках самого DMA ?
Читал про работу DMA в burst режиме. Там возможно менять несколько адресов, но все они из одной области. Цитата из одной статьи: "В этом режиме можно с помощью DMA менять значения в нескольких регистрах таймера за один запрос."
А возможно что то подобное, но только в разных периферийных блоках, например TIM1, ADC, DMA ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: РАБОТА ПРЕРЫВАНИЙ в HAL библиотеках.
СообщениеДобавлено: 30 ноя 2020, 18:57 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1396
RedOrm писал(а):
А возможно, что при возникновении запроса от таймера, DMA изменял значения по нескольким адресам?

MDMA умеет со списками работать, по идее он такое может.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 29 ]  На страницу 1, 2  След.


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


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB