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

 
 
> Hard Fault при выключении DMA
ISK2010
сообщение Sep 30 2010, 14:00
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 205
Регистрация: 21-09-10
Из: г.Зеленоград
Пользователь №: 59 631



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. Но ни слова про то, что нельзя так адресовать его регистры.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ISK2010
сообщение Oct 4 2010, 14:37
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 205
Регистрация: 21-09-10
Из: г.Зеленоград
Пользователь №: 59 631



Ура! Я нашел путь решения моей проблеммы с ошибкой чтения/записи бита в регистре 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.

Сообщение отредактировал IgorKossak - Oct 4 2010, 17:38
Причина редактирования: Бездумное использование тега CODEBOX
Go to the top of the page
 
+Quote Post



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

 


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


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