Как стать автором
Обновить

Комментарии 23

Я конечно прошу прощения, но вот это «Ведь при передаче данных по линии связи и сами собой могу возникать ошибки даже в тепличных условиях» в корне неверно! Если ошибки происходят уже «на столе», значит в консерватории точно что-то не в порядке.
К тому же сомнительно, чтобы RC-генератор мог в тепличных условиях уйти настолько, чтобы появились битовые ошибки в UART. Да и в «боевых» условиях тоже.
Если ошибки происходят уже «на столе», значит в консерватории точно что-то не в порядке.
Я это тоже понимаю, поэтому и пытался разобраться в периодически возникающей проблеме, вместо того, чтобы махнуть рукой и сказать «и так сойдет».

А битовые ошибки иногда могу возникать при высокой скорости работы UART. А уж «в боевых» условиях от различных электромагнитных помех при коммутации силовых цепей — и подавно.

На дешёвых платах с STM32F401CCU6 от WeAct, где установлен кварц на 25 МГц, регулярно наблюдалась проблема с нерабочим DFU — по симптомам похоже, что частота HSI отклонялась от паспортного значения 8 МГц настолько, что при попытке определения частоты внешнего кварца (для которого встроенная реализация DFU поддерживает автоопределение в диапазоне от 4 до 26 МГц с шагом 1 МГц) эта частота определялась неправильно — как 24 или 26 МГц (для чего достаточно отклонения частоты HSI примерно на 2%). В последних версиях документа AN2606 “STM32 microcontroller system memory boot mode” по этому поводу даже появилось примечание о том, что для надёжной работы DFU желательно использовать кварц с более низкой частотой (например, 8 МГц) — в этом случае ошибочное определение частоты произойдёт при заметно более значительном отклонении частоты HSI (более 6%), вероятность чего значительно меньше.

Значит не зря меня смущала стабильность работы встроенного генератора.
Работал с STM32 более 5 лет и никогда не было таких проблем. Зачем использовать такой странный кварц — 11.0592 МГц? Даже при использовании HSI RC, UART работал стабильно, при нормальных условиях — неделями. Сбои могли возникнуть только в термокамере, при больших отклонениях температуры.
И у меня тоже до этого случая не было таких проблем.
Зачем использовать такой странный кварц — 11.0592 МГц?
Чтобы при установке стандартных скоростей (115200, 9600 и т.д.), получать их целочисленным делением.
Так скорость UART делится не из скорости кварца. Даташит почитай)
Делится PCLK2 или PCLK1, в зависимости от канала UART.
Например первый попавшийся даташит для STM32F1**
Only USART1 is clocked with PCLK2 (72 MHz max). Other USARTs are clocked with
PCLK1 (36 MHz max).

image
72 MHz дает нулевую погрешность на 115200 и более низких скоростях.
Ну или первый попавшийся даташит по STM32F4**
Only USART1 and USART6 are clocked with PCLK2. Other USARTs are clocked with PCLK1. Refer to the device datasheets for the maximum values for PCLK1 and PCLK2

У тебя на скриншоте PCLK2 70.77888, что дает большую погрешность.

Все правильно, у меня скриншот не F4, а F1.
И он не с реального оборудования, а только как демонстрация возможных ошибок при автоматическом подборе параметров работы переферии.
«Странный кварц» на 11.0592 МГц выбран для того, чтобы его частота была кратной частоте Modbus-a в 2400 бод, 9600 и т.д., что позволяет уменьшить вероятность битовой ошибки минимальными усилиями уже(!) в железе. Как правило в даташит включены рекомендации по конфигурации регистров периферии и таблица с вероятностями битовых ошибок или формула для вычисления этих самых вероятностей в зависимости от съехавшей частоты.

А вообще вам скорее всего повезло с отсутствием проблем или же в прошивке был что-то ещё. Обычно на производстве конечного устройства производится калибровка встроенных кварцев по одному стабильному внешнему, и это значение загружается куда-то в регистры при старте устройства. Дополнительно можно, а иногда и необходимо, реализовать адаптивную перекалибровку в процессе работы устройства, например — раз в несколько минут, при больших и частых отклонениях температуры.
Потому что 11059200/8/12=115200 а в х51 вы могли использовать для тактирования UART только частоту генератора деленную на 8 (ну или на 16).
Зачем использовать такой странный кварц — 11.0592 МГц?

