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