Eugene! писал(а): ↑27 июл 2022, 10:40
Ой, нашёл, наверное вот это надо закаментить: SCB->VTOR = (uint32_t)(&g_pfnVectors);//Sets the vector table location and Offset.
Да, можно так.
Я посмотрел проект, а именно ld-файлы линкера.
Они у нас сделаны так, что независимо от того, какую конфигурацию вы выбираете, таблица векторов во время работы программы всё равно размещается линкером в RAM.
То есть она записывается во Flash, но программа предполагает, что в ините эта таблица будет скопирована в RAM.
Поэтому тут три варианта:
1. Оставить memcpy(), который копирует таблицу векторов.
2. Убрать инит VTOR (нежелательный вариант)
3. Исправить скрипт линкера, убрав оттуда размещение таблицы в RAM:
Надо исправить последнюю строчку в этом блоке:
Код: Выделить всё
.isr_vector :
{
. = ALIGN(4); /* выравнивание по 4 байта */
__isr_vector_flash_start = LOADADDR (.isr_vector); /* Берем адрес, где на флеше лежит эта таблица */
__isr_vector_ram_start = .;
KEEP(*(.isr_vector)) /* Startup code - KEEP запрещает удалить секцию сборщику мусора */
. = ALIGN(4);
__isr_vector_ram_end = .; /* конец оперативки, куда будет скопирован код */
} >RAM AT>FLASH
Вместо ">RAM AT>FLASH" написать ">FLASH":
Код: Выделить всё
.isr_vector :
{
. = ALIGN(4); /* выравнивание по 4 байта */
__isr_vector_flash_start = LOADADDR (.isr_vector); /* Берем адрес, где на флеше лежит эта таблица */
__isr_vector_ram_start = .;
KEEP(*(.isr_vector)) /* Startup code - KEEP запрещает удалить секцию сборщику мусора */
. = ALIGN(4);
__isr_vector_ram_end = .; /* конец оперативки, куда будет скопирован код */
} >FLASH