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

Cmsis Vs Stdperiph, Мнение.


Liyboputnui

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

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

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

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

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

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

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

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

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

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

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

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 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 недели спустя...

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

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

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

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

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

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

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

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

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

вот еще делать нечего тупые инитки руками писать. Для этого придумали 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 пользователей онлайн

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