Liyboputnui

Cmsis Vs Stdperiph, Мнение.

14 сообщений в этой теме

Liyboputnui    0

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

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
elki    76

Даташит и ассемблер если хочется скорости. Мигать светодиодом можно и SPL, теперь уже куб и HAL.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
mvkarp    3 757

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
mail_robot    1 407

лично я использую 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

Поделиться сообщением


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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
mail_robot    1 407

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

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

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

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

Поделиться сообщением


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

mail_robot,

Скажите, а вы для приема данных по УАРТ используете стандартные средства(функции) ХАЛ или какую-то свою заготовку ?

Поделиться сообщением


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

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

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

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

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

Добавлено.

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

Изменено пользователем Добрячок

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
mail_robot    1 407

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

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

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

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

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

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

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

Поделиться сообщением


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

Ваша публикация должна быть проверена модератором

Гость
Вы не авторизованы. Если у вас есть аккаунт, пожалуйста, войдите.
Ответить в тему...

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

  Разрешено не более 75 смайлов.

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

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

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

Загрузка...