возможно рядом стоит какой-то потребитель конкретно этой частоты или её производных.

у нас например стоит 12.288 МГц, потому что где-то рядом от нее тактируется блок АЦП (2.048 МГц).
Вообще то странно —
Данный генератор проходит калибровку на заводе и производитель гарантирует точность в 1% при температуре 25 градусов Цельсия
и этого должно хватать, возможно у Вас мало стоп-битов?
возможно у Вас мало стоп-битов?
Два, как и должно быть.
Это-ж насколько нужно облениться, чтобы заполнить два регистра средствами кубика.
Не два регистра. И если заполнять вручную без кубика, то заполнять придется их все.
А потом, это же нужно будет делать для каждого устройства и для каждой серии микроконтроллера!
На картинке вообще от STM32F107, и там тоже два регистра.
Если использовать все возможности, то кубик вам не поможет, там этого просто нет.
Я хочу сказать, что если не пользоваться кубиком, то вручную придется настраивать не только тактовую частоту, но и всю остальную периферию, и это далеко не два регистра.
А если использовать Middleware, то параметров для настройки будет еще больше.
Тактовая один раз по старту, я вон вообще в стартап прописал. Плюс структурку добавил, куда значения тактовых для всех шин записываются при обновлении. А далее, просто формулы которые считают периоды таймеров и частоту для I2C.

Вот с I2C реально засада. Одно время времени не хватало на разобраться с расчетом TIMING регистра, пользовался кубиком для расчета этого числа. Пока анализатором не увидел что на шине вместо 400кГц внезапно 330 кГц. Акселерометр оказался не привередливым, работал нормально. При разборе полетов, оказалось все просто: кубик знать не знает про емкость шины на плате, да и номиналы резисторов в расчете не участвуют. При ручном расчете, это можно скомпенсировать и получить правильную диаграмму.

Так что даже для настройки периферии, пользовать кубик ну такое себе удовольствие. Опять же, неужели когда новое устройство делают, то старый код обнуляют и пишут все с чистого листа? Да после первого ж проекта появляется более\менее приличный набор сниппетов кода, который гуляет потом по проектам.
Это все так и от копипаста между проектами уйти не получится. Просто я придерживаюсь принципа, что работает — не трогай. Понятно, что во всех случаях пользоваться стандартными настройками не выйдет, да и кубик не со всеми настройками может справится.

В одном проекте светодиод и входная цепь были на одном пине. Так её для опроса приходилось каждый раз переконфигурировать на вход, проверять нажатие кнопки, и опять устанавливать как выход.

А с I2C вообще беда. Периодически пропадала связь не понятно почему. В результате нашел в errate про этот косяк, который так же приходится обходить вручную. (2.13.7 I2C analog filter may provide wrong value, locking BUSY. STM32F10xx8 STM32F10xxB Errata sheet)
Пока анализатором не увидел что на шине вместо 400кГц внезапно 330 кГц. Акселерометр оказался не привередливым, работал нормально. При разборе полетов, оказалось все просто: кубик знать не знает про емкость шины на плате, да и номиналы резисторов в расчете не участвуют.

Эээ… А как емкость шины и номиналы резисторов могут повлиять на частоту тактирования?
Затягиванием фронтов влияет. I2C в STM32 начинает отсчет длительности «1» и «0» для линии SCL только по достижению определенного уровня. При этом длительность фронта явно не указывается, но начинает влиять. Там времена небольшие, но эффект забавный получается. По рукой записи анализатора нет, показал бы наглядней.

Не спроста же для скоростей выше 400к обычно используется токовый драйвер для быстрого фронта. у того же stm на борту 25мА источник есть для режима F+ (до 1МГц), правда не понятно как его запустить то корректно.

По поводу микроконтроллеров — была история с дорогущим ноутбуком для программирования siemens symantec, у которого был встроенный контроллер для закачки программы в микроконтроллер через COM порт. Который сгорел, когда его подключали, не выключив питание. Потому что в 99 случаях это делать можно без последствий, но в 1 случае из 100 устройства бывают подключены к разным розеткам с разными фазами. И привет.

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