Top.Mail.Ru
Уведомления
Очистить все

Прерывания в STM и изменение вектора прерывания.

(@eduard)
Level 5 Moderator

В теме https://microtechnics.ru/profilegrid_blogs/chast-9-stm32-i-s-biblioteka-uart/ возникли разногласия по поводу прерываний.

Автором "tonyk" было вывалена куча кода без привязки к библиотекам и среде разработки. Без этого ценность информации равна нулю.

Как я вижу проблему с подменой вектора прерываний.

Сама таблица векторов находится во флэш и зашивается туда после компиляции и прошивки. Таким образом, если в коде не объявлено прерывание, вместо него в этой таблице будет заглушка. Поэтому это прерывание должно быть где то объявлено ещё до компиляции и код должен позволять вызвать другой обработчик прерывания, который вы напишете позже, допустим в классе.

В библиотеке UART я пошёл по пути объявления и написания всех прерываний сразу. Решение некрасивое, но пока я не научился делать по другому. Есть ещё проект, который я ещё не выкладывал. Это проект позволяющий запустить на классах RTC. Там я пошёл по другому пути. У меня есть прерывание, которое заранее объявлено, но обработка этого прерывания вынесена в другую функцию. Но там появляются другие проблемы.

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

Дело в том, что таблицу векторов можно перенести в ОЗУ. А там подменять вектора уже труда совсем не составит. Для этого есть специальный регистр и скрипты в CMSIS. Как этим пользоваться я ещё не знаю.

Я очень много рыл информации по этому поводу. Но максимум что я нашёл, это изменение пускового скрипта, что не приемлемо. И куча отдельных фраз без привязки к среде разработки. Поэтому невозможно понять на 146% как это делается на самом деле.

В общем задача такая:

  1. Сказать компилятору, что таблица будет в ОЗУ (Это не проблема);
  2. Заполнить или перенести таблицу векторов из ПЗУ в ОЗУ;
  3. В специальном регистре указать смещение векторов прерываний;
  4. Сделать всё это до того, как начнут инициализироваться классы.

Вроде ничего сложного, но не все пункты ещё мною решены и изучены.

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

Есть только условие.

Среда разработки CubeIDE.

Использовать только голый CMSIS.

Никаких Keil & IAR. И их библиотек. Только если есть в них решение этой проблемы, только без изменения стандартных скриптов CubeIDE.

 

Цитата
Создатель темы Размещено : 02.04.2022 11:55
Поделиться: