Easyelectronics.ru

Электроника для всех
Текущее время: 16 окт 2019, 07:25

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



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 19 ] 
Автор Сообщение
 Заголовок сообщения: Данные с порта в память(DMA)
СообщениеДобавлено: 09 сен 2019, 16:25 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 28 фев 2012, 13:44
Сообщения: 102
День добрый
Есть внешний параллельный АЦП, который я тактирую шимом одного из таймеров(STM32F4), вручную забирая данные с порта к которому подключен АЦП.
Возникла необходимость использовать для этих целей DMA.

ШИМ настроен на:  TIM4 - Channel 4 - PWM Generation CH4

Добавил DMA
Событие: TIM4_UP
Направление передачи: Периферия - Память
Инкрементируется адрес памяти

Собственно инициализация в кубе:

Код:
__HAL_RCC_GPIOB_CLK_ENABLE();
/**TIM4 GPIO Configuration    
PB9     ------> TIM4_CH4 
*/
GPIO_InitStruct.Pin = GPIO_PIN_9;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF2_TIM4;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
    
    
__HAL_RCC_TIM4_CLK_ENABLE();
/* TIM4 DMA Init */
/* TIM4_UP Init */
hdma_tim4_up.Instance = DMA1_Stream6;
hdma_tim4_up.Init.Channel = DMA_CHANNEL_2;
hdma_tim4_up.Init.Direction = DMA_PERIPH_TO_MEMORY;
hdma_tim4_up.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_tim4_up.Init.MemInc = DMA_MINC_ENABLE;
hdma_tim4_up.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
hdma_tim4_up.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
hdma_tim4_up.Init.Mode = DMA_NORMAL;
hdma_tim4_up.Init.Priority = DMA_PRIORITY_VERY_HIGH;
hdma_tim4_up.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
if (HAL_DMA_Init(&hdma_tim4_up) != HAL_OK)
{
  Error_Handler();
}

__HAL_LINKDMA(htim_base,hdma[TIM_DMA_ID_UPDATE],hdma_tim4_up);


Запускаю ШИМ, запускаю DMA:

Код:
HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_4);
HAL_DMA_Start(&hdma_tim4_up, (uint32_t)&PORT_ADC->IDR, &TestDMA[0], 100);

На выходе имею пустой массив

Опирался на AN4666, но что то делаю не так

Укажите пожалуйста на ошибку или подтолкните в нужном направлении.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Данные с порта в память(DMA)
СообщениеДобавлено: 09 сен 2019, 16:43 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 6213
Для начала, сделайте Per/Mem разрядностью 32 бита и вычитывайте весь IDR.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Данные с порта в память(DMA)
СообщениеДобавлено: 09 сен 2019, 16:51 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 5690
Nosaer, в F4 только у DMA2 есть доступ к портам .
Завязывали бы с калокубом и начали бы читать документацию...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Данные с порта в память(DMA)
СообщениеДобавлено: 09 сен 2019, 16:57 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 28 фев 2012, 13:44
Сообщения: 102
u37 писал(а):
Для начала, сделайте Per/Mem разрядностью 32 бита и вычитывайте весь IDR.

Ставил и
Код:
hdma_tim4_up.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
hdma_tim4_up.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;

и делал как в примере из AN4666,
Код:
hdma_tim4_up.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_tim4_up.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;

не помогло...

u37 писал(а):
и вычитывайте весь IDR.

Вот про это не понял. Можно подробнее?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Данные с порта в память(DMA)
СообщениеДобавлено: 09 сен 2019, 17:02 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 28 фев 2012, 13:44
Сообщения: 102
dosikus_2 писал(а):
Nosaer, в F4 только у DMA2 есть доступ к портам .
Завязывали бы с калокубом и начали бы читать документацию...


Я натыкался на эту информацию, но меня смутила там сноска, что это при использовании режима MEM2MEM для чтения порта. Но здесь возможно сказались мои скудные познания в английском.
Плюс в интернете находил пример, где использовался DMA1 на F4. Правда там наоборот был вывод в порт, но думаю это не имеет большого значения.

Попробую перезавести на DMA2. Спасибо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Данные с порта в память(DMA)
СообщениеДобавлено: 09 сен 2019, 17:03 
Старожил

Зарегистрирован: 11 сен 2012, 11:19
Сообщения: 5690
Nosaer писал(а):
Вот про это не понял. Можно подробнее?


