Комментарии 54
HAL не использую в своих проектах. Не люблю за излишнюю громоздкость кода. Быстрее, проще и компактней получается без него. :) Я привык работать с официальными источниками: рефреренс, даташит… :)
По схемотехнике решения стандартные: фильтры, земли. :)
Если шум есть при замкнутом входе, тогда нужно смотреть входные цепи, земли.
Прикол в том, что наличие руки рядом с платой сразу увеличивает амплитуду шума, а готовое устройство предполагается не в клетке фарадея, а рядом с биологическими объектами и компьютером.
Если считывать биологические потенциалы, то стоит посмотреть на схемы кардиографов. Референсные схемы, вроде, были сайте TI. У Терраэлектроники была рассылка на эту тему.
от того же регулятора, от которого и питание контроллера (LM1117-3.3)
Таким образом вы измеряете весь шум генерируемый контроллером по питанию — как минимум надо аналоговое питание(VDDA) от цифрового отделять дросселем с емкостью. А на опорное (REF) как минимум ставить отдельный стабилизатор, а для 16 бит и выше — специальный источник опорного.
Ну, с открытой измерительной цепью вы будете ловить что угодно, очевидно, что срач на 50Гц самый сильный, поэтому АЦП его и регистрирует.
Вот например в 10. «Пуск PLL1 и ожидание готовности» нет выхода из цикла по таймауту.
А в HAL есть обработчики таких ситуаций.
HAL не использую в своих проектах. Не люблю за излишнюю громоздкость кода. Быстрее, проще и компактней получается без него. :) Я привык работать с официальными источниками: рефреренс, даташит… :)
не совсем понятно, а что CubeMX и HAL это «неофициальніе источники»?
Извините, но это
//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? Во что компилятор должен будет превратить всю эту простыню быдлокода? На каждую строку Сишного кода у вас должно быть:
- Загрузка значения регистра RCC -> PLLCKSELR
- Присваивание регистру значения битовой маски
- Арифметическая операция AND (и один раз OR)
- Выгрузка значения в регистр RCC -> PLLCKSELR
- Повторить пункты 1-4 для каждой строки сишного кода
В то время, как это значение у вас известно на этапе компиляции и не меняется в рантайме. Достаточно было
- Присвоить регистру compile-time константу с нужными взведенными битами
- Выгрузить значение в RCC -> PLLCKSELR
Да, часто нужно выполнять операции над регистрами в определенной последовательности, но конкретно здесь это точно не нужно. Простота кода? Но зачем вы тогда спускались до уровня регистров?
Нет, я не про это говорю, я про то, что вы в одном блоке кода 6 раз подряд модифицируете делитель частоты, зачем?
Тут упоминались читабельность и скорость, а мне припомнился труд Михаила (Mihail) на easyelectronics, он там сотворил хорошую вещь, возможно и у Вас получиться анологичные конструкции сотворить. И очень желательно для простолюдинов вроде меня создавать для серий STM32F103, STM32F405/7.
Собственно статья: Удобная настройка GPIO портов
ЗЫ: и хоть на Хабре полируют медианное мнение за HAL, мне чайнику ближе CMSIS. Спасибо за статьи!
Я не против библиотек в принципе. Мне не очень нравится, когда утверждают, что есть единственный и правильный способ использования микроконтроллеров посредством HAL. На мой взгляд, если способ удобен и позволяет добиться необходимого результата — имеет право на существование.
Мне тоже ближе CMSIS и работа с регистрами. И я считаю, что этот подход позволяет быть независимым в выборе производителя и архитектуры микроконтроллеров. HAL — это библиотека одного производителя, при смене которого будет другой инструментарий. :)
Обычно у хороших фирм вся информация размещается на одной странице и для ее поиска достаточно вбить партнамбер в гугл.
https://www.st.com/en/microcontrollers/stm32h743ii.html
https://www.st.com/en/microcontrollers/stm32f746ig.html
STM32H7 — настройка тактирования без HAL