Я успешно реализовал загрузчик шины CAN для микросхемы STM32103C8T6 на основе примера, который я нашел здесь (lbus) https://github.com/alphalove/stm32-projects/tree/master/lbus_bootloader.
Я использовал libopencm3.
У меня это работало очень хорошо, пока я не внес небольшое изменение в код загрузчика. После этого загрузчик больше не будет запускать основную прошивку.
Загрузчик начинается с 0x08000000 и имеет значение 8 КБ. Основная прошивка начинается с 0x08002000.
Помимо прочего, загрузчик проверяет целостность основной прошивки и, если все в порядке, запускает ее, вызывая функцию run_firmware (). Эта функция отключает все периферийные устройства микросхемы, используемые в загрузчике, перед настройкой адреса таблицы векторов, инициализацией указателя основного стека и переходом к началу основной прошивки. Ниже приведен пример / фрагмент функции run_firmware ():
#define FW_ADDR 0x08002000
run_firmware() { // Set vector table base address.
// bunch of code to reset all peripherals
// Set Vector Table address
SCB_VTOR = FW_ADDR & 0xFFFF;
// Initialise master stack pointer
__asm__ volatile("msr msp, %0"::"g"(*(volatile uint32_t *)FW_ADDR));
// Jump to application
(*(void (**)())(FW_ADDR + 4))();
}
Это прекрасно работало до сегодняшнего дня, пока я не добавил некоторый дополнительный код загрузчика, который также вызывает функцию run_firmware (). Теперь вызов функции run_firmware не запускает основную прошивку, а скорее завершается ошибкой, пока сторожевой таймер не перезагрузит чип. Пока второй вызов run_firmware () находится в коде, функция больше не работает.
Это ограничение при переходе по адресу? Изменило ли добавление дополнительного вызова расположение кода run_firmware () в двоичном файле, который сейчас вызывает проблему? Что делают% 0 и "g" в ассемблере?
Если честно, код для запуска основной прошивки был black magi c, который я позаимствовал из приведенного выше примера lbus. Так что я не совсем уверен, почему это терпит неудачу.
Если вы не можете сказать ... Я человек с аппаратным видом!
Любое руководство будет наиболее ценно!
Заранее спасибо.
alex