Форум программистов, компьютерный форум, киберфорум
Микроконтроллеры ARM, Cortex, STM32
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 06.08.2020
Сообщений: 28

STM32CubeMX. Проблема в инициализации DMA

03.11.2021, 10:22. Показов 1259. Ответов 4

Студворк — интернет-сервис помощи студентам
Здравствуйте! Пытаюсь на stm32 управлять светодиодами ws2812. Сигналы планирую передавать с помощью ШИМ в режиме DMA. Проект создаю в STM32CubeMX. Столкнулся с проблемой, что ни одна функция так или иначе связанная с работой в режиме DMA не работает. Есть предположение, что CubeMX не инициализирует DMA как следует. Функция инициализации, сгенерированная кубом имеет следующий вид
C
1
2
3
4
5
6
7
8
9
10
11
12
static void MX_DMA_Init(void)
{
 
  /* DMA controller clock enable */
  __HAL_RCC_DMA2_CLK_ENABLE();
 
  /* DMA interrupt init */
  /* DMA2_Channel3_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(DMA2_Channel3_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(DMA2_Channel3_IRQn);
 
}
В интернете нашел некоторые примеры того, что нужно дописать в функцию, чтобы активировать DMA. Пока что получился такой вариант
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
static void MX_DMA_Init(void)
{
 
  /* DMA controller clock enable */
  __HAL_RCC_DMA2_CLK_ENABLE();
 
  /******************************************************************/
  hdma_tim8_ch1.Init.Direction = DMA_MEMORY_TO_PERIPH;
  hdma_tim8_ch1.Init.PeriphInc = DMA_PINC_DISABLE;
  hdma_tim8_ch1.Init.MemInc = DMA_MINC_ENABLE;
  hdma_tim8_ch1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
  hdma_tim8_ch1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
  hdma_tim8_ch1.Init.Mode = DMA_NORMAL;
  hdma_tim8_ch1.Init.Priority = DMA_PRIORITY_LOW;
  /******************************************************************/
 
  /* DMA interrupt init */
  /* DMA2_Channel3_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(DMA2_Channel3_IRQn, 0, 0);
  HAL_NVIC_EnableIRQ(DMA2_Channel3_IRQn);
  HAL_DMA_Init(&hdma_tim8_ch1);
 
}
Проект собирается без ошибок, но при выполнении функции HAL_DMA_Init(&hdma_tim8_ch1) происходит ошибка. В отладке выяснил, что ошибка возникает в 43 строчке следующего кода.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
HAL_StatusTypeDef HAL_DMA_Init(DMA_HandleTypeDef *hdma)
{ 
  uint32_t tmp = 0U;
  
  /* Check the DMA handle allocation */
  if(NULL == hdma)
  {
    return HAL_ERROR;
  }
  
  /* Check the parameters */
  assert_param(IS_DMA_ALL_INSTANCE(hdma->Instance));
  assert_param(IS_DMA_DIRECTION(hdma->Init.Direction));
  assert_param(IS_DMA_PERIPHERAL_INC_STATE(hdma->Init.PeriphInc));
  assert_param(IS_DMA_MEMORY_INC_STATE(hdma->Init.MemInc));
  assert_param(IS_DMA_PERIPHERAL_DATA_SIZE(hdma->Init.PeriphDataAlignment));
  assert_param(IS_DMA_MEMORY_DATA_SIZE(hdma->Init.MemDataAlignment));
  assert_param(IS_DMA_MODE(hdma->Init.Mode));
  assert_param(IS_DMA_PRIORITY(hdma->Init.Priority));
  
  /* Change DMA peripheral state */
  hdma->State = HAL_DMA_STATE_BUSY;
 
  /* Get the CR register value */
  tmp = hdma->Instance->CCR;
  
  /* Clear PL, MSIZE, PSIZE, MINC, PINC, CIRC, DIR bits */
  tmp &= ((uint32_t)~(DMA_CCR_PL    | DMA_CCR_MSIZE  | DMA_CCR_PSIZE  | \
                      DMA_CCR_MINC  | DMA_CCR_PINC   | DMA_CCR_CIRC   | \
                      DMA_CCR_DIR));
  
  /* Prepare the DMA Channel configuration */
  tmp |=  hdma->Init.Direction        |
          hdma->Init.PeriphInc           | hdma->Init.MemInc           |
          hdma->Init.PeriphDataAlignment | hdma->Init.MemDataAlignment |
          hdma->Init.Mode                | hdma->Init.Priority;
 
  /* Write to DMA Channel CR register */
  hdma->Instance->CCR = tmp;  
  
  /* Initialize DmaBaseAddress and ChannelIndex parameters used 
     by HAL_DMA_IRQHandler() and HAL_DMA_PollForTransfer() */
  DMA_CalcBaseAndBitshift(hdma);
  
  /* Initialise the error code */
  hdma->ErrorCode = HAL_DMA_ERROR_NONE;
 
  /* Initialize the DMA state*/
  hdma->State = HAL_DMA_STATE_READY;
  
  /* Allocate lock resource and initialize it */
  hdma->Lock = HAL_UNLOCKED;
  
  return HAL_OK;
}
Знаю, что в интернете проектов для управления ws2812 огромное множество. За основу взял уроки с ютуб канала Narod Stream, но почему-то в видео автор не сталкивался с подобной проблемой.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.11.2021, 10:22
Ответы с готовыми решениями:

