Easyelectronics.ru

Электроника для всех
Текущее время: 25 май 2017, 17:35

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



    • Изготовление печатных плат. Примерные цены: 10 штук 2-слоя 100*100mm 8.21$ или около ~470 рублей
    • Создание принципиальных схем и проектирование печатных плат
    • Симуляция работы на spice моделях
    • Просмотр GERBER файлов

Начать новую тему Ответить на тему  [ Сообщений: 13 ] 
Автор Сообщение
 Заголовок сообщения: DMA + Таймер в режиме PWM1 для STM3F4
СообщениеДобавлено: 17 фев 2017, 17:24 
Только пришел

Зарегистрирован: 06 апр 2016, 23:53
Сообщения: 9
Добрый день. Изучаю возможности стандартной библиотеки. При попытке сконфигурировать DMA2 так, чтобы он загружал длину импульса шим в CCR2 таймера TIM8 из памяти, ничего не получилось. Помогите, пожалуйста, найти ошибку. Процессор stm32f407. Таймер работает нормально и генерирует сигнал на ножке PC7.
Show


Последний раз редактировалось elisey 17 фев 2017, 17:49, всего редактировалось 1 раз.
Выкладывать код нужно с использованием тегов [code]


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DMA + Таймер в режиме PWM1 для STM3F4
СообщениеДобавлено: 17 фев 2017, 19:35 
Старожил

Зарегистрирован: 26 июл 2015, 12:24
Сообщения: 660
Zuganov писал(а):
Добрый день. Изучаю возможности стандартной библиотеки. При попытке сконфигурировать DMA2 так, чтобы он загружал длину импульса шим в CCR2 таймера TIM8 из памяти, ничего не получилось.

Вы,то восьмой,а то,внезапно-первый таймер инициализируете...копипаст...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DMA + Таймер в режиме PWM1 для STM3F4
СообщениеДобавлено: 17 фев 2017, 22:37 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 3886
Вечный нуб, про таймер1 и слова не было, надо учиться внимательно читать, всему виной твое кредо абыкака...
Здесь дело в непонимании работы железа , а слепое тыканье в SPL и калокубе только вредит , и уж понижению вхождения точно не поможет...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DMA + Таймер в режиме PWM1 для STM3F4
СообщениеДобавлено: 18 фев 2017, 00:05 
Свой человек

Зарегистрирован: 14 сен 2015, 08:50
Сообщения: 169
Откуда: Россия, Ростов-на-Дону
dosikus_2 писал(а):
Вечный нуб, про таймер1 и слова не было, надо учиться внимательно читать, всему виной твое кредо абыкака...
Здесь дело в непонимании работы железа , а слепое тыканье в SPL и калокубе только вредит , и уж понижению вхождения точно не поможет...

А теперь внимательно посмотри код - там действительно, то TIM8, то TIM1 стоит. Novice абсолютно верно сказал, что ошибка из-за
Цитата:
...копипаст...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DMA + Таймер в режиме PWM1 для STM3F4
СообщениеДобавлено: 18 фев 2017, 00:46 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 3886
Увы, копипаст это лишь следствие, а причина на много опасней и мной уже указана. Будете и далее слепо веровать в облегчалки не изучая железо будет хуже намного . Тебя это в большей степени касается, ибо именно ты всем советуешь это г. ...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DMA + Таймер в режиме PWM1 для STM3F4
СообщениеДобавлено: 18 фев 2017, 09:42 
Старожил

Зарегистрирован: 26 июл 2015, 12:24
Сообщения: 660
надо учиться внимательно читать, всему виной твое кредо абыкака...
Show

Микроскопы-зрения лишили?Сочувствую.Таков он мир лёгкой электроники? с STM32.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DMA + Таймер в режиме PWM1 для STM3F4
СообщениеДобавлено: 18 фев 2017, 10:25 
Старожил
Аватара пользователя

Зарегистрирован: 23 янв 2013, 12:33
Сообщения: 1548
Откуда: Донецк, ДНР
Цитата:
Код:
   /* Time base configuration */
   TIM_TimeBaseStructure.TIM_Prescaler = 0; // Dump 1X clock into timer
   TIM_TimeBaseStructure.TIM_Period = Period - 1;
   TIM_TimeBaseStructure.TIM_ClockDivision = 0;
   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
   TIM_TimeBaseInit([b]TIM1[/b], &TIM_TimeBaseStructure);



TIM1 != TIM8. Опечатка?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DMA + Таймер в режиме PWM1 для STM3F4
СообщениеДобавлено: 18 фев 2017, 18:49 
Только пришел

Зарегистрирован: 06 апр 2016, 23:53
Сообщения: 9
К сожалению, я допустил ошибку:
hd44780 писал(а):
Цитата:
Код:
   /* Time base configuration */
   TIM_TimeBaseStructure.TIM_Prescaler = 0; // Dump 1X clock into timer
   TIM_TimeBaseStructure.TIM_Period = Period - 1;
   TIM_TimeBaseStructure.TIM_ClockDivision = 0;
   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
   TIM_TimeBaseInit([b]TIM1[/b], &TIM_TimeBaseStructure);



TIM1 != TIM8. Опечатка?

