Я надеюсь, что мой заголовок верен терминологически. Я работаю (учусь) с платой обнаружения STM32F4, на которой установлен микроконтроллер STM32F407VGTx. Я очень стараюсь найти ответы в справочнике , но иногда действительно сложно найти даже где искать. Может быть, из-за того, что это 1700+ страниц...
Итак, вот ситуация, во время моих тестов (код C, компилятор arm-none-eabi-size) я понял, что могу записать любое значение в периферийные регистры, например в регистры GPIOD. Но используя тот же код (для записи по адресу), я не могу записать, например, адрес 0x58 (действительно 0x00000058). В случае периферийных регистров в документе четко указано, какие регистры/биты разрешены для записи, а какие доступны только для чтения с такими обозначениями, как «r», «rw». Однако для адреса 0x58 я не смог найти причину, по которой я не могу писать на него.
Любое руководство или объяснение будут оценены, спасибо.
обновлять:
Встречный вопрос: почему вы должны иметь возможность писать на этот адрес? Что-то сопоставляется с этим? — Маркус Мюллер
Хорошо, это немного интересно. Я только начал изучать внешние прерывания, и я хочу делать все (таким образом, включая внешние прерывания) на уровне регистров во время моего обучения. Вот почему я не использовал никаких функций из HAL, SPL или CMSIS, а также ни один из этих файлов не присутствует в каталоге проекта. Мне вроде как это удалось, так что у меня был правильный регистр EXTI, ожидающий запуска, но мне не удалось найти способ связать функцию обратного вызова с прерыванием, которая будет определять процесс, который я хочу выполнить в случае прерывания. Проверка таблицы NVIC (стр. 372) из справочного руководства показала, что каждое прерывание связано с адресом памяти в последнем столбце. Итак, я подумал, может быть, просто идея, что эти места будут содержать адрес памяти (указатель) на функции обработчика прерываний. Так, Затем я решил определить функцию, а затем записать адрес этой функции в ячейку памяти 0x58. Так что, когда придет прерывание, микроконтроллер будет смотреть на 0x58, который перенаправит его на местонахождение интересующей функции.
Да, это обновление само по себе могло быть совершенно другим вопросом. Извините за беспорядок. Я думаю, что на этот вопрос можно ответить и без этой истории, но комментарий заставил меня также добавить это...
Вам нужно взглянуть на конфигурацию памяти процессора. Cortex-M4 реализует архитектуру ARMv7-M. Вот фрагмент верхней половины карты памяти (к сожалению, в справочном руководстве M4 она разбита на две страницы ).
Как видите, область 0x00000000 - 0x1FFFFFFF
выделена для Code
. Реализация STM не будет включать доступный путь на системной шине AHB к этой области, поэтому вы не можете писать по этому адресу.
Возможно, таблица векторов перемещена ; есть регистр, в котором хранится «0» адрес этой таблицы, и его можно настроить. На самом деле это довольно удобная функция: она позволяет вам настроить таблицу обработчиков прерываний в любом месте ОЗУ, а затем с помощью одной записи (я VTOR
думаю, по адресу 0x08) вы можете переключиться на эту новую таблицу.
См. стр.218 руководства по программированию stm32f4 .
0x00000058
мне не разрешено изменять его окружение, скажем, с 0x50000000
адресом можно работать. Тогда я пишу 0x50000000
в VTOR
. Теперь таблица NVIC начинается с этого адреса. Тогда, если я напишу адрес моей функции обработчика прерываний, 0x50000058
я достигну того, что намеревался? Сейчас попробую, а пока жду вашего комментария. Спасибо за ответ кстати.Итак, я подумал, может быть, просто идея, что эти места будут содержать адрес памяти (указатель) на функции обработчика прерываний.
Вот как это работает. Есть еще ВТОР, как описал Маркус. Однако в простых проектах используется нечто, называемое файлом стартового ассемблера, обычно startup.s
в котором стек, куча и векторная таблица размещаются на своих местах.
Таблица векторов startup.s
слабо связана с обработчиком по умолчанию, который ничего не делает.
Если вы определяете функцию с точно таким же именем в другом месте, она переопределяет это значение по умолчанию.
Это для Cortex M4, что у вас чип от ST пока не важно.
Я не знаю, какой компилятор вы используете, но вот подробное описание файла запуска ARM: https://community.arm.com/developer/ip-products/processors/b/processors-ip-blog/ сообщения/расшифровка-файла-запуска-для-arm-cortex-m4
Этот адрес является программной флэш-памятью. Если вы хотите записать во флэш-память, это возможно, вам нужно сначала стереть ее с помощью периферийного устройства флэш-памяти, и вы не можете стереть выполняемую программу, поэтому не делайте этого. Есть два способа сделать это правильно. Вы можете скопировать таблицу векторов в SRAM и указать NVIC указать таблицу векторов в SRAM, чтобы вы могли свободно изменять вектор. Более распространенным решением было бы использование фиксированного кода прерывания, который берет адрес из переменной и переходит к этому адресу, поэтому вы можете просто изменить, куда указывает переменная.
Маркус Мюллер
Муйустан
Маркус Мюллер
Муйустан