Добрый день, написал самый обычный код в KEIL UVISION с миганием диода и установкой прерывания через EXTI. Хочу запрограммировать плату через бутлодер по адресу 0х8004000(начальный адрес 0х8000000). Для этого пишу такие строчки: __set primask(0); // глобальное запрещение прерываний NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x8004000); // непосредственно перенос таблицы прерываний __set_PRIMASK(0); // разрешение прерываний В настройках проекта нужный адрес выставил в Target и Linker. Достаточно ли этих строчек для переноса или нужно что то еще? Код без EXTI или SysTick без проблем переноситься, а с прерыванием никак не получается. Сразу говорю, с HAL'ом и STM32CubeMX не работаю. Работаю с SPL.
Приложение само знает где у него таблица прерываний. Мало ли, сегодня с одного адреса его скомпилируешь, завтра с другого. Или вообще в SRAM для отладки будешь грузить. Главное грузить в тот адрес с которого приложение скомпилировано.
Приложение само знает где у него таблица прерываний. Мало ли, сегодня с одного адреса его скомпилируешь, завтра с другого. Или вообще в SRAM для отладки будешь грузить. Главное грузить в тот адрес с которого приложение скомпилировано.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Попробую ответить на самое первое сообщение. У меня в проекте, загрузчик располагается в начальных адресах и занимает не более 16кБ кода (я ему выделил такую секцию, оставшихся 48кБ от 64кБ общей памяти, для основной прошивки достаточно).
Алгоритм действий (исключая кучу проверок на наличие и корректность прошивки на месте): 1. Отключить ВСЕ задействованные загрузчиком прерывания. 2. Сбросить задействованную загрузчиком периферию. 3. Считать начальные адреса прошивки (AppSect + 0, AppSect + 4) 4. Выполнить:
Код:
jump_app (0x80004000);
void jump_app( uint32_t address ) { __asm ("LDR SP, [R0]\n"); // Load new stack pointer address __asm ("LDR PC, [R0, #4]\n"); //Load new program counter address; };
При выполнении данной процедуры, безвозвратно теряются данные процесса работы и ядро, фактически переходит на вектор запуска. Опять же, в моём случае, процедура переноса векторов прерывания, происходит прямо в самом приложении (а так же в загрузчике) самостоятельно, потому изначально загрузчику за этим следить не нужно.
Делаю я это так:
Код:
uint32_t i; i = (uint32_t)(&main); // Получаем адрес main() SCB->VTOR = (i & 0xFF030000);
Всё. Две инструкции в коде. Естественно, необходимо следить за тем, чтобы адрес main попадал в секцию. Как уже говорил выше, таблица прерываний располагается (у меня) в начале секции приложения. Соответсвенно, адрес main будет указывать на нужный диапазон, затем накладывается маска и получается адрес. Это случай с тремя независимыми версиями прошивки во Flash памяти. Либо же, приложение можно собрать с опцией VECT_TAB_SRAM и тогда начальный код позаботится о том, чтобы таблица векторов прерываний оказалась в начале RAM. И уже не нужно будет переносить самостоятельно что-то ещё.
Вот скажите, в keil хоть что-то можно не пер анус сделать? Нормальные линкеры экспортируют адреса секций и их можно в приложении как константу использовать.
Да не лезь ты в ассемблер. Стек устанавливается командой __set_MSP(adr), переход к приложению Jamp_To_Application(); на Си. Осталось только правильные адреса подставить.
AlanDrakes, при компиляции выдает ошибку, SP и PC не идентифицированы. Вопрос, где описаны данные регистры в keil? С ассемблером не особо в ладах.
Точно, в Keil свои дефайны. Уже отвык после gcc Попробуйте так:
Код:
void jump_app( uint32_t address ) { __asm ("LDR msp, [R0]\n"); // Load new stack pointer address __asm ("LDR R15, [R0, #4]\n"); //Load new program counter address; // Либо "r15" (в нижнем регистре), если так же не будет дефайна // Можно так же выполнить __asm ("BX [R0, #4]\n"); // Аналогичный переход на адрес инструкцией перехода // Не уверен, что так можно делать };
AlanDrakes, вот скажи, ЗАЧЕМ? Зачем тут асм? Единственное что ты поимеешь это геморр при переносе на другой компилятор. Я больше чем уверен, что Си код скомпилируется не хуже, чем эта вставка. К тому же, ТС и так запутался, а ты ему асмом по фэйсу.
VladislavS , не получается писать через SCB->VTOR, компилятор не понимает команду __vtor* , так как используется не GCC компил, а стандартный кейловский. А через ассемблеровские команды, так там вообще полный игнор половины команд.
Приложение само знает где у него таблица прерываний. Мало ли, сегодня с одного адреса его скомпилируешь, завтра с другого. Или вообще в SRAM для отладки будешь грузить. Главное грузить в тот адрес с которого приложение скомпилировано.
VladislavS , не получается писать через SCB->VTOR, компилятор не понимает команду __vtor* , так как используется не GCC компил, а стандартный кейловский.
Да чтож за люди то пошли без толики фантазии. Ну напиши ты SCB->VTOR = 0x08004000; отладься, а потом будешь думать как кеил заставить самому эту константу подставить. Или вали ты с этого кейла, пока не подсел.
VladislavS, что ж ты так на Кейл-то взъелся? Не существует идеального эмбеддерского софта, всё определяется прямизной рук и желанием/умением разобраться в проблеме. Сам сталкивался с тем, что после кейла не хотела прошивка со смещённым адресом стартовать. ТС пробовал мои рекомендации по настройкам линкера и комментированием строк в System_Init()?
Добавлено after 27 minutes 2 seconds: 1)Прошиваем сам загрузчик с ремапом таблицы векторов! Стопудоворабочийкод:
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 29
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения