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

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

Спасибо :)
Всем добра и позитива :)
А чего минусов столько?
НЛО прилетело и опубликовало эту надпись здесь
SDRAM поднят :) цветной дисплей подключен как внешняя память и обновляется по ДМА :) USB тоже можно поднять… если кому-то нужно… :)
НЛО прилетело и опубликовало эту надпись здесь
В Reference Manual детально описана инициализация PLL, а вот переключение SysClk на тактирование от PLL нет так явно. :) Пришлось потратить некоторое время на исследование HAL и формирование нужной последовательности.
Настройка FMC контроллера — одна строчка :) если интересно могу выложить :)
НЛО прилетело и опубликовало эту надпись здесь
Согласен :) не одна.
void init_FMC(void)
{
RCC->AHB3ENR |= RCC_AHB3ENR_FMCEN;
FMC_Bank1->BTCR[0] = 0x000010D9; //for 168 MHz
FMC_Bank1->BTCR[1] = 0x000300F;
}
Инициализация FMC для F7.
А как у нее с энергопотреблением относительно серии F?
Не исследовал. В моих проектах вопросы экономии потребления, как правило, не стоят. :)
Пошел искать информацию по H7 и наткнулся на вашу же статью, тут же, на хабре (STM32 без HAL и SPL), где вы «ждете H7 с нетерпением». Мои поздравления)
Ага. Дождался. Радует увеличение памяти, можно будет поднять разрешение экрана и 16- разрядный АЦП, выйти на 4 десятичные цифры в измериловке. :)
Отказ от использования HAL — не достижение, тот же CubeMX может вам выдать готовый код инициализации и с использованием LL, не суть. Лучше про готовый проект напишите, что он делает, зачем, как удалось много всего засунуть в так мало памяти и т.д. Хотя H7, конечно, не особо стимулирует ее экономить…
У меня много проектов :) Проектирование высоковольтных испытательных установок, соответственно: управление инверторами, измерения разнообразные тока, напряжения, сопротивления, затухания и т.п. :) Вывод информации на цветной ЖК монитор.