Забить, он снова в обкурке...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Данные с порта в память(DMA)
СообщениеДобавлено: 10 сен 2019, 08:28 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 28 фев 2012, 13:44
Сообщения: 102
Перенастроил на DMA2. Результат все такой же не утешительный
Код:
  if(htim_base->Instance==TIM1)
  {
    __HAL_RCC_TIM1_CLK_ENABLE();
 
    /* TIM1 DMA Init */
    /* TIM1_UP Init */
    hdma_tim1_up.Instance = DMA2_Stream5;
    hdma_tim1_up.Init.Channel = DMA_CHANNEL_6;
    hdma_tim1_up.Init.Direction = DMA_PERIPH_TO_MEMORY;
    hdma_tim1_up.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_tim1_up.Init.MemInc = DMA_MINC_ENABLE;
    hdma_tim1_up.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
    hdma_tim1_up.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
    hdma_tim1_up.Init.Mode = DMA_NORMAL;
    hdma_tim1_up.Init.Priority = DMA_PRIORITY_VERY_HIGH;
    hdma_tim1_up.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
    if (HAL_DMA_Init(&hdma_tim1_up) != HAL_OK)
    {
      Error_Handler();
    }

    __HAL_LINKDMA(htim_base,hdma[TIM_DMA_ID_UPDATE],hdma_tim1_up);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Данные с порта в память(DMA)
СообщениеДобавлено: 10 сен 2019, 12:02 
Старожил

Зарегистрирован: 23 янв 2016, 15:37
Сообщения: 1015
__HAL_RCC_DMAx_CLK_ENABLE() ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Данные с порта в память(DMA)
СообщениеДобавлено: 10 сен 2019, 13:21 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 28 фев 2012, 13:44
Сообщения: 102
Включаю.
Код:
  /* DMA controller clock enable */
  __HAL_RCC_DMA2_CLK_ENABLE();

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Данные с порта в память(DMA)
СообщениеДобавлено: 10 сен 2019, 13:29 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 6213
Т.е. у вас ВСЯ инициализация DMA пролетает мимо? )))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Данные с порта в память(DMA)
СообщениеДобавлено: 10 сен 2019, 14:34 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 28 фев 2012, 13:44
Сообщения: 102
Нет же...
Код:
MX_DMA_Init();
MX_TIM1_Init();

Сначала как я понимаю подается тактирвоание на DMA.
Затем из MX_TIM1_Init уходим в HAL_TIM_Base_Init.
Из HAL_TIM_Base_Init в HAL_TIM_Base_MspInit где уже и происходит инициализация DMA.
main.c
Show

..hal_tim.c
Show

..hal_msp.c
Show


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Данные с порта в память(DMA)
СообщениеДобавлено: 10 сен 2019, 15:26 
Старожил
Аватара пользователя

Зарегистрирован: 18 май 2013, 20:43
Сообщения: 4335
Откуда: Кемеровская область, Киселевск
Nosaer писал(а):
dosikus_2 писал(а):
Nosaer, в F4 только у DMA2 есть доступ к портам .
Завязывали бы с калокубом и начали бы читать документацию...


Я натыкался на эту информацию, но меня смутила там сноска, что это при использовании режима MEM2MEM для чтения порта. Но здесь возможно сказались мои скудные познания в английском.
Плюс в интернете находил пример, где использовался DMA1 на F4. Правда там наоборот был вывод в порт, но думаю это не имеет большого значения.

Попробую перезавести на DMA2. Спасибо.


Ты еще и спорить решил? Тебе сказали для ADC используется DMA2. Потому что ADC подключен к APB2, а эта шина подключена к периферийному порту DMA2.

Касаемо режима передачи память-память, DMA1 это не сможет сделать потому что у него периферийный порт не подключен к шине AHB, поэтому не может работать в этом режиме.

DMA1 не может выводить в порт ты ошибаешься.

_________________
RADIOWOLF.RU


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Данные с порта в память(DMA)
СообщениеДобавлено: 10 сен 2019, 15:29 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 28 фев 2012, 13:44
Сообщения: 102
Oxford писал(а):
Ты еще и спорить решил? Тебе сказали для ADC используется DMA2. Потому что ADC подключен к APB2, а эта шина подключена к периферийному порту DMA2.

АЦП, что подключен к APB2 тут вообще ни при чем. Речь идет о порте ввода-вывода, к которому подключен внешний АЦП.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Данные с порта в память(DMA)
СообщениеДобавлено: 10 сен 2019, 15:34 
Старожил
Аватара пользователя

