реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Сброс DMA1 и последующая настройка в STM32
ArtDenis
сообщение Sep 14 2014, 10:37
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 142
Регистрация: 10-11-12
Пользователь №: 74 318



Приветствую. Опытным путём было установлено, что если сбросить DMA1 таким кодом
Код
RCC->AHBRSTR |= RCC_AHBRSTR_DMA1RST;
RCC->AHBRSTR &= ~RCC_AHBRSTR_DMA1RST;

и сразу после этого немедленно начать настраивать канал DMA, то DMA не будет работать. Если же после сброса поставить небольшую задержку (сейчас у меня стоит 10 микросекунд), то всё работает. Кто-нибудь сталкивался с таким поведением? Как правильно проверять, что канал DMA уже можно настраивать после сброса DMA?

PS: камень STM32L151CBT6


--------------------
http://ufa-darts.ru/ - собираем дартс-лигу в Уфе
Go to the top of the page
 
+Quote Post
adnega
сообщение Sep 14 2014, 10:49
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 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

Задержка нужна не только после сброса, но и после подачи тактового сигнала на периферийный блок.
Лучше использовать не цикл, а барьер.
Go to the top of the page
 
+Quote Post
ArtDenis
сообщение Sep 14 2014, 11:10
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 142
Регистрация: 10-11-12
Пользователь №: 74 318



Цитата(adnega @ Sep 14 2014, 16:49) *
Лучше использовать не цикл, а барьер.

А можно поподробнее про барьер?


--------------------
http://ufa-darts.ru/ - собираем дартс-лигу в Уфе
Go to the top of the page
 
+Quote Post
adnega
сообщение Sep 14 2014, 12:57
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 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.
*/
Go to the top of the page
 
+Quote Post
ArtDenis
сообщение Sep 14 2014, 13:13
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 142
Регистрация: 10-11-12
Пользователь №: 74 318



Работает, однако! Спасибо cool.gif
Добавил __DSB() в свою либу

Хм. Почему-то этого __DSB в SPL не наблюдается... И задержек тоже там нету.
Если откомпилировать проект, использующий SPL, с крутыми настройками оптимизации (O3 + LTO), то возможно он перестанет работать.


--------------------
http://ufa-darts.ru/ - собираем дартс-лигу в Уфе
Go to the top of the page
 
+Quote Post
adnega
сообщение Sep 14 2014, 13:16
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(ArtDenis @ Sep 14 2014, 17:13) *
Работает, однако! Спасибо cool.gif
Добавил __DSB() в свою либу

Хм. Почему-то этого __DSB в SPL не наблюдается... И задержек тоже там нету.
Если откомпилировать проект, использующий SPL, с крутыми настройками оптимизации (O3 + LTO), то возможно он перестанет работать.

Барьеры скорее всего нужны для многопроцессорных систем.
Вы просто __NOP() не пробовали?
Эти функции определены в core_cmInstr.h
Go to the top of the page
 
+Quote Post
ArtDenis
сообщение Sep 14 2014, 13:19
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 142
Регистрация: 10-11-12
Пользователь №: 74 318



Цитата(adnega @ Sep 14 2014, 19:16) *
Барьеры скорее всего нужны для многопроцессорных систем.
Вы просто __NOP() не пробовали?

Так после сброса устройства нужен __DSB() или нет? Может как-то флаг где-нибудь надо смотреть?
__NOP() не пробовал.


--------------------
http://ufa-darts.ru/ - собираем дартс-лигу в Уфе
Go to the top of the page
 
+Quote Post
adnega
сообщение Sep 14 2014, 13:37
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(ArtDenis @ Sep 14 2014, 17:19) *
Так после сброса устройства нужен __DSB() или нет? Может как-то флаг где-нибудь надо смотреть?
__NOP() не пробовал.

Нужно дать устройству инициализироваться. Можно поискать в документации сколько циклов на это требуется.
Я пользуюсь другим подходом: стараюсь между включением тактового сигнала и непосредственной работой с регистрами вставлять какой-то полезный код.
Go to the top of the page
 
+Quote Post
ArtDenis
сообщение Sep 14 2014, 14:02
Сообщение #9


Частый гость
**

Группа: Участник
Сообщений: 142
Регистрация: 10-11-12
Пользователь №: 74 318



Т.е. совет ставить __DSB() неверный?


--------------------
http://ufa-darts.ru/ - собираем дартс-лигу в Уфе
Go to the top of the page
 
+Quote Post
adnega
сообщение Sep 14 2014, 14:19
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(ArtDenis @ Sep 14 2014, 18:02) *
Т.е. совет ставить __DSB() неверный?

Кто знает...
Я бы советовал:
1. Не пользоваться сбросом, а пользоваться нормальной инициализацией каналов со сбросом флагов и т.п.
2. Не использовать микросекундные задержки где попало.
3. Найти ответы на вопросы в документации.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Sep 14 2014, 14:21
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Как я понимаю - наличие NOP не гарантирует, что последующая запись в периферийное адресное пространство не выполниться ранее чем та запись, которая перед NOP.
Это касается тех случаев, когда периферия сидит на разных периферийных шинах да ещё с разным частотами тактирования.
Могу предположить, что RCC сидит на одной APB, а DMA - на другой (хотя в даташит мне заглядывать лень sm.gif.
Так что DSB - нужно, имхо.
Go to the top of the page
 
+Quote Post
adnega
сообщение Sep 14 2014, 14:38
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(jcxz @ Sep 14 2014, 18:21) *
Могу предположить, что RCC сидит на одной APB, а DMA - на другой

Тоже была такая версия. Причем на STM32L могут в целях энергосбережения быть выставлены такие делители, что потребуется больше одного NOP для корректной работы.
Go to the top of the page
 
+Quote Post
ArtDenis
сообщение Sep 15 2014, 04:04
Сообщение #13


Частый гость
**

Группа: Участник
Сообщений: 142
Регистрация: 10-11-12
Пользователь №: 74 318



Тут мне сообщили что вариант с __DSB() правильный. Остановлюсь на нём.


--------------------
http://ufa-darts.ru/ - собираем дартс-лигу в Уфе
Go to the top of the page
 
+Quote Post
jcxz
сообщение Sep 15 2014, 10:53
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(ArtDenis @ Sep 15 2014, 10:04) *
Тут мне сообщили что вариант с __DSB() правильный. Остановлюсь на нём.

Правильно сообщили sm.gif
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 28th July 2025 - 03:36
Рейтинг@Mail.ru


Страница сгенерированна за 0.01472 секунд с 7
ELECTRONIX ©2004-2016