HAL не использую в своих проектах. Не люблю за излишнюю громоздкость кода. Быстрее, проще и компактней получается без него. :) Я привык работать с официальными источниками: рефреренс, даташит… :)
Ага, ну вот например как вы шум фильтруете чтобы 16-битный АЦП не показывал мусор в младших битах? Мне было бы интересно почитать о методах борьбы, в первую очередь — аппаратно, в схемотехнике.
Большая скорость АЦП контроллера позволяет делать большое количество усреднений. Стандартно, я использую усреднение в 1000 раз и младшие 2 разряда отбрасываю, делю на 4. То есть максимальное число будет 1000. При этом скорость преобразования АЦП ставлю минимальной, так он точней работает. Этот простой метод позволяет иметь обновление данных, примерно, 10-20 раз в секунду. Младшая цифра не скачет даже при больших шумах. Если нужна большая точность, использую 24-разрядные АЦП.
По схемотехнике решения стандартные: фильтры, земли. :)
Я как раз по схемотехнике спрашивал :) Вот лежит рядом с компьютером мультик в режиме измерения частоты, показывает 50 герц, никуда не подключен:
Картинка
image
Мне в таких замечательных комфортных условиях нужно что-то читать через 16-битный SDADC, желательно хотя бы 100 раз в секунду, если фильтровать только программно (усреднение, медиана, комплементарный фильтр и т.д.) — все равно есть шум с амплитудой порядка 0.010 вольт при референсе в 3.3 вольта, что превращает 16-бит где-то в 7-8…
8 бит потерять, это конечно много. :( Какой референс? я обычно использую внешний, так как внутренний редко у кого бывает хороший.
Если шум есть при замкнутом входе, тогда нужно смотреть входные цепи, земли.
Референс внешний (F373: VREFSD+) от того же регулятора, от которого и питание контроллера (LM1117-3.3), можно конечно сделать отдельный только для аналоговой цепи, но сначала хочется понять есть ли смысл.

Прикол в том, что наличие руки рядом с платой сразу увеличивает амплитуду шума, а готовое устройство предполагается не в клетке фарадея, а рядом с биологическими объектами и компьютером.
Очень высокоомный вход? Вход дифференциальный с подавлением синфазной помехи? Если наводка 50 Гц, то может стоит отфильтроваться от нее?
Если считывать биологические потенциалы, то стоит посмотреть на схемы кардиографов. Референсные схемы, вроде, были сайте TI. У Терраэлектроники была рассылка на эту тему.
Вход — от десятков до сотен килоОм, фактически это вариант макетки с подключением всякого разного, от банальных потенциометров до усилителя load cell, не дифференциальный. Частоту 50 Гц отфильтровать не очень понимаю как, у входного сигнала нет фиксированной частоты и слишком загрублять его тоже не хочется.
Сотня килоом, нормально, не фантастика. Может коэффициент усиления большой?
Если потенциометр повесить — то же самое.
Наводка, именно 50 Гц?
наверное, надо думать как от нее избавиться
от того же регулятора, от которого и питание контроллера (LM1117-3.3)

Таким образом вы измеряете весь шум генерируемый контроллером по питанию — как минимум надо аналоговое питание(VDDA) от цифрового отделять дросселем с емкостью. А на опорное (REF) как минимум ставить отдельный стабилизатор, а для 16 бит и выше — специальный источник опорного.
В первую очередь разбирайтесь с разделением общего (аналогового от цифровой). Я в своих опытных изделиях всегда добавляю нулевой резистор между точками соединения цифрового и аналогового общего. Если блымает, то его убираю и проводником соединяя разные участки общего пытаюсь добиться минимального блыманья. При этом стараюсь все довести, чтобы младший знак не прыгал более, чем на 1-2 единицы (разрешение 12бит) без всяких цифровых фильтров. Так или иначе при правильной схемотехнике вполне достижимо, чтобы блымало не более 1-2 единиц младшего разряда для 12 бит без цифрового фильтра.
10 бит (12-2) — мало, так я мог бы остаться на 12-битном ADC и не пытаться переползти на 16-битный. С тыканием проводочком — хорошоя идея, спасибо!

Ну, с открытой измерительной цепью вы будете ловить что угодно, очевидно, что срач на 50Гц самый сильный, поэтому АЦП его и регистрирует.

Зря вы так. Не факт что Ваш код лучше чем HAL.

Вот например в 10. «Пуск PLL1 и ожидание готовности» нет выхода из цикла по таймауту.
А в HAL есть обработчики таких ситуаций.
Вы правы. Сделано намеренно, поскольку если будет проблема, то проц не выйдет из цикла и плата не запустится. А запуск устройства с другими параметрами тактирования не нужен.
НЛО прилетело и опубликовало эту надпись здесь
:)
HAL не использую в своих проектах. Не люблю за излишнюю громоздкость кода. Быстрее, проще и компактней получается без него. :) Я привык работать с официальными источниками: рефреренс, даташит… :)

не совсем понятно, а что CubeMX и HAL это «неофициальніе источники»?
Конечно официальные. :) По ним есть документация. Но вчера была SPL, сейчас HAL, есть еще LL :). После покупки Atollic, возможно, STM придумает еще более удобную среду разработки и новый уровень абстракции. :) Например, что-нибудь, типа LabView. :)
Кстати, LabView вовсю используется на андронном коллайдере
Используется. :) Я имел небольшой опыт написания на LabView. Не представляю, как сопровождать и поддерживать большой код в этой системе.

Извините, но это


//PLLM = 4
    RCC -> PLLCKSELR &= ~RCC_PLLCKSELR_DIVM1_5; //0
    RCC -> PLLCKSELR &= ~RCC_PLLCKSELR_DIVM1_4; //0
    RCC -> PLLCKSELR &= ~RCC_PLLCKSELR_DIVM1_3; //0
    RCC -> PLLCKSELR |=  RCC_PLLCKSELR_DIVM1_2; //1
    RCC -> PLLCKSELR &= ~RCC_PLLCKSELR_DIVM1_1; //0
    RCC -> PLLCKSELR &= ~RCC_PLLCKSELR_DIVM1_0; //0

