Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Hard Fault при выключении DMA
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
ISK2010
ST32F105.
При выключении канала3 DMA1 используя побитовую адресацию (адресс 0x42400600) вываливаюсь в прерывание Hard Fault.

#define M25P_DMA_SPITXE (FlagStatus)(*((FlagStatus*) 0x42400600))
M25P_DMA_SPITXE = DISABLE;

При выключении с помощью "DMA1_Channel3->CCR &= 0xFFFFFFFE;" такого не происходит. Уже перепроверил, адрес бита правильный, поэтому вообще не могу понять в чем причина. Подскажите?

А еще я обнаружил, что такой же вылет происходит даже при считывании бита в регистре DMA посредством битовой адрессации. И при этом весь регистр обнуляется, чего вообще не может быть при побитовой адрессации. Кто-нибудь адрессовал побитово регистры DMA? Единственное ограничение, которое я нашел, это то, что DMA не может использовать bit-band. Но ни слова про то, что нельзя так адресовать его регистры.
igorsk
В даташите отмечен только SRAM bit-banding alias. Похоже, для периферии бит-бандинг просто не реализован.
ISK2010
Для периферии тоже реализован. Битовые адреса перифирии начинаются с 0x42000000. Я успешно использу битовую адрессация при проверке флагов и вкл/выкл для таймеров, spi, dac, gpio. У меня уже 50на50 одиночные ножки дергаются таким способом. DMA стал первым в списке из неробатающих с побитовой. По аналогии предположу, что USB тоже не будет работать. Предположил из-за того, что периферия сидит на APB1 и APB2 через Bridge1 and Bridge2. Ну а DMA сразу на AHB сидит.
ISK2010
Ура! Я нашел путь решения моей проблеммы с ошибкой чтения/записи бита в регистре DMA при использовании битовой адресации. Уж сколько я не читал мануалов, нигде не нашел ответа. Даже на форуме ST.com не нашел спасения, вернее не подтверждают регистрацию мою, по сему не могу задать вопрос. Но все же выход есть, и нашел я его "методом тыка".
Раньше, например, для побитовой адресации какого-либо флага я этот самый флаг обзывал так:
Код
#define M25P_DMA_SPITXE (FlagStatus)(*((FlagStatus*) 0x42400600))

И тогда команда "M25P_DMA_SPITXE = DISABLE;" в ассемблере имела вид:
Код
0x08001542 4E32      LDR      r6,[pc,#200] ; @0x0800160C
0x08001544 F8865194  STRB     r5,[r6,#0x194]

При работе таким способом с DMA, как я писал, случалось событие "Hard Fault".
Но если объявить M25P_DMA_SPITXE как u32 (unsigned 32bit), то соответственно получал:
Код
0x0800154E 4E32      LDR      r6,[pc,#200] ; @0x08001618
0x08001550 6035      STR      r5,[r6,#0x00]

И все работало отлично. Таким образом, я пришел к умозаключению, что при побитовой адресации нельзя использовать команды чтения/записи байта или полуслова (LDRB, STRB, LDRH и т.п.).
Вот только остались у меня вопросы:
1) Почему STRB и LDRB стали вызывать ошибку только когда я стал работать с регистрами DMA.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.