там действительно должно быть TIM8. В этой программе также в другом месте конфигурируется таймер TIM1. После исправления так и не удалось загрузить значение длины импульса в регистр CCR2 таймера TIM8 при помощи DMA.
Код:
void GPIOC_Configuration(void)
      {
      RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
      GPIO_InitTypeDef GPIO_InitStructure;

      /*-------------------------- GPIO Configuration ----------------------------*/
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 ;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
      GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
      GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
      GPIO_Init(GPIOC, &GPIO_InitStructure);

      /* Connect TIM8 pins to AF */
      GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_TIM8);
      }

      void TIM8_Configuration(void)
      {
      uint32_t a=100;
      RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);
      TIM_OCInitTypeDef TIM_OCInitStructure;
      TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
      uint16_t Period;

      Period = (SystemCoreClock / 800);

      /* Time base configuration */
      TIM_TimeBaseStructure.TIM_Prescaler = 0; // Dump 1X clock into timer
      TIM_TimeBaseStructure.TIM_Period = Period - 1;
      TIM_TimeBaseStructure.TIM_ClockDivision = 0;
      TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
      TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);

      /* TIM PWM1 Mode configuration */
      TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
      TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
      TIM_OCInitStructure.TIM_Pulse = Period / 3; // 33%
      TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

      /* Output Compare PWM1 Mode configuration: Channel1 PC.07 */
      TIM_OC2Init(TIM8, &TIM_OCInitStructure);

      /* TIM8 Main Output Enable */
      TIM_CtrlPWMOutputs(TIM8, ENABLE);

      /* TIM8 enable counter */
      TIM_Cmd(TIM8, ENABLE);

      DMA_InitTypeDef dma_init;
      RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
      DMA_DeInit(DMA2_Stream2);
      dma_init.DMA_Channel = DMA_Channel_6;
      dma_init.DMA_PeripheralBaseAddr = (uint32_t)&(TIM8->CCR2);
      dma_init.DMA_Memory0BaseAddr = (uint32_t)&a;
      dma_init.DMA_DIR = DMA_DIR_MemoryToPeripheral;
      dma_init.DMA_BufferSize = 1;
      dma_init.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
      dma_init.DMA_MemoryInc = DMA_MemoryInc_Enable;
      dma_init.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
      dma_init.DMA_MemoryDataSize = DMA_PeripheralDataSize_Word;
      dma_init.DMA_Mode = DMA_Mode_Circular;
      dma_init.DMA_Priority = DMA_Priority_High;
      dma_init.DMA_FIFOMode = DMA_FIFOMode_Disable;
      dma_init.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
      dma_init.DMA_MemoryBurst = DMA_MemoryBurst_Single;
      dma_init.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
      DMA_Init(DMA2_Stream2, &dma_init);
      TIM_DMAConfig(TIM8, TIM_DMABase_CCR2,TIM_DMABurstLength_1Transfer);
      TIM_DMACmd(TIM8,TIM_DMA_CC2, ENABLE);
      DMA_Cmd(DMA2_Stream2, ENABLE);
      }


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DMA + Таймер в режиме PWM1 для STM3F4
СообщениеДобавлено: 18 фев 2017, 21:46 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 3886
Вам уже начерчен путь истинный, без изучения железа вы вечно будете плавать и ожидать помощи от вечных нубов и вубогом, которые сами ничего не знают...
Если есть желание , стучите в личку , проведу ликбез...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DMA + Таймер в режиме PWM1 для STM3F4
СообщениеДобавлено: 23 фев 2017, 20:16 
Только пришел

Зарегистрирован: 06 апр 2016, 23:53
Сообщения: 9
Проблема решена. Для работы с DMA таймер имеет два регистра: DCR и DMAR. DCR используется для конфигурации. В него записывается количество транзакции (в моем случае нужно было заполнить все CCRx регистры CCR1-CCR4 - необходимо сделать 4 транзакции) и номер регистра (отсчитавается с 0, можно увидеть в Register map в reference manual для таймера). Регистр DMAR используется для предачи данных - его его адрес необходимо указать как адрес назначения в периферии в настройках DMA. Рабочий код написан с использованием лишь библиотеки stm32f4xx.h.
Show

Для желающих разобраться со стандартными библиотеками. По ссылке http://radiokot.ru/forum/viewtopic.php?p=2580989 разбирается решение этой проблемы при помощи функций стандартных библиотек.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DMA + Таймер в режиме PWM1 для STM3F4
СообщениеДобавлено: 24 фев 2017, 10:06 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2161
Или сделать две транзации по 32 байта. Регистры то последовательно идут, можно спокойно подряд писать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DMA + Таймер в режиме PWM1 для STM3F4
СообщениеДобавлено: 24 фев 2017, 14:26 
Только пришел

Зарегистрирован: 06 апр 2016, 23:53
Сообщения: 9
Hold писал(а):
Или сделать две транзации по 32 байта. Регистры то последовательно идут, можно спокойно подряд писать.

Вопрос довольно интересный. В предложенной мной реализации программы я в настройках DMA указываю размеры элементов данных в памяти и периферии равными WORD (32 bit). Но регистры CCRx таймера TIM1 имеют разрядность 16 бит, а DMAR - 32 бита. При этом все работает нормально.
Код:
DMA2_Stream5->CR   |=   DMA_SxCR_PSIZE_1;//PSIZE WORD
   DMA2_Stream5->CR   |=   DMA_SxCR_MSIZE_1;//MSIZE WORD

Если бы я был не прав, то следуя логике, при транзациях по 32 бита, как сейчас сделано, в регистре CCR1 были бы одни 0, а в CCR2 было бы число. Такая же ситуация была бы с CCR3 и CCR4, так как число разрядностью 32 бита занимает вдвое меньше бит, чем 16 разрядное. Совершая транзакции по 32 бита все проходит нормально.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DMA + Таймер в режиме PWM1 для STM3F4
СообщениеДобавлено: 24 фев 2017, 16:48 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2161
Хотя да, может не так все просто... логично было бы предположить, что в память можно подряд писать, но тут-то периферия, скорее всего так нельзя. Попробуйте погонять по DMA RAM<->RAM, посмотреть будет ли работать. Помню, как-то напутал размерности, писалось лишнее.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 13 ] 

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


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

Сейчас этот форум просматривают: h4lf, moleTrainer, serglg


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

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

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