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

 
 
 
Reply to this topicStart new topic
> 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
igorsk
сообщение Sep 30 2010, 21:23
Сообщение #2


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

Группа: Участник
Сообщений: 84
Регистрация: 22-03-10
Пользователь №: 56 131



В даташите отмечен только SRAM bit-banding alias. Похоже, для периферии бит-бандинг просто не реализован.
Go to the top of the page
 
+Quote Post
ISK2010
сообщение Oct 1 2010, 04:21
Сообщение #3


Местный
***

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



Для периферии тоже реализован. Битовые адреса перифирии начинаются с 0x42000000. Я успешно использу битовую адрессация при проверке флагов и вкл/выкл для таймеров, spi, dac, gpio. У меня уже 50на50 одиночные ножки дергаются таким способом. DMA стал первым в списке из неробатающих с побитовой. По аналогии предположу, что USB тоже не будет работать. Предположил из-за того, что периферия сидит на APB1 и APB2 через Bridge1 and Bridge2. Ну а DMA сразу на AHB сидит.
Go to the top of the page
 
+Quote Post
ISK2010
сообщение Oct 4 2010, 14:37
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 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 Текстовая версия Сейчас: 27th June 2025 - 20:08
Рейтинг@Mail.ru


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