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

Cmsis Vs Stdperiph, Мнение.


Liyboputnui

Рекомендуемые сообщения

Доброго всем времени суток. Хочу освоить STM32, уже начитался много чего в интернете и умею моргать светодиодом для STM32F1.

У меня такой вопрос, какую библиотеку лучше использовать для программирования STM32, стандартную CMSIS или StdPeriph.

Насчет StdPeriph узнал с форумов что есть куча багов и код медленный, это не по детски настораживает.

Также встречал мнения что используя CMSIS жизни не хватит чтоб прогу написать.

Как вы сами поступаете, что используете?

Заранее спасибо.

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Машинные коды - самый продвинутый инструмент для любых ядер.

Если лень изучать или нет времени на разработку своих библиотек - нефиг и вопросы задавать. Ибо ответы на них примерно равнозначны.

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

лично я использую HAL. Однако в среде программистов бытует мнение, что это чуть ли не Arduino Wire и это фу и куча багов и код говно и прочее фуфло с распальцовкой.

А Ванька слушает да ест....

И все работает. И все быстро и просто и без каких либо багов. И пофик что я такой вот говнокодер и фиолетово мне на все мнения в мире. вот

Все что ты прочитал про стдпериф полный бред. Если почитать определения функций и макросов, то там просто обертка на цмсис с некоторыми добавками типа приведения типов, обработки исключений и прочего. Ну да, они буду чуть помедленнее голого асма. Но зато если у тебя гдето (к примеру) случится переполнение или поделится неожиданно на ноль, проц у тебя не встанет колом. "Крутым" кодерам со своим "мнением" это конечно не нужно, у них и так яйца звенят от крутости.

Если почитать код библиотеки HAL то там те же яйца, только в профиль. Более понятное именование, интегрированная обработка прерываний, более продвинутый сервис обработки исключений. По сути стдпериф и хал равнозначны. Но хал лучше и современее и дока на него вменяемая. В CubeMX есть примеры кода на каждый чих

вот те инитка ADC на стд

ADC_StructInit(&ADC_InitStructure);
/* Настраиваем АЦП на 12 бит */
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;		 //Разрешение 12 бит
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;		 //Непрерывный режим
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; //Снаружи тактировать не надо
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;		 //Выравнивание по правому краю
ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;	 //Направление сканирования - вперед
ADC_Init(ADC1, &ADC_InitStructure);				 //Записать конфиг
/* Настраиваем каналы 55.5 Cycles as sampling time */
ADC_ChannelConfig(ADC1, ADC_Channel_0 , ADC_SampleTime_55_5Cycles);
ADC_ChannelConfig(ADC1, ADC_Channel_1 , ADC_SampleTime_55_5Cycles);
ADC_ChannelConfig(ADC1, ADC_Channel_2 , ADC_SampleTime_55_5Cycles);
ADC_ChannelConfig(ADC1, ADC_Channel_3 , ADC_SampleTime_55_5Cycles);
ADC_ChannelConfig(ADC1, ADC_Channel_5 , ADC_SampleTime_55_5Cycles);
/* Запускаем калибровку АЦП */
ADC_GetCalibrationFactor(ADC1);
/* Запускаем сам АЦП */
ADC_Cmd(ADC1, ENABLE);

а вот на хал. Внутри одно и тоже по сути, только другими буквами написано

ADC_ChannelConfTypeDef sConfig;

hadc1.Instance = ADC1;
hadc1.Init.ScanConvMode = ADC_SCAN_ENABLE;
hadc1.Init.ContinuousConvMode = ENABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 5;
if (HAL_ADC_Init(&hadc1) != HAL_OK) Error_Handler();
sConfig.Channel = ADC_CHANNEL_3;
sConfig.Rank = 1;
sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) Error_Handler();
sConfig.Channel = ADC_CHANNEL_6;
sConfig.Rank = 2;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) Error_Handler();
sConfig.Channel = ADC_CHANNEL_7;
sConfig.Rank = 3;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) Error_Handler();
sConfig.Channel = ADC_CHANNEL_8;
sConfig.Rank = 4;
sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) Error_Handler();
sConfig.Channel = ADC_CHANNEL_9;
sConfig.Rank = 5;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) Error_Handler();

оба этих кода делают одно и то же - конфигурируют 5 каналов АЦП. Оба работают, оба одинаково шустро ). Разница только в том, что во втором случае создается хэндлер, который делает работу со всей структурой АЦП очень удобной, а в первой такого дела нет. И во втором случае можно проверить успешность каждого события и обработать ошибку вовремя, если к примеру ты забыл чтото затактировать, но пытаешься запустить. Выглядит конечно громоздко по сравнению с цмсис, но работает гораздо надежнее и совсем не "медленно"

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

  • 4 недели спустя...

