Как переместить таблицу векторов и изменить начальный адрес в cortexm3 с помощью uvision (Keil)?

Я использую микроконтроллер STM32F107 cortex m3. Я использую Keil uvision IDE для проекта. У меня есть приложение, которое работает правильно в начальном месте, то есть 0x0800 0000. Если я изменю начальное местоположение на 0x0800 4000, приложение не будет работать должным образом. Я внес изменения в расположение векторной таблицы, используя эту функцию как таковую:

NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x8004000)

т.е. изменил SCB->VTOR = 0x8004000 на это место.

Но даже после выполнения этого прерывания не происходит. Должен ли я сделать что-то еще, чтобы этот проект заработал?


person suraj    schedule 07.02.2013    source источник
comment
Я подозреваю, что вы пытаетесь сказать, что таблица векторов в вашем приложении после загрузки перемещается по адресу 0x0800.0000, а теперь вы пытаетесь переместить ее на 0x0800.4000? Вы убедились, что таблица векторов действительно находится вашим набором инструментов по новому адресу? И вы говорите, что прерывания не происходит - что именно это означает? Многое должно пройти прямо между периферийным устройством, утверждающим прерывание, и запуском вашего ISR - настройка стека, включение прерываний на ЦП, приоритет прерывания NVIC, установка правильного вектора прерывания, демаскирование периферийного прерывания и т. д.   -  person Dan    schedule 07.02.2013
comment
Когда я посмотрел файл карты, таблица векторов сама находится по адресу 0x0800 4000. Я думаю, что есть какая-то ошибка инициализации. проверка на это   -  person suraj    schedule 11.02.2013
comment
Это не ответ на ваш вопрос, но я бы посоветовал вам создать глобальный или статический массив, который достаточно велик, чтобы содержать дубликат векторной таблицы и указывать вектор на это, вместо того, чтобы устанавливать адрес напрямую. Причина моего предложения заключается в том, что по мере роста вашей программы она может выделять переменные, которые перезаписывают векторную таблицу, по мере выделения переменных. Другое решение — отредактировать линкер-скрипт и зарезервировать там достаточно места для векторной таблицы.   -  person    schedule 04.05.2013


Ответы (3)


Вы не должны использовать NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x8004000), используйте NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x4000). Второй аргумент — это «смещение», а не абсолютный адрес.

person Grissiom    schedule 01.08.2013
comment
Следует позаботиться о выравнивании векторной таблицы. ARM говорит: База таблицы векторов всегда должна быть выровнена по крайней мере по количеству реализованных векторов исключений. Подробнее см. в описании регистра VTOR. - person iFred; 25.04.2019

Добавьте приведенную ниже инструкцию сразу после HAL_Init();

SCB->VTOR = (FLASH_BASE | 0x4000);

Вам также необходимо обновить адрес вектора прерывания в файле STM32F1xc_flash.icf, как показано ниже.

определить символ ICFEDIT_intvec_start = 0x08004000;

person Rajesh Pappireddy    schedule 26.03.2015

Я сделал это для своего STM32L496, и было важно установить новую таблицу векторов перед вызовом HAL_Init(), потому что он вызывает HAL_MspInit(), который может использовать SysTick для измерения времени ожидания при настройке некоторых периферийных устройств.

person Ricardo Hassan    schedule 01.08.2018