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

adnega

Свой
  • Постов

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

  • Посещение

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

    3

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


  1. А как это принципиально поможет? Перед корректной записью флешь нужно временно регион MPU отключать, поработать, а затем включать? Что помешает коду с ошибкой на этапе "поработать" наломать дров при выключенном MPU?
  2. У Заказчика всяко может быть. Например, он изменяет какие-то уставки, которые в реальном времени щелкают каким-нить мощным контактором, от помехи которого МК сбоит - статистика в этом случае меняется кардинально. Самое простое - сделайте индикацию HardFault.
  3. Кста, подергать питание в моменты изменения настроек - это первое, что нужно попробовать для удачного окирпичивания на столе. Дык, кирпич никуда и не торопится - это по сути канал с внешним миром для выгрузки хоть какого-то дампа
  4. Я для таких случаев всегда использую копию обновления во флешь. Т.е. обнаруживаю корректное обновление на карте, если требуется обновить, то записываю его в регион IMAGE во флешь МК, делаю перезагрузку. Загрузчик видит корректное обновление в IMAGE, принимает решение обновить APPLICATION, стирает APPLICATION, расшифровывает IMAGE и копирует его в APPLICATION, проверяет корректность записи и ставит штамп с CRC32, если все ок. После этого APPLICATION можно запускать. И если когда-то APPLICATION поплохеет, всегда есть копия в IMAGE для автоматического восстановления.
  5. Если у вас нету отладочной консоли (UART), то во внешнюю память можно сбрасывать стек, извлеченный из недр HardFault, а дальше - хоть ногодрыгом кинуть значение регистров и стека во внешнюю память.
  6. Кста, у меня загрузчик даже исправное приложение запускает не сразу, а через 200мс (быстрый старт) - 5000мс (медленный старт, после NVIC_SystemReset), чтоб можно было к нему как-то подключиться. У вас каким образом выполняется обновление? По какому каналу?
  7. Если есть свободный пин, то можно на него привесить очистку памяти настроек и запись туда заводских значений. Или командой загрузчика убивать настройки до заводских. Ну, для HardFault можно навесить спец индикацию - это не сложно, а кучу вопросов отбросит.
  8. У меня в изделии всегда есть зеленый светодиод РАБОТА, по миганиям которого можно судить о состоянии контроллера. В обычной работе мигает раз в секунду со скважностью 2. В загрузчике скважность значительно меньше. При сбое кварца - работает от внутреннего RC-генератора и мигает чаще. При активном обновлении еще чаще. При глобальном фэйле - SOS морзянкой передает и т.п.
  9. У меня тоже есть все эти регионы памяти. Но приложение перед запуском проходит контроль CRC32, и при несовпадении сидим в загрузчике и ждем корректное обновление. Настройки тоже имеют локальную контрольную сумму и ищется последняя запись с правильной суммой - она будет содержать настройки. Если ни одной записи не найдется, то загружаются настройки по-умолчанию. Защита от чтения. Можно записать некорректные настройки в область хранения настроек ПО. Затем эти "плохие" значения спровоцируют HardFault, например. Все - пока настройки не почистите плата будет всякий раз кирпичица.
  10. Ни разу не видел на STM32 проблем с порчей флешь. А изделий производится тысячами в год. Уверен, во флешь все хорошо, а МК прохлаждается в районе HF.
  11. Кто знает, а можно ли, запустив заводской загрузчик, сравнить содержимое флешь с исходным файлом (при установленной RDP)? Отбой - нельзя.
  12. Как вариант, можно маленький пад сделать с нужными параметрами отверстия, а с другой стороны добавить большой SMD-пад.
  13. По фронту сигнала на втором канале в CCR2 попадает длительность низкого уровня. Затем при переполнении смотрю что там лежит. Например, стартовый импульс и импульс присутствия дают два фронта на RX. И если устройств на шине нет, то будет маленькое значение CCR2 (длительность импульса присутствия), а если есть хоть одно, то CCR2 будет гораздо больше (длительность импульса присутствия + длительность паузы/реакции датчиков + длительность самого долгого импульса присутствия).
  14. А где у меня две единички? В поле CC2S у меня пишется 1 - это 01. Рисунок - это ответ на ваш вопрос "а можно ли с одного пина и прием и передачу". Я нарисовал, что можно. Но в коде у меня два пина задействованы, т.к. первый канал управляет транзистором. Сначала принудительно устанавливаем OC1 записью "101: Force active level". Затем настраиваем "010: Set channel 1 to inactive level on match" и запускаем одиночный цикл. В момент сравнения OC1 сбросится. Прерывание по переполнению таймера в режиме одиночного запуска.
  15. Да - одиночный импульс. TIM_CCMR1_OC1M - задает тип сравнения для первого канала, TIM_CCMR1_CC2S - задает вход для захвата второго канала (1 = IC2 is mapped on TI2).
  16. Может там ШИМ на выходе, т.е. он от помех переключается туда-сюда цифровым образом, а вам кажется плавное нарастание? Кста, там какой задан?
  17. На уровне повыше и сущности повыше: те же права доступа и т.п. Не сказал бы что это просто.
  18. Каналы сравнения могут работать в разных режимах, один из них ШИМ - я его не использую, а использую OC_MODE_SET_INACTIVE. Т.е. при совпадении таймера со значением в регистре CCR1, выход OC1 будет сброшен. До запуска таймера я принудительно устанавливаю OC1 в 1 записью OC_MODE_FORCE_ACTIVE. Вполне сойдет. Чтобы пин МК не торчал на улицу - иначе внешняя помеха убъет весь МК. Я IWDG использую, но он на практике будет срабатывать только в случае ошибки в программе. Но HardFault (может) случится раньше и можно локализовать проблему. Настраиваю предделитель, чтоб частота счета была 1МГц - получаю все интервалы в микросекундах.
  19. Я настраиваю таймер с частотой 1МГц. Т.е. каждый тик таймера - ровно 1 мкс. Первый канал в режиме сравнения у меня управляет транзистором, который сажает шину на общий. Т.к. при 1 на выходе первого канала, на шине формируется нулевой потенциал (схема с открытым коллектором). На второй канал через резистор подается потенциал шины. Второй канал настроен на захват по фронту. Когда нужно передать/считать бит - в регистр сравнения (первый канал) я записываю нужную длительность в мкс, затем принудительно выставляю выход канала в 1, и настраиваю, чтобы выход сбросился в 0 при совпадении. Потом жду события UPDATE. В обработчике прерывания/события UDPATE получаю в CCR2 длительность нахождения шины в нулевом состоянии. Если будет сбой внешнего кварца, то контроллер автоматом переходит на HSI - и может ограничено продолжить работу пока кварц не восстановит генерацию. Это к 1-wire отношения не имеет, просто у меня в проектах везде так. Это не понял Неа. У меня два канала - первый на передачу, второй на прием. Т.к. нужно управлять мощным/внешним транзистором. Но можно и на одном пине сделать, хотя каналов все равно будет два. У вас осциллограф или логический анализатор есть, чтоб посмотреть активность на шине 1-wire?
  20. Есть карты SD-WiFi, например. А в них как эта проблема решается?
  21. Функция init_TIMER12() Я не понимаю о чем вы говорите. В прерывании (TIM8_BRK_TIM12_IRQHandler) используется значение регистра захвата TIM12->CCR2, которое передается в функцию OW_on_data, где идет основной разбор. При инициализации чего? Видно, что внутри init_TIMER12() первая инструкция отключает таймер, а затем полностью перенастраивает. У меня init_TIMER12() может вызываться несколько раз - если возникает сбой HSE/PLL, то аппаратные блоки переходят на HSI, когда PLL/HSE восстанавливаются, то возвращается все на высокую частоту. В эти моменты периферия полностью переинициализируется. Вам на это не стоит обращать внимание - а нужно сосредоточится на сути - причем, я не настаиваю, что мое решение хорошее и/или единственно верное. Скорее наоборот, я знаю фатальные недостатки и их невозможно обойти в моей реализации. Например, подавать питание на DQ в момент преобразования температуры. Я не подаю, поэтому некоторые датчики с паразитным подключением - не работают. Вы до этого с DS18B20 каким-то образом работали? А с таймерами STM32 работали?
×
×
  • Создать...