Liyboputnui Опубликовано 13 июня, 2016 Поделиться Опубликовано 13 июня, 2016 Доброго всем времени суток. Хочу освоить STM32, уже начитался много чего в интернете и умею моргать светодиодом для STM32F1. У меня такой вопрос, какую библиотеку лучше использовать для программирования STM32, стандартную CMSIS или StdPeriph. Насчет StdPeriph узнал с форумов что есть куча багов и код медленный, это не по детски настораживает. Также встречал мнения что используя CMSIS жизни не хватит чтоб прогу написать. Как вы сами поступаете, что используете? Заранее спасибо. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
elki Опубликовано 13 июня, 2016 Поделиться Опубликовано 13 июня, 2016 Даташит и ассемблер если хочется скорости. Мигать светодиодом можно и SPL, теперь уже куб и HAL. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
mvkarp Опубликовано 13 июня, 2016 Поделиться Опубликовано 13 июня, 2016 Машинные коды - самый продвинутый инструмент для любых ядер. Если лень изучать или нет времени на разработку своих библиотек - нефиг и вопросы задавать. Ибо ответы на них примерно равнозначны. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
mail_robot Опубликовано 14 июня, 2016 Поделиться Опубликовано 14 июня, 2016 (изменено) лично я использую 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 каналов АЦП. Оба работают, оба одинаково шустро ). Разница только в том, что во втором случае создается хэндлер, который делает работу со всей структурой АЦП очень удобной, а в первой такого дела нет. И во втором случае можно проверить успешность каждого события и обработать ошибку вовремя, если к примеру ты забыл чтото затактировать, но пытаешься запустить. Выглядит конечно громоздко по сравнению с цмсис, но работает гораздо надежнее и совсем не "медленно" Изменено 14 июня, 2016 пользователем mail_robot 1 Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух Ссылка на комментарий Поделиться на другие сайты Поделиться
Добрячок Опубликовано 10 июля, 2016 Поделиться Опубликовано 10 июля, 2016 оба этих кода делают одно и то же - конфигурируют 5 каналов АЦП. Оба работают, оба одинаково шустро ). Разница только в том, что во втором случае создается хэндлер, который делает работу со всей структурой АЦП очень удобной, а в первой такого дела нет. И во втором случае можно проверить успешность каждого события и обработать ошибку вовремя, если к примеру ты забыл чтото затактировать, но пытаешься запустить. Выглядит конечно громоздко по сравнению с цмсис, но работает гораздо надежнее и совсем не "медленно" Скажите пожалуйста, а второй код, по ХАЛ который, вы сами пишете обычно ? С библиотекой СТД понятно, код инициализации ни в какой графической аппликации сгенерировать невозможно вообще никак - надо писать самому. А вот с ХАЛ все эти сложные инициализации можно сгенерировать в КубеМХ и все ? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
mail_robot Опубликовано 11 июля, 2016 Поделиться Опубликовано 11 июля, 2016 (изменено) вот еще делать нечего тупые инитки руками писать. Для этого придумали CubeMX. Мощнейший генератор кода для иниток. В очень очень редких случаях немного правлю под себя, но такие разы можно по пальцам сосчитать. Рабочий код уже ессно ручками и тоже на ХАЛ. Если уж взялся все на нем, то мешать некрасиво Там все просто - создаете конфигурацию устройства (входы/выходы/таймера/цап/ацп/шины), потом задаете настройки тактового генератора, потом конфигурируете блоки (там надо немного мозга). Жмем сгенерить проект и получаем готовый проект с прикрепленными библиотеками и модулями под выбранную среду. Скелет проекта. Потом добавляем в него рабочий код и получаем собственно готовую программу. Если правильно все настроить в кубе, то к иниткам руками добавлять уже ничего не приходится. А писать их вручную слишком трудоемко и чревато ошибками. Иниточный код выполняется только раз, так что какой бы он ни был огромный на быстродействие модулей в целом не влияет никак. А вот основную прогу будьте любезны уже писать вдумчиво и аккуратно. Но и там ХАЛ существенно экономит время и избавляет от массы ошибок. А если еще освоить RTOS то вообще кодинг превращается в чистое удовольствие Изменено 11 июля, 2016 пользователем mail_robot 0 Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух Ссылка на комментарий Поделиться на другие сайты Поделиться
Добрячок Опубликовано 14 июля, 2016 Поделиться Опубликовано 14 июля, 2016 mail_robot, Скажите, а вы для приема данных по УАРТ используете стандартные средства(функции) ХАЛ или какую-то свою заготовку ? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
mail_robot Опубликовано 15 июля, 2016 Поделиться Опубликовано 15 июля, 2016 Стандартные функции. О каких заготовках речь? 0 Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух Ссылка на комментарий Поделиться на другие сайты Поделиться
Добрячок Опубликовано 15 июля, 2016 Поделиться Опубликовано 15 июля, 2016 (изменено) Например, вот. Человек замутил свою функцию на передачу строки по УАРТ. Укоротил ХАЛовскую запись. Стандартный, любимый всеми printf. С приемом данных на ХАЛ тоже сурово выглядит для меня, пока что. Добавлено. Хотя, может это сейчас так кажется... На CCS C for PICs тоже будь здоров всего было: буфер чистить, флаг сбрасывать, а потом сразу ставить и все такое. Изменено 15 июля, 2016 пользователем Добрячок 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
mail_robot Опубликовано 15 июля, 2016 Поделиться Опубликовано 15 июля, 2016 (изменено) ну просто чувак обертку сделал, да и все. Причем отправка в тупую без ДМА. Это тормоз, так как пока не отправит процесс не освободит. Все это можно сделать гораздо умнее если заменить HAL_UART_Transmit на HAL_UART_Transmit_DMA а в колбэке поднимать флаг конца передачи. Но это вам судя по всему еще рановато. Хотя по скорости будет в 10 раз эффективнее. Там на самом деле все просто - при отправке по ДМА если вызвать следующую отправку, то они могут наложиться, так как функция передачи сразу же передает управление следующей за ней командой без ожидания самой отправки. Поэтому для вызова следующей отправки было бы неплохо проверить - а завершилась ли предыдущая. Для этого нужен ручной диспетчер (флаг). Его легко замутить используя колбэки (сигналы середины и конца передачи). Тогда все будет гладко и без наложений. То же самое прием - на DMA делается прием в полубуфер, и по каждому заполнению полубуфера производится обработка данных. Скорость приема до 3-х мегабит по уарту. Я все стараюсь делать на ДМА. Это процессор в процессоре, не использовать который весьма глупо. И порой его использование позволяет получать весьма элегантные почти аппаратные алгоритмы, которые разгружают ядро на 99%. Даже сбор данных с многоканального ацп и их оверсэмплинг с довольно высокими показателями сэмплирования (200-500, а порой и до 10000) без прерывания процесса ни на единый сэмпл Вообще для нормальной работы функционала HAL обычно вполне достаточно. В рабочих системах его очень хорошо дополняет RTOS. Вместе они создают идеальный диспетчер низкого и высокого уровня. Средний уровень (логику) формируем штатными средствами процедурного C. Такая связка дает идеальный набор инструментов для ARM без существенной потери производительности с очень высокой скоростью генерации рабочего кода и как следствие - сокращение затрат времени на разработку и количество скрытых ошибок То что я раньше на STD городил месяц, нынче делаю с нуля меньше чем за неделю. И прекрасно работает. А бывает что за час-полтора городится прога, которая запросто рулит тремя потоками данных (уарт) на прием и передачу, при этом использует одни и те же колбэки и потоки обработки данных без всяких тормозов. Вообще инструмент мощнейший. Рекомендую потратить время на изучение Изменено 15 июля, 2016 пользователем mail_robot 0 Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух Ссылка на комментарий Поделиться на другие сайты Поделиться
Добрячок Опубликовано 15 июля, 2016 Поделиться Опубликовано 15 июля, 2016 mail_robot, Спасибо за ваши ответы ! 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
mail_robot Опубликовано 15 июля, 2016 Поделиться Опубликовано 15 июля, 2016 обращайтесь. Чем смогу 0 Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух Ссылка на комментарий Поделиться на другие сайты Поделиться
fr0ster Опубликовано 23 августа, 2016 Поделиться Опубликовано 23 августа, 2016 Где найти доки на HAL? Отправлено с моего Che2-L11 через Tapatalk 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
mail_robot Опубликовано 23 августа, 2016 Поделиться Опубликовано 23 августа, 2016 На сайте st 0 Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.