оба этих кода делают одно и то же - конфигурируют 5 каналов АЦП. Оба работают, оба одинаково шустро ). Разница только в том, что во втором случае создается хэндлер, который делает работу со всей структурой АЦП очень удобной, а в первой такого дела нет. И во втором случае можно проверить успешность каждого события и обработать ошибку вовремя, если к примеру ты забыл чтото затактировать, но пытаешься запустить. Выглядит конечно громоздко по сравнению с цмсис, но работает гораздо надежнее и совсем не "медленно"

Скажите пожалуйста, а второй код, по ХАЛ который, вы сами пишете обычно ?

С библиотекой СТД понятно, код инициализации ни в какой графической аппликации сгенерировать невозможно вообще никак - надо писать самому.

А вот с ХАЛ все эти сложные инициализации можно сгенерировать в КубеМХ и все ?

Ссылка на комментарий
Поделиться на другие сайты

вот еще делать нечего тупые инитки руками писать. Для этого придумали CubeMX. Мощнейший генератор кода для иниток. В очень очень редких случаях немного правлю под себя, но такие разы можно по пальцам сосчитать.

Рабочий код уже ессно ручками и тоже на ХАЛ. Если уж взялся все на нем, то мешать некрасиво

Там все просто - создаете конфигурацию устройства (входы/выходы/таймера/цап/ацп/шины), потом задаете настройки тактового генератора, потом конфигурируете блоки (там надо немного мозга). Жмем сгенерить проект и получаем готовый проект с прикрепленными библиотеками и модулями под выбранную среду. Скелет проекта. Потом добавляем в него рабочий код и получаем собственно готовую программу. Если правильно все настроить в кубе, то к иниткам руками добавлять уже ничего не приходится. А писать их вручную слишком трудоемко и чревато ошибками. Иниточный код выполняется только раз, так что какой бы он ни был огромный на быстродействие модулей в целом не влияет никак. А вот основную прогу будьте любезны уже писать вдумчиво и аккуратно. Но и там ХАЛ существенно экономит время и избавляет от массы ошибок. А если еще освоить RTOS то вообще кодинг превращается в чистое удовольствие

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

Например, вот.

Человек замутил свою функцию на передачу строки по УАРТ. Укоротил ХАЛовскую запись. Стандартный, любимый всеми printf.

С приемом данных на ХАЛ тоже сурово выглядит для меня, пока что.

post-202368-0-06615300-1468567620_thumb.png

Добавлено.

Хотя, может это сейчас так кажется... На CCS C for PICs тоже будь здоров всего было: буфер чистить, флаг сбрасывать, а потом сразу ставить и все такое.

Изменено пользователем Добрячок
Ссылка на комментарий
Поделиться на другие сайты

ну просто чувак обертку сделал, да и все. Причем отправка в тупую без ДМА. Это тормоз, так как пока не отправит процесс не освободит. Все это можно сделать гораздо умнее если заменить HAL_UART_Transmit на HAL_UART_Transmit_DMA а в колбэке поднимать флаг конца передачи. Но это вам судя по всему еще рановато. Хотя по скорости будет в 10 раз эффективнее.

Там на самом деле все просто - при отправке по ДМА если вызвать следующую отправку, то они могут наложиться, так как функция передачи сразу же передает управление следующей за ней командой без ожидания самой отправки. Поэтому для вызова следующей отправки было бы неплохо проверить - а завершилась ли предыдущая. Для этого нужен ручной диспетчер (флаг). Его легко замутить используя колбэки (сигналы середины и конца передачи). Тогда все будет гладко и без наложений.

То же самое прием - на DMA делается прием в полубуфер, и по каждому заполнению полубуфера производится обработка данных. Скорость приема до 3-х мегабит по уарту.

Я все стараюсь делать на ДМА. Это процессор в процессоре, не использовать который весьма глупо. И порой его использование позволяет получать весьма элегантные почти аппаратные алгоритмы, которые разгружают ядро на 99%. Даже сбор данных с многоканального ацп и их оверсэмплинг с довольно высокими показателями сэмплирования (200-500, а порой и до 10000) без прерывания процесса ни на единый сэмпл

Вообще для нормальной работы функционала HAL обычно вполне достаточно. В рабочих системах его очень хорошо дополняет RTOS. Вместе они создают идеальный диспетчер низкого и высокого уровня. Средний уровень (логику) формируем штатными средствами процедурного C. Такая связка дает идеальный набор инструментов для ARM без существенной потери производительности с очень высокой скоростью генерации рабочего кода и как следствие - сокращение затрат времени на разработку и количество скрытых ошибок

