Jump to content

    

Darth Vader

Участник
  • Content Count

    177
  • Joined

  • Last visited

Community Reputation

0 Обычный

About Darth Vader

  • Rank
    Частый гость

Recent Profile Visitors

513 profile views
  1. Инициализация глобальных и локальных статических переменных, вызов конструкторов глобальных объектов (для С++ кода), копирование кода RAM-функций из флеша в ОЗУ. Может ещё что-то пропустил.
  2. IAR 8.40.1, директива __forceinline

    Добейтесь компиляции без ошибок с обычным inline. Потом уже добавляйте __forceinline. Попробуйте сделать: 1. Объявите метод класса без inline. 2. Перед определением поставьте inline. 3. Определение встраиваемых методов класса должно располагаться в файле хидера класса, т.е. в одном файле с их объявлением, после объявления самого класса. Это обязательное условие. Без него компилятор будет выдавать ошибку.
  3. Stm32f405 запись во Flash 16bit

    Пусть автор сам решает. Моё дело предупредить.
  4. Stm32f405 запись во Flash 16bit

    Это законченный унифицированный кусок кода, оформленный в функцию. Он не должен иметь таких побочных действий. Если бы это был просто выдранный из контекста кусок кода - я бы согласился. Но для функции такое поведение недопустимо. Она не должна изменять (портить) того, что её не касается. Если она это делает - значит она неправильно спроектирована либо реализована.
  5. Stm32f405 запись во Flash 16bit

    Присваивание нового значения регистру потенциально может изменить любое битовое поле в нём. А не только те, что хотел изменить автор. Например, в приведённой строке он "попутно" сбрасывает биты ERRIE и IOPIE (25 и 24 позиции). А если до этого они были выставлены в 1? Намеренно, чтобы получить запрос на прерывания по этим событиям. А после такой записи в регистр логика работы программы нарушится и надо будет искать, а почему же программа не заходит в обработчик прерываний, которые я разрешил? А потом оказывается, что в функции записи флеша ты, сам того не желая, сбрасываешь разрешения на эти прерывания. А всё потому, что делаешь запись вместо чтения-модификации-запись. Я не настаиваю. Я предупреждаю и предостерегаю о возможных последствиях. Запись надо применять осторожно, точно убедившись, что значения всех соседних бит в регистре можно безнаказанно занулять.
  6. Stm32f405 запись во Flash 16bit

    FLASH->CR = FLASH_CR_PG //Разрешаем программирование флеша |0*FLASH_CR_PSIZE_0 //PSIZE[1:0]:Program size |1*FLASH_CR_PSIZE_1; // 10 program x32 Зачем вы меняете значение ВСЕХ битовых полей регистра, когда вам нужно изменить только два? Не боитесь записью всего регистра испортить то, что лежит вне интересующих вас разрядов? Разделите это на 2 операции: установка битового поля PSIZE и разрешение программирования с использованием метода чтение-модификация-запись. Тогда ничего постороннего не пострадает.
  7. Меня очень смущает эта строка. Она 100% делает совсем не то, что вы хотите. Ещё точнее, она не изменяет значения PORTE. И эта строка - то же самое. Не изменяет значения DDRE.
  8. Место зависания отладчика

    Сделать поиск имени функции по всему проекту пробовали? Сколько нашлось?
  9. Микроконтроллеры

    Наверное, имелась ввиду карта распределения памяти и атрибуты регионов, типа XN и т.п.
  10. Проблемы с отладкой Миландр 1986ВЕ3Т

    По п. 2 простая замена серийника не поможет. Есть ещё несколько признаков, по которым ПО Сеггера распознаёт контрафактные отладчики. Подробности можно поискать в этой теме. Там это обсуждалось.
  11. Проблемы с отладкой Миландр 1986ВЕ3Т

    Работал с 1986ВЕ1Т - такой проблемы не было. Но я работал в Keil 5.23 с паком для контроллеров Миландр 1986. Напишите в техподдержку Миландра - они подскажут в чем может быть дело. По крайней мере, попробуют у себя повторить ситуацию.
  12. Ваш контроллер на ядре Cortex-M0, а не М3. Посмотрите в соседнюю тему. Там про тактирование 1986ВЕ1Т. Блоки тактировпния у них отличаются, но общий подход ясен. Открываете функциональную схему блока в спецификации и проходитесь по ней карандашом, формируя путь прохождения для тактового сигнала: включаете нужные источники тактовых сигналов, ждёте их готовности, настраиваете к-ты деления, умножения, состояния мультиплексоров. Каждое действие записываете одним предложением на навой строке и оформляете в виде комментария. Затем под каждым комментарием пишите кусок кода, выполняющий требуемое действие. Каждое действие - это задание нового значения или ожидание требуемого значения какого-то битового поля в каком-то регистре.
  13. Это единственная правильная причина, почему вам в вашей функции требуется статическая локальная переменная. А то, что вы озвучили в первом посте темы - это вообще ни о чём. Или вы имели ввиду то, что до того, как узнали о существовании статических локальных переменных использовали внутри функций для этих целей глобальные? А потом вдруг узнали и заменили их на статические локальные? Тогда да, ваши доводы из первого поста становятся понятными. Вам надо было сразу объяснить что с чем вы сравниваете: 1. Использование глобальных объектов в функциях 2. Использование статических локальных объектов в функциях. Какие есть плюсы, минусы и ограничения у данных подходов по отношению друг к другу. Такая постановка вопроса правильная.
  14. STM32 F4 CAN шина

    Значит помимо блока CAN вы используете ещё и GPIO и UART. Проверьте, что и на них подаётся тактирование при инициализации. Если они не затактированы, то программа будет заходить в обработчик, но не сможет изменить состояния пина порта и передать сообщение по UART. Т.е. снаружи это будет выглядеть, словно обработчик не выполняется. Попробуйте перед передачей по CAN вставить код из обработчика - моргните светодиодом и пошлите символ через UART, чтобы проверить, что они инициализированыы и работают.
  15. STM32 F4 CAN шина

    Посмотрите место в вашей программе, где включается тактирование блока CAN. Отладчик, скорее всего, при подключении включает тактирование всей периферии МК. Если же вы забыли сделать это в своей программе, то без отладчика работать не будет, а с отладчиком будет.