stm32f407+ADC+DMA. Проблема с DMA
Доброго дня! Новичок в stm, первый проект, начальные наброски, не понимаю,почему не работает эта связка(в заголовке). Есть несколько...

Проблема с STM32CubeMX - неверная скорость UART
Приветствую, господа. Такая вещь, в Кубике 4.18.0 ставлю скорость UART (любого) 115200 и в терминале получаю болт. Цепляюсь логическим...

ST32F217 косяк после инициализации DMA.
И сразу суть проблемы. Есть простая работающая программа - freeRTOS + мигание диодом (там еще небольшая лабуда есть, но не суть). ...

4
 Аватар для _SayHello
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
03.11.2021, 10:48
DalOpez,
Цитата Сообщение от DalOpez Посмотреть сообщение
Проект собирается без ошибок, но при выполнении функции HAL_DMA_Init(&hdma_tim8_ch1) происходит ошибка. В отладке выяснил, что ошибка возникает в 43 строчке следующего кода.
Что за ошибка?
Где инициализируются то откуда и куда будет DMA данные гонять?
0
0 / 0 / 0
Регистрация: 06.08.2020
Сообщений: 28
03.11.2021, 11:02  [ТС]
После выполнения 43 строки выбрасывает в HardFault_Handler. Не совсем понял второй вопрос. Разве за направление не отвечает поле Direction?
0
 Аватар для _SayHello
874 / 535 / 175
Регистрация: 30.07.2015
Сообщений: 1,739
03.11.2021, 11:12
DalOpez,
Цитата Сообщение от DalOpez Посмотреть сообщение
Разве за направление не отвечает поле Direction?
direction отвечает за направление передачи.
Цитата Сообщение от DalOpez Посмотреть сообщение
осле выполнения 43 строки выбрасывает в HardFault_Handler.
Ну зайдите внутрь функции, посмотрите там. Hardfault как правило возникает, когда обращаются по неинициализированному указателю и лезут в область нелоступную область памяти.
0
0 / 0 / 0
Регистрация: 06.08.2020
Сообщений: 28
03.11.2021, 12:15  [ТС]
В Hardfault выбрасывает после попытки зайти в функцию
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.11.2021, 12:15
Помогаю со студенческими работами здесь

Проблема с STM32CubeMX plugin eclipse
Доброго времени суток. Попытался воспользоваться данным плагином. Собственно функции у него абсолютно такие же как и у обычного...

Проблема в коде (ADC DMA)
Ребята помогите с кодом разобраться, у меня стоит мк(stm32f051), ошибка только в этом NVIC_InitTypeDef NVIC_InitStructure; не понимает...

Проблема связки DAC DMA в STM32F3
Приветствую участников форума. Уже несколько дней бьюсь со связкой DAC+DMA в МК STM32F373C8 Сиптомы следующие: Вариант настройки 1...

STM8L (ADC -> DMA) проблема синхронизации
Здравствуйте, уткнулся в проблему, не знаю куда копать. Первый проект на STM, и идеи кончились. Задача: измерение напряжения на 4х...

STM32F107 проблема с отправкой кадра с помощью DMA
Пользуюсь платой TE-STM32F107. Собственно, начитавшись/насмотревшись всяких примеров, попытался отправить кадр по Ethernet с помощью DMA. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru