Easyelectronics.ru

Электроника для всех
Текущее время: 29 июн 2017, 08:39

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



    • The World's Cheapest PCB Prototyping: 10 шт. 2-слоя 100*100mm 2$(около 140rub), изготовление за 24 часа.
    • Создание принципиальных схем и проектирование печатных плат
    • Крупнейший китайский онлайн магазин радиодеталей. Скидка 50%
    • Просмотр 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
Сообщения: 3933
Вечный нуб, про таймер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
Сообщения: 3933
Увы, копипаст это лишь следствие, а причина на много опасней и мной уже указана. Будете и далее слепо веровать в облегчалки не изучая железо будет хуже намного . Тебя это в большей степени касается, ибо именно ты всем советуешь это г. ...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: 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
Сообщения: 1564
Откуда: Донецк, ДНР
Цитата:
Код:
   /* 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
Сообщения: 3933
Вам уже начерчен путь истинный, без изучения железа вы вечно будете плавать и ожидать помощи от вечных нубов и вубогом, которые сами ничего не знают...
Если есть желание , стучите в личку , проведу ликбез...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: 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
Сообщения: 2225
Или сделать две транзации по 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
Сообщения: 2225
Хотя да, может не так все просто... логично было бы предположить, что в память можно подряд писать, но тут-то периферия, скорее всего так нельзя. Попробуйте погонять по DMA RAM<->RAM, посмотреть будет ли работать. Помню, как-то напутал размерности, писалось лишнее.


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

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


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

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


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

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

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