То что я раньше на STD городил месяц, нынче делаю с нуля меньше чем за неделю. И прекрасно работает. А бывает что за час-полтора городится прога, которая запросто рулит тремя потоками данных (уарт) на прием и передачу, при этом использует одни и те же колбэки и потоки обработки данных без всяких тормозов. Вообще инструмент мощнейший. Рекомендую потратить время на изучение

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

  • 1 месяц спустя...

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • Уважаемые товарищи, нужны схемы, либо НТД для ремонтов блоков очень срочно!!!! Всё кроме реле Р10ТМУ, уже нашёл не вашем форуме и их отремонтировали....любая помощь приветствуется
    • Все предложенные к рассмотрению источники питания работают примерно по одному принципу: сетевое напряжение выпрямляется, фильтруется (получаем чуть больше 300 вольт постоянного), затем преобразуется снова в переменное, но уже на частотах в несколько десятков килогерц, понижается на трансформаторе и снова выпрямляется. За счёт высокой частоты преобразования используется трансформатор на ферритовом, а не на стальном, сердечнике, гораздо меньших габаритов и стоимости. Минусы: значительное усложнение схемы блока и вероятность возникновения различных помех от него. Модули управления (кроме первого) также являются импульными преобразователями, с теми же достоинствами и недостатками. Если нужно по быстрому собрать некое подобие ЛБП, то уж лучше брать модуль вроде этого. Ну и блок питания к нему соответствующий. Но не очень понятно, какой практический опыт можно получить от соединения готовых модулей парой проводов.  
    • У меня больше всего вопросов вызвала необычная схема обеспечения отрицательного питания. Автор этой обстоятельной заметки пишет: For this supply to work correctly, the transformer must have a secondary voltage of at least 18V RMS.  Почему? Что будет не так с отрицательным питанием, если напряжение на трансформаторе будет меньше 18В?   https://tinyurl.com/23mlwxtt - я в простейшей эмуляции ставлю 12В пикового напряжения для трансформатора и на стабилитроне все как положено: -5.6В.
    • Согласен, очень криво объяснил. Это работа трёх вольтовой линии, просто на диод шотки сдвоенный, на один анод приходит сигнал напрямую с трансформатора, а на второй через дроссель. Вольт/деление 5 вольт в клетке, тайминг по моему 10 МС. Третья фотография это сигнал на катодах уровень земли ровно по центру экрана. Но все линии по итогу в порядке 3.3 в, 5, в, 12 в и -12 в. Нагрузить все линии не могу сразу ,так как тут же выгорают транзисторы (имеется нагрузка 250 ватт по 10 ампер на каждую линию за исключением-12в), поэтому нагружаю 3.3 вольтовую линию на 10 ампер,  подключаю переменный резистор 50 ватт на 15 ом на 5 вольтовую линию и постепенно довожу до той той картины с перекосом (это гдето  50 ватт общее). По поводу микросхемы, вверху имеется скрин где между импульсами проскакивает мини импульс, если так можно сказать, он проскакивает и на одной  и на второй ноге (7,8). Микросхема не tl 494, а lw4933/abx942.1/c9421646. Далее они приходят на базы транзисторов 945g  коллекторы этих транзисторов соединены с  выводами трансформатора. Просто схема типовая, легче мне кажется просто привести фото самого блока, для тех кто разбирается будет гораздо информативне.  Диод шотки по 12 вольтовой линии был подгоревший, заменил на донора. Приводить скрины не буду что бы не захламлять тему. В итоге, пока все так же, при достижении определенной нагрузки суммарно где-то 50 ватт, появляется этот "выброс и перекос". По этому имеются мысли на два варианта, это микросхема , этот мини импульс между периодами, на низкой нагрузке особо не влияет, но при достижении определенной приводит с самовозбуждению входной цепи и непроизвольному открытию транзистора нижнего плеча. Либо дело в "горячей части", плавающий дефект в обвязке силовых ключей.  Спасибо за ответ.
    • @Gomerchik а вы контролировали как меняется уровень сигнала на А1 ардуины?
    • Спасибо за совет. Автором данного проекта я не являюсь, мне нужно было воссоздать уличный датчик для метеостанции взамен пропавшего(( Из разного найденного в интернете этот проект работает с моей станцией Орегон (спасибо автору). В понедельник попробую последовать Вашему совету. Но все равно куча непоняток  как блин это работает)) Если дело в неправильной отправки команды, то как на это влияет подключение датчика температуры? Если совсем не подключать таймер, то передача идет один раз (как и прописано в программе), станция принимает и отображает, но минут через сколько-то естественно станция уже ни чего не показывает, но с таймером питание полностью не пропадает с ардуинки, но передача сигнала каким-то образом работает по таймеру.  В моем понимании данная команда подается один раз потому, что таймер должен отключать питание МК после передачи сигнала и каждые 43 сек снова подавать питание (так того требует станция).  Ардуино передает показания температуры отключается полностью и 43 секунды мк не работает.  Сейчас у меня питание пока сделано на подпитке от солнечной батареи, но пару пасмурных дней и аккумулятор съедается до отключения(
×
×
  • Создать...