Перейти к содержанию
    

Gigadevice. Boot mode в Cortex®-M23

Доброго времени суток!

Осваиваю микроконтроллеры Gigadevice, все шло хорошо, пока не наткнулся на задачу переопределить область загрузки в реальном времени.
Микроконтроллеры GD32E23x и GD32L23x - это по сути клоны STM32F0xx и STM32L0xx.
В них есть возможность перенаправить 0x00000000 адрес на флешь память, загрузочную область или RAM, и выполняется это с помощью ножек BOOT.
В микроконтроллерах ST это так-же можно сделать с помощью регистра SYSCFG_CFGR1 битами MEM_MODE. Reference manual STM32F0xx.pdf
В Gigadevice это регистр SYSCFG_CFG0 и биты BOOT_MODE, но эти биты доступны только для чтения. GD32E23x_User_Manual_Rev1.5.pdf

Может я что-то недопонимаю, но как в Gigadevice программно перенаправить область загрузки?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 11.11.2022 в 08:09, Ivan. сказал:

Доброго времени суток!

Осваиваю микроконтроллеры Gigadevice, все шло хорошо, пока не наткнулся на задачу переопределить область загрузки в реальном времени.
Микроконтроллеры GD32E23x и GD32L23x - это по сути клоны STM32F0xx и STM32L0xx.
В них есть возможность перенаправить 0x00000000 адрес на флешь память, загрузочную область или RAM, и выполняется это с помощью ножек BOOT.
В микроконтроллерах ST это так-же можно сделать с помощью регистра SYSCFG_CFGR1 битами MEM_MODE. Reference manual STM32F0xx.pdf
В Gigadevice это регистр SYSCFG_CFG0 и биты BOOT_MODE, но эти биты доступны только для чтения. GD32E23x_User_Manual_Rev1.5.pdf

Может я что-то недопонимаю, но как в Gigadevice программно перенаправить область загрузки?

SCB->VTOR

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

он есть только в 1xx серии и выше ST и соответственно GD.
В 0xx только фиксированный ремап

Изменено пользователем Ivan.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 11.11.2022 в 10:08, Ivan. сказал:

он есть только в 1xx серии и выше ST и соответственно GD.
В 0xx только фиксированный ремап

Это не фишка какого-то производителя или семейства, VTOR - это часть ядра (в данном случае Cortex-M23)

image.thumb.png.3d16a175d54f47e72abc9d03ae776f75.png

Правда, опциональная.

На 21 странице список опций:

Цитата

Some system peripherals listed below are also provided by Cortex®-M23:
 Low latency, high-speed peripheral I/O port
 A Vector Table Offset Register
 Breakpoint unit
 Data Watchpoint
 Serial Wire Debug Port

Типа, VTOR у вас должен быть.

В файле gd32e23x.h

Цитата

#define __VTOR_PRESENT            1U        /*!< VTOR is present                                         */

Указано, что VTOR есть.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Установить VTOR можно функцией

/*!
    \brief      set the NVIC vector table base address
    \param[in]  nvic_vict_tab: the RAM or FLASH base address
      \arg        NVIC_VECTTAB_RAM: RAM base address
      \arg        NVIC_VECTTAB_FLASH: Flash base address
    \param[in]  offset: Vector Table offset
    \param[out] none
    \retval     none
*/
void nvic_vector_table_set(uint32_t nvic_vict_tab, uint32_t offset)
{
    SCB->VTOR = nvic_vict_tab | (offset & NVIC_VECTTAB_OFFSET_MASK);
    __DSB();
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо большое. я знал, что я что-то недоглядел

Изменено пользователем Ivan.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Эти cortex-микроконтроллеры.. мало изучать доки от производителя МК, нужно еще изучать доки производителя ядра (CMSIS так точно).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, adnega said:

Установить VTOR можно функцией

И не забыть указать линковщику, чтобы поместил в нужное место таблицу векторов.

NVIC_VECTTAB_OFFSET_MASK

Это ведь выравнивание адреса в таблице, не забывай.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 11/11/2022 at 2:24 PM, tonyk_av said:

И не забыть указать линковщику, чтобы поместил в нужное место таблицу векторов.

Это я знаю, спасибо

FLASH    (rx)    : ORIGIN = 0x8000000 + 8K,   LENGTH = 64K - 8K

Я во все свои устройства закладываю функцию самообновления ПО и в AVR и STM и ESP по всем доступным протоколам от Modbus до HART.
А в связи с проблемами поставок STM пришлось осваивать аналоги: Gigadevice, Geehy и Artery. А от AVR вообще отказываться (наконец то)

Изменено пользователем Ivan.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 hours ago, Ivan. said:

FLASH    (rx)    : ORIGIN = 0x8000000 + 8K,   LENGTH = 64K - 8K

О как. А 8К для чего? Если обновления, то, скорей всего, и таблица прерываний в RAM.

Изменено пользователем tonyk_av

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

20 hours ago, tonyk_av said:

О как. А 8К для чего? Если обновления, то, скорей всего, и таблица прерываний в RAM.

В первых 8К лежит загрузчик со своей таблицей прерываний.
А в основном приложении стартовый адрес смещен на 8К и размер соответственно уменьшен на 8К

В M0 для перенаправления таблицы векторов необходимо скопировать всю таблицу в RAM и потом ремапнуть 0 адрес на RAM с помощью SYSCFG_CFGR1

соответственно в скрипте нужно так же зарезервировать место в RAM
  RAM    (xrw)    : ORIGIN = 0x20000000 + 0xC0,   LENGTH = 4K - 0xC0

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

bootloader - это маленькая программа, которая проверяет наличие application и если таковое имеется - передает управление ему.

если application нет (а это проверяется по первому слову в основной программе, которое не может быть FFFFFFFF), то ожидает прием нового ПО.

application в свою очередь может передать управление bootloader-у для выполнения обновления по команде с какого либо интерфейса.

bootloader принимает новое ПО и запиcывает его в область application кроме первого слова. как только ПО будет загружено полностью и контрольная сумма проверена - записывается первое слово app. таким образом app не может быть запущен некорректно

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 часов назад, Ivan. сказал:

как только ПО будет загружено полностью и контрольная сумма проверена - записывается первое слово app. таким образом app не может быть запущен некорректно

В отношении надежности так себе идея. Правильнее будет, все же, обновлять весь бинарь, а при каждом запуске проверять контрольную сумму всего образа.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

17 hours ago, Ivan. said:

В первых 8К лежит загрузчик со своей таблицей прерываний.
А в основном приложении стартовый адрес смещен на 8К и размер соответственно уменьшен на 8К

Ну так и прописал бы это явно в скрипте линковщика: создать секцию с такого-то адреса такого-то размера в такой-то области памяти.

Я с М0 не работал, поэтому и не понял смысла загадочных "+8К".

 

Модератор: рекомендую обратить внимание на п. 2.1 правил форума. Не всем пользователям форума может нравиться обращение на "ты".

Изменено пользователем haker_fox
Пункт 2.1 правил форума.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...