|
|
  |
Сброс DMA1 и последующая настройка в STM32 |
|
|
|
Sep 14 2014, 10:37
|
Частый гость
 
Группа: Участник
Сообщений: 142
Регистрация: 10-11-12
Пользователь №: 74 318

|
Приветствую. Опытным путём было установлено, что если сбросить DMA1 таким кодом Код RCC->AHBRSTR |= RCC_AHBRSTR_DMA1RST; RCC->AHBRSTR &= ~RCC_AHBRSTR_DMA1RST; и сразу после этого немедленно начать настраивать канал DMA, то DMA не будет работать. Если же после сброса поставить небольшую задержку (сейчас у меня стоит 10 микросекунд), то всё работает. Кто-нибудь сталкивался с таким поведением? Как правильно проверять, что канал DMA уже можно настраивать после сброса DMA? PS: камень STM32L151CBT6
--------------------
|
|
|
|
|
Sep 14 2014, 10:49
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(ArtDenis @ Sep 14 2014, 14:37)  Приветствую. Опытным путём было установлено, что если сбросить DMA1 таким кодом Код RCC->AHBRSTR |= RCC_AHBRSTR_DMA1RST; RCC->AHBRSTR &= ~RCC_AHBRSTR_DMA1RST; и сразу после этого немедленно начать настраивать канал DMA, то DMA не будет работать. Если же после сброса поставить небольшую задержку (сейчас у меня стоит 10 микросекунд), то всё работает. Кто-нибудь сталкивался с таким поведением? Как правильно проверять, что канал DMA уже можно настраивать после сброса DMA? PS: камень STM32L151CBT6 Задержка нужна не только после сброса, но и после подачи тактового сигнала на периферийный блок. Лучше использовать не цикл, а барьер.
|
|
|
|
|
Sep 14 2014, 11:10
|
Частый гость
 
Группа: Участник
Сообщений: 142
Регистрация: 10-11-12
Пользователь №: 74 318

|
Цитата(adnega @ Sep 14 2014, 16:49)  Лучше использовать не цикл, а барьер. А можно поподробнее про барьер?
--------------------
|
|
|
|
|
Sep 14 2014, 12:57
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(ArtDenis @ Sep 14 2014, 15:10)  А можно поподробнее про барьер? __DSB() /** \brief Data Synchronization Barrier This function acts as a special kind of Data Memory Barrier. It completes when all explicit memory accesses before this instruction complete. */
|
|
|
|
|
Sep 14 2014, 13:13
|
Частый гость
 
Группа: Участник
Сообщений: 142
Регистрация: 10-11-12
Пользователь №: 74 318

|
Работает, однако! Спасибо Добавил __DSB() в свою либу Хм. Почему-то этого __DSB в SPL не наблюдается... И задержек тоже там нету. Если откомпилировать проект, использующий SPL, с крутыми настройками оптимизации (O3 + LTO), то возможно он перестанет работать.
--------------------
|
|
|
|
|
Sep 14 2014, 13:16
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(ArtDenis @ Sep 14 2014, 17:13)  Работает, однако! Спасибо Добавил __DSB() в свою либу Хм. Почему-то этого __DSB в SPL не наблюдается... И задержек тоже там нету. Если откомпилировать проект, использующий SPL, с крутыми настройками оптимизации (O3 + LTO), то возможно он перестанет работать. Барьеры скорее всего нужны для многопроцессорных систем. Вы просто __NOP() не пробовали? Эти функции определены в core_cmInstr.h
|
|
|
|
|
Sep 14 2014, 13:19
|
Частый гость
 
Группа: Участник
Сообщений: 142
Регистрация: 10-11-12
Пользователь №: 74 318

|
Цитата(adnega @ Sep 14 2014, 19:16)  Барьеры скорее всего нужны для многопроцессорных систем. Вы просто __NOP() не пробовали? Так после сброса устройства нужен __DSB() или нет? Может как-то флаг где-нибудь надо смотреть? __NOP() не пробовал.
--------------------
|
|
|
|
|
Sep 14 2014, 14:19
|
Гуру
     
Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702

|
Цитата(ArtDenis @ Sep 14 2014, 18:02)  Т.е. совет ставить __DSB() неверный? Кто знает... Я бы советовал: 1. Не пользоваться сбросом, а пользоваться нормальной инициализацией каналов со сбросом флагов и т.п. 2. Не использовать микросекундные задержки где попало. 3. Найти ответы на вопросы в документации.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|