просто финиш. Вы смотрели на объявления этих регистров? Все, как один — volatile? Во что компилятор должен будет превратить всю эту простыню быдлокода? На каждую строку Сишного кода у вас должно быть:


  1. Загрузка значения регистра RCC -> PLLCKSELR
  2. Присваивание регистру значения битовой маски
  3. Арифметическая операция AND (и один раз OR)
  4. Выгрузка значения в регистр RCC -> PLLCKSELR
  5. Повторить пункты 1-4 для каждой строки сишного кода

В то время, как это значение у вас известно на этапе компиляции и не меняется в рантайме. Достаточно было


  1. Присвоить регистру compile-time константу с нужными взведенными битами
  2. Выгрузить значение в RCC -> PLLCKSELR

Да, часто нужно выполнять операции над регистрами в определенной последовательности, но конкретно здесь это точно не нужно. Простота кода? Но зачем вы тогда спускались до уровня регистров?

Значения делителей и множителей PLL необходимо устанавливать до запуска. После запуска поменять нельзя, нужно будет останавливать. Поэтому определенный порядок должен быть. Также и с выбором источника SysClk.

Нет, я не про это говорю, я про то, что вы в одном блоке кода 6 раз подряд модифицируете делитель частоты, зачем?

А в чем проблема? код нечитабелен? :) проблема с производительностью? биты определены в хедере… :)
НЛО прилетело и опубликовало эту надпись здесь
Я не понимаю, за что Вас пинают. Да еще и минусят как проклятого. Раньше была дискриминация по половому признаку и по расовому. Были бодания по языкам Java, C++, Delphi, C#, Python и др. Но сейчас каждый в своей песочнице поселился — статус-кво. Теперь перешли боталии на библиотеки.
Тут упоминались читабельность и скорость, а мне припомнился труд Михаила (Mihail) на easyelectronics, он там сотворил хорошую вещь, возможно и у Вас получиться анологичные конструкции сотворить. И очень желательно для простолюдинов вроде меня создавать для серий STM32F103, STM32F405/7.
Собственно статья: Удобная настройка GPIO портов
ЗЫ: и хоть на Хабре полируют медианное мнение за HAL, мне чайнику ближе CMSIS. Спасибо за статьи!
Спасибо на добром слове.
Я не против библиотек в принципе. Мне не очень нравится, когда утверждают, что есть единственный и правильный способ использования микроконтроллеров посредством HAL. На мой взгляд, если способ удобен и позволяет добиться необходимого результата — имеет право на существование.
Мне тоже ближе CMSIS и работа с регистрами. И я считаю, что этот подход позволяет быть независимым в выборе производителя и архитектуры микроконтроллеров. HAL — это библиотека одного производителя, при смене которого будет другой инструментарий. :)
Сколько стоит сие чудо? Datasheet?

Обычно у хороших фирм вся информация размещается на одной странице и для ее поиска достаточно вбить партнамбер в гугл.


https://www.st.com/en/microcontrollers/stm32h743ii.html
https://www.st.com/en/microcontrollers/stm32f746ig.html

К сожалению не заработало. Выполнил вашу последовательность от А до Я. Зависает в пункте переключения тактирования (13).
Могу выложить полный код функции настройки тактирования, которой пользуюсь.
Нашёл проблему — установил в пункте 6 не [8 and 16 MHz], а [2 and 4 MHz]. Ведь на вход PLL частота идёт через DIVM1. Получается 8 / 4 = 2. Это всё, конечно, догадки, но у меня заработалою
Отлично. А частоту можно посмотреть через MCO. :)
Кстати, судя по даташиту, работа на 400 мГц возможна только при установке напряжения ядра VOS1. По умолчанию стоит уровень VOS3 с максимальной рекомендуемой частотой 200 мГц. У вас заработало при VOS3?
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории