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

ARM от Artery - виснет при вызове прерывания

Занимаюсь с квазикитайским армом, AT32F415. Возникла такая проблема. Если подать логическую единицу на ножку BOOT0, то контроллер виснет при вызове прерывания. То есть получается что ножка BOOT0 меняет адрес таблицы прерываний. Можно ли это как то устранить? А то я работаю через бутлодер, мне такой баг сильно мешает. Ранее работал на Миландре, там этой проблемы не было.

 

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


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

А что об этой ножке говорит мануал?

А мануал, кстати, говорит вот что: BOOT0 - узкоспециализированная ножка выбора загрузчика, работает только на эту функцию. А коль так, то незачем её дергать в нормальном режиме работы. Если же загрузка происходит из SRAM, то чтобы оная в ней работала и работали прерывания, нужно таблицу этих прерываний перенести в SRAM и в настройках положения таблицы указать именно SRAM (тут я мануал не читал, а пишу по аналогии с STM32).

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

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


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

8 minutes ago, EdgeAligned said:

А коль так, то незачем её дергать в нормальном режиме работы.

Я не дергаю ее в нормальном режиме работы! Я загружаю программу через бутлодер. И для этого надо ее установить в 1. Потом я загруженную программу запускаю командой бутлодера. И она виснет, потому что при работе с бутлодером BOOT0=1.

А дергал ее я для исследования из за чего программа виснет.

13 minutes ago, EdgeAligned said:

Если же загрузка происходит из SRAM

Загрузка из флеш. Флеш я записываю бутлодером и запускаю.

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


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

Бутлоадер - какой? Который помещается тоже во флеше, предварительно туда залитый? Тогда не нужно BOOT0 переводить в 1. 

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


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

Так установите BOOT0 = 0 для номальной работы. Никаких проблем вообще нет.

Ещё есть BOOT1. Есть схема от START-F415, там всё нарисовано в деталях.

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


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

On 2/2/2024 at 7:23 AM, x893 said:

Так установите BOOT0 = 0 для номальной работы. Никаких проблем вообще нет.

Для работы BOOT0=0, а для программирования BOOT0=1. То что вы предлагаете, это мне при каждой перезаписи программы надо лезть в схему и переключать BOOT0. А раньше я это делал программно. Командой jump из бутлодера запускал программу во флеши. А с этим глюком я не могу запускать программу без перекоммутации ножек.

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


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

2 minutes ago, paskal said:

Для работы BOOT0=0, а для программирования BOOT0=1. То что вы предлагаете, это мне при каждой перезаписи программы надо лезть в схему и переключать BOOT0. А раньше я это делал программно. Командой jump из бутлодера запускал программу во флеши. А с этим глюком я не могу запускать программу без перекоммутации ножек.

Нияего не понял. Я на F415 програмно вызываю system bootloader без boot0 (всегда в 0).

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


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

Вот что написано в документации на AT32F403/407 (думаю, у F415 будет то же самое), у STM32 все точно так же:

Цитата

The values on the BOOT pins are latched after reset. Users can set the BOOT1 and BOOT0 pins after
reset, to select the required boot mode. The BOOT pins are re-sampled when exiting from the Standby
mode. Therefore, they must be kept in the required boot mode configuration in the Standby mode.

1 час назад, paskal сказал:

Командой jump из бутлодера запускал программу во флеши.

Ну так и настройте правильно таблицу прерываний через VTOR в самом начале вашей программы. И указатель стека заодно тоже из этой же таблицы прерываний правильный в MSP загрузите. И программу собирать надо так, чтобы она располагалась с адреса 0x08000000, а не с 0x00000000 (как обычно делают), потому что c адреса 0x00000000 в вашем случае отражена системная память с загрузчиком.

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


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

Который системный, находящийся в микроконтроллере "от рождения"? Тогда после прошивки и перед перезагрузкой уберите снова ногу BOOT0 в 0. Ну и проверяйте свою программу, возможно, где-то накосячили.
Китайский клон, он хоть и клон, но могут быть различия. Сверяйтесь с документацией на него. Ну и имейте ввиду, что все эти "новые китайские друзья" - это такая лажа, если честно, что прям грусть-тоска берет. Не верьте зомбоящику про "прорыв" - это скорее, "возврат в прошлое".

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


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

Массово применяем AT32F415CCT7.

BOOT0 у меня заведен на землю через резистор 4.7К и также выведен на разъем для программирования.

На разъеме для программирования есть SWD и UART чтобы можно было залить bootloader через оба эти интерфейса.

По факту производство заливает bootloader через китайские J-Link, купленные на али за 1000 рублей. 

Последующие обновления прошивки через другой интерфейс UART, который имеет выход во внешний мир.

Что у вас означает фраза "виснет" при вызове прерывания?

 

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


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

Скорее всего, это означает, что при запросе прерывания не обнаружено действующего кода по нужному вектору и МК либо улетает вникуда (случайное место) с последующей остановкой в hardfault, либо вызывается дефолтный обработчик, который имеет зацикливание на одном месте. 

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


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

6 hours ago, uriy said:

Массово применяем AT32F415CCT7.

BOOT0 у меня заведен на землю через резистор 4.7К и также выведен на разъем для программирования.

На разъеме для программирования есть SWD и UART чтобы можно было залить bootloader через оба эти интерфейса.

По факту производство заливает bootloader через китайские J-Link, купленные на али за 1000 рублей. 

Последующие обновления прошивки через другой интерфейс UART, который имеет выход во внешний мир.

Что у вас означает фраза "виснет" при вызове прерывания?

 

Аналогично. Только и первая прошивка тоже через USB

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


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

20 hours ago, x893 said:

Я на F415 програмно вызываю system bootloader без boot0 (всегда в 0)

А как вы это делаете?

19 hours ago, Сергей Борщ said:

И программу собирать надо так, чтобы она располагалась с адреса 0x08000000

Конечно все это я делаю. Программа же работает нормально при boot0=0. VTOR я для интереса вывел, он равен 0, как и по спецификации. Не вижу что там настраивать, у меня программа в штатном режиме запускается, из флеш.

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


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

Ну так верните обратно BOOT0 в 0 после перепрошивки. Или VTOR запишите чтобы он был равен реальному адресу таблицы во флеше, а не переназначаемой области. Ну и маны читайте, маны. Раньше, много лет назад, у нас был даже особый обряд с манами.

Вот не знаю, как на этом китайском клоне, но по аналогии с проверенным STM32, ножка BOOT0 имеет свойство ремапить диапазон адресов, начинающийся с 0ч00000000.

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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