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

adnega

Свой
  • Постов

    3 603
  • Зарегистрирован

  • Посещение

  • Победитель дней

    3

Весь контент adnega


  1. LDM/STM в inline asm

    А так получится (указать явно имена регистров)? void vPortStartFirstTask( void ) { __asm volatile( " ldr r0, =0xE000ED08 \n" /* Use the NVIC offset register to locate the stack. */ " ldr r0, [r0] \n" " ldr r0, [r0] \n" " msr msp, r0 \n" /* Set the msp back to the start of the stack. */ " cpsie i \n" /* Globally enable interrupts. */ " svc 0 \n" /* System call to start first task. */ " nop \n" ); } Это довольно опасные инструкции. Например, у вас могут быть данные не выровненные - тогда их нельзя использовать.
  2. LDM/STM в inline asm

    А что запрещает сделать .s-файл и запускать из Си реализованную там функцию? Зачем вы мешаете компилятору делать свою работу?
  3. Не проще массу умножить на расстояние до центра масс?
  4. Вроде, для каждой задачи должен быть свой инструмент. Для пайки посуды есть мощные паяльники в виде топора.
  5. А как вы поняли что стирается именно нулевой сектор?
  6. Stm32F407 SPI+DMA

    Один канал или несколько? Сколько? А что линкер разместил по этим адресам? АЦП 12-битный. Вы в 8 битном режиме от него данные получаете? Без исходника ничего не понятно. Сомнительное решение.
  7. Чтоб что-то сделать с флешь нужно как минимум разлочить работу с ней. По мне так это тоже самое, что MPU разлочить. Да, в нештатной ситуации MPU может дать дополнительную информацию о проблеме, а неразлоченный контроллер флешь (зависнет?) не даст эту самую флешь повредить. А так как ТС уверяет, что флешь стирается даже с локом сектора, то: - выполняется полный код снятия защиты с сектора, стирание сектора, и уж точно разблокирование контроллера флешь по всем правилам (т.е. и MPU тоже будет временно отключен); - либо никакого стирания флешь нет (опять же MPU тут не поможет).
  8. А как это принципиально поможет? Перед корректной записью флешь нужно временно регион MPU отключать, поработать, а затем включать? Что помешает коду с ошибкой на этапе "поработать" наломать дров при выключенном MPU?
  9. У Заказчика всяко может быть. Например, он изменяет какие-то уставки, которые в реальном времени щелкают каким-нить мощным контактором, от помехи которого МК сбоит - статистика в этом случае меняется кардинально. Самое простое - сделайте индикацию HardFault.
  10. Кста, подергать питание в моменты изменения настроек - это первое, что нужно попробовать для удачного окирпичивания на столе. Дык, кирпич никуда и не торопится - это по сути канал с внешним миром для выгрузки хоть какого-то дампа
  11. Я для таких случаев всегда использую копию обновления во флешь. Т.е. обнаруживаю корректное обновление на карте, если требуется обновить, то записываю его в регион IMAGE во флешь МК, делаю перезагрузку. Загрузчик видит корректное обновление в IMAGE, принимает решение обновить APPLICATION, стирает APPLICATION, расшифровывает IMAGE и копирует его в APPLICATION, проверяет корректность записи и ставит штамп с CRC32, если все ок. После этого APPLICATION можно запускать. И если когда-то APPLICATION поплохеет, всегда есть копия в IMAGE для автоматического восстановления.
  12. Если у вас нету отладочной консоли (UART), то во внешнюю память можно сбрасывать стек, извлеченный из недр HardFault, а дальше - хоть ногодрыгом кинуть значение регистров и стека во внешнюю память.
  13. Кста, у меня загрузчик даже исправное приложение запускает не сразу, а через 200мс (быстрый старт) - 5000мс (медленный старт, после NVIC_SystemReset), чтоб можно было к нему как-то подключиться. У вас каким образом выполняется обновление? По какому каналу?
  14. Если есть свободный пин, то можно на него привесить очистку памяти настроек и запись туда заводских значений. Или командой загрузчика убивать настройки до заводских. Ну, для HardFault можно навесить спец индикацию - это не сложно, а кучу вопросов отбросит.
  15. У меня в изделии всегда есть зеленый светодиод РАБОТА, по миганиям которого можно судить о состоянии контроллера. В обычной работе мигает раз в секунду со скважностью 2. В загрузчике скважность значительно меньше. При сбое кварца - работает от внутреннего RC-генератора и мигает чаще. При активном обновлении еще чаще. При глобальном фэйле - SOS морзянкой передает и т.п.
  16. У меня тоже есть все эти регионы памяти. Но приложение перед запуском проходит контроль CRC32, и при несовпадении сидим в загрузчике и ждем корректное обновление. Настройки тоже имеют локальную контрольную сумму и ищется последняя запись с правильной суммой - она будет содержать настройки. Если ни одной записи не найдется, то загружаются настройки по-умолчанию. Защита от чтения. Можно записать некорректные настройки в область хранения настроек ПО. Затем эти "плохие" значения спровоцируют HardFault, например. Все - пока настройки не почистите плата будет всякий раз кирпичица.
  17. Ни разу не видел на STM32 проблем с порчей флешь. А изделий производится тысячами в год. Уверен, во флешь все хорошо, а МК прохлаждается в районе HF.
  18. Кто знает, а можно ли, запустив заводской загрузчик, сравнить содержимое флешь с исходным файлом (при установленной RDP)? Отбой - нельзя.
  19. Как вариант, можно маленький пад сделать с нужными параметрами отверстия, а с другой стороны добавить большой SMD-пад.
  20. По фронту сигнала на втором канале в CCR2 попадает длительность низкого уровня. Затем при переполнении смотрю что там лежит. Например, стартовый импульс и импульс присутствия дают два фронта на RX. И если устройств на шине нет, то будет маленькое значение CCR2 (длительность импульса присутствия), а если есть хоть одно, то CCR2 будет гораздо больше (длительность импульса присутствия + длительность паузы/реакции датчиков + длительность самого долгого импульса присутствия).
  21. А где у меня две единички? В поле CC2S у меня пишется 1 - это 01. Рисунок - это ответ на ваш вопрос "а можно ли с одного пина и прием и передачу". Я нарисовал, что можно. Но в коде у меня два пина задействованы, т.к. первый канал управляет транзистором. Сначала принудительно устанавливаем OC1 записью "101: Force active level". Затем настраиваем "010: Set channel 1 to inactive level on match" и запускаем одиночный цикл. В момент сравнения OC1 сбросится. Прерывание по переполнению таймера в режиме одиночного запуска.
  22. Да - одиночный импульс. TIM_CCMR1_OC1M - задает тип сравнения для первого канала, TIM_CCMR1_CC2S - задает вход для захвата второго канала (1 = IC2 is mapped on TI2).
×
×
  • Создать...