Зарегистрирован: 18 май 2013, 20:43
Сообщения: 4335
Откуда: Кемеровская область, Киселевск
Тоже самое. Для периферия-память DMA2, GPIO сидят на AHB шине, а она только у DMA2 подключена.
Ты начал дичь свою лить про DMA1 мол находил в инете работало. Если не понимаешь лучше молчи. Найди этот пример посмотрим где ты читал об этом. Пруф так сказать предоставьте.

И это завязывай с калокубом противно даже читать, весь инет засрали. Пиши на CMSIS. Так будет всем лучше. Железо понимать нужно. С калокубом ты этого не поймешь. Ты даже не понимаешь что оно генерирует как пользоваться HAL библиотекой, у нее есть мануал свой, ты его хотя бы открывал раз уж пользуешься калокубом?

_________________
RADIOWOLF.RU


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Данные с порта в память(DMA)
СообщениеДобавлено: 10 сен 2019, 16:06 
Заглядывает иногда
Аватара пользователя

Зарегистрирован: 28 фев 2012, 13:44
Сообщения: 102
Oxford писал(а):
Ты начал дичь свою лить про DMA1 мол находил в инете работало. Если не понимаешь лучше молчи. Найди этот пример посмотрим где ты читал об этом. Пруф так сказать предоставьте.
И это завязывай с калокубом противно даже читать, весь инет засрали. Пиши на CMSIS. Так будет всем лучше.

1) Про то, что на DMA1 "Работало" ни слова выше не было. Там только написано про то, почему я сначала пробовал запустить на DMA1.
2) И никакого спора, как вы говорите, что должно работать на DMA1 выше тоже нет. dosikus_2, мне указал на ошибку, я написал почему думал иначе. Поблагодарил его и сказал, что попробую исправить.
3) Не нужно трактовать чужие слова, так как вы хотите. Вы в своих двух сообщениях три раза пытались в ином свете представить мои сообщения( Про АЦП, про то что я спорил, и про то, что я говорил что пример из интернета работает)
4) И давайте оставим эти бессмысленные разговоры про: "дичь свою лить", "не понимаешь лучше молчи", "Ты еще и спорить решил", "противно даже читать, весь инет засрали". И будем писать только по делу!

Oxford писал(а):
Пиши на CMSIS. Так будет всем лучше. Железо понимать нужно. С калокубом ты этого не поймешь. Ты даже не понимаешь что оно генерирует как пользоваться HAL библиотекой, у нее есть мануал свой, ты его хотя бы открывал раз уж пользуешься калокубом?

на начальном этапе инициализации не знакомых мне вещей, мне удобнее генерировать проект в кубе. Изучать и смотреть уже все по сгенерированному коду, как все работает. В дальнейшем, когда я начинаю понимать как все работает. Я переписываю часть вещей на CMSIS, так как куб на самом деле глючен и очень сильно отстает в скорости выполнения. Для меня так удобнее и намного проще. Прошу это понять, так как все приходит с опытом.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Данные с порта в память(DMA)
СообщениеДобавлено: 10 сен 2019, 16:29 
Старожил
Аватара пользователя

Зарегистрирован: 18 май 2013, 20:43
Сообщения: 4335
Откуда: Кемеровская область, Киселевск
Цитата:
Плюс в интернете находил пример, где использовался DMA1 на F4. Правда там наоборот был вывод в порт, но думаю это не имеет большого значения.


Пруф дай где ты пример находил в интернете.


Учиться надо через чтение референс мануала и программирования на CMSIS, а не калокубо генерацией заниматься, а потом срать в инете на форумах этими листингами.

Вот ты щас ипешься с калокубом, а мы через референс мануалы тебе помогаем, ну как тебе такое?

_________________
RADIOWOLF.RU


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Данные с порта в память(DMA)
СообщениеДобавлено: 10 сен 2019, 17:10 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 6213
Гм.
Поставьте в качестве "регистра источника" какой-нибудь таймер, его счетчик и посмотрите, что в буфере вы получаете что-то_меняющееся.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Данные с порта в память(DMA)
СообщениеДобавлено: 10 сен 2019, 19:47 
Старожил

Зарегистрирован: 10 апр 2013, 17:41
Сообщения: 323
Я не пойму, подключится отладчиком и посмотреть содержимое сконфигурированных регистров дма роскомпозор запретил?

_________________
Стиль: "G&P"


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Данные с порта в память(DMA)
СообщениеДобавлено: 11 сен 2019, 08:48 
Старожил
Аватара пользователя

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 1002
Тот кто может подключиться, посмотреть регистры, а главное понять правильно ли они сконфигурированы, на форум HAL-овские портянки вывешивать не будет.


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

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


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

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


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

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

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