В теме https://microtechnics.ru/profilegrid_blogs/chast-9-stm32-i-s-biblioteka-uart/ возникли разногласия по поводу прерываний.
Автором "tonyk" было вывалена куча кода без привязки к библиотекам и среде разработки. Без этого ценность информации равна нулю.
Как я вижу проблему с подменой вектора прерываний.
Сама таблица векторов находится во флэш и зашивается туда после компиляции и прошивки. Таким образом, если в коде не объявлено прерывание, вместо него в этой таблице будет заглушка. Поэтому это прерывание должно быть где то объявлено ещё до компиляции и код должен позволять вызвать другой обработчик прерывания, который вы напишете позже, допустим в классе.
В библиотеке UART я пошёл по пути объявления и написания всех прерываний сразу. Решение некрасивое, но пока я не научился делать по другому. Есть ещё проект, который я ещё не выкладывал. Это проект позволяющий запустить на классах RTC. Там я пошёл по другому пути. У меня есть прерывание, которое заранее объявлено, но обработка этого прерывания вынесена в другую функцию. Но там появляются другие проблемы.
Есть путь, который более правилен. Как мне кажется. Но я его ещё не разрулил.
Дело в том, что таблицу векторов можно перенести в ОЗУ. А там подменять вектора уже труда совсем не составит. Для этого есть специальный регистр и скрипты в CMSIS. Как этим пользоваться я ещё не знаю.
Я очень много рыл информации по этому поводу. Но максимум что я нашёл, это изменение пускового скрипта, что не приемлемо. И куча отдельных фраз без привязки к среде разработки. Поэтому невозможно понять на 146% как это делается на самом деле.
В общем задача такая:
- Сказать компилятору, что таблица будет в ОЗУ (Это не проблема);
- Заполнить или перенести таблицу векторов из ПЗУ в ОЗУ;
- В специальном регистре указать смещение векторов прерываний;
- Сделать всё это до того, как начнут инициализироваться классы.
Вроде ничего сложного, но не все пункты ещё мною решены и изучены.
Я вот думаю, может есть люди, которые без пространных рассуждений и поливания помоями незнакомого человека подскажут как это можно сделать правильно.
Есть только условие.
Среда разработки CubeIDE.
Использовать только голый CMSIS.
Никаких Keil & IAR. И их библиотек. Только если есть в них решение этой проблемы, только без изменения стандартных скриптов CubeIDE.