Кто всю эту хрень прочитал и хоть чего-нибудь понял, тот молодец. :)
Вещь хорошая и нужная. Вопрос: как быть со спецификой камней? В ардуине, как вы знаете - под все используемые камни директивами препроцессора решается. Вот что-то бы подобное под STM было бы - цены бы ему не было.
Скажу за себя: вот прямо сейчас есть задача под STM8L написать прошивку, но - вообще не знаю, с какой стороны подступиться, именно из-за зубодробительности. Кстати, пользуясь случаем: может, пнёте в нужном направлении? Надо на одной ноге частотомер сделать (мерять частоту входящего сигнала), с другой - мерять напряжение. С чего начать, собственно? Пните плз деревянного по уши, чтобы полетел в нужное русло.
Тут специфика STM8S никак не сказывается, т.к. режимы пинов на всей серии выставляются одинаково, т.е. тремя битами в трех регистрах. Прерывания, правда, нужно еще отдельно конфигурить в другом месте, но это тоже не очень сложно. С другой стороны, у STM8S наиболее интересны только младшие модели, т.ч. потребности учитывать такой спектр, как у атмеги, просто не ожидается.
Частоту измерять удобно таймером в режиме захвата. Тут и с мегой особой разницы нет. Зато результаты на STM8L можно оттаскивать с помощю DMA, что от таймера, что от АЦП, тем самым снижая нагрузку на ядро. Половину времени, а то и больше, пока идет процесс измерений, можно вообще ядро в сон класть с пробуждением по факту получения результата. Ядро жрет дофига и в плане снижения энергопотребления этот прием весьма эффективен.
А вообще я бы посоветовал вам развернуть какой-нибудь ИАР, набросать код мигания диодом и описать весь процесс в отдельной теме, наподобие этой. Там бы и обсуждали по ходу возникновения вопросов. Просто давать правильные советы в неких абстрактных условиях довольно сложно, да и мешать в кучу STM8S и STM8L не совсем хорошо. Они хоть и сильно похожи друг на друга, но есть куча специфики для каждого семейства. Будет возникать путаница.
a5021 хорошо получилось, а можешь тоже самое, но сгрупировать, перечисли записи возможные для настройки пинов, управления и считывания, мини инструкция
Так там сверху есть все дифайны для конфигурирования и на вход и на выход. Какие нужно, те бери и добавляй. Самые часто употребимые комбинации битов сведены в дифайны INPUT_MODE и OUTPUT_MODE. Никто не мешает добавить свои, если условия требуют.
Идея то в чем заключалась: режим выставлять набором нужных слагаемых.
Для входа:
INPUT [+PULL_UP или +FLOAT] [+INT или +NO_INT]
для выхода:
OUTPUT [+PUSH_PULL или +OPEN_DRAIN] [+HIGH_SPEED или +LOW_SPEED]
Из заключенного в квардатные скобки можно выбрать или что-то одно или совсем ничего. Совсем ничего будет эквивалентно выбору слагаемого, находящегося в правой части пары.
Имя порта при использовании макроса нужно указывать одной заглавной буквой. Причем, это именно буква, а не дифайн, переменная или константа.
А5021, советую присмотреться к этому подходу созджания сложных #define в т.ч. с оператором ## в реализации arhat.h. Там недаром сделано 2 уровня определений, потому что вызов вашего макроса с указанием в параметрах другого макроса приведет к очень "неожиданным результатам", ибо оператор ## блокирует разворачивание макроса из параметров. в общем, оно "работает" до поры до времени ..
Я этот момент уже кратко оговорил в последнем абзаце предыдущего своего сообщения. Если вы настаиваете, могу дать развернутое пояснение:
- первые два параметра макроса должны быть только литералами. Под литералами здесь нужно понимать значения, состоящие из одной заглавной буквы латинского алфавита на верхнем регистре от A до D для первого параметра (имя порта) и одной цифры от 0 до 7 для второго параметра (номер пина). Указание первых двух параметров иным способом недопустимо.
на третий параметр данные ограничения не действуют и он может быть представлен любым корректным с точки зрения синтаксиса языка Си способом.
Подобных обёрток в инете хоть пруд пруди и каждая по своему. Хочется абстракции, тогда уже проще на СПЛ мутить, там хоть какая-то унификация. А так, чтобы не изобретать очередной велосипед, проще писать как есть.
С местом вообще вопрос малосущественный. Ну будет по три BSET/BRES на конфигурацию каждого пина, да и фиг с ним. Сколько там тех пинов, в конце концов.
Запись "как есть" страдает плохой читабельностью и не наглядна. Вы привели простой пример, где все пины выставляются одинаково. Нарисуйте тем же способом более сложную инициализацию и убедитесь, что там начинает образовываться каша. Потом можете сравнить:
a5021 если ты уже оформил хедер поделись пожалуйста попробовать. кроме управления пинами и настройки пинов что нибудь еще добавлял?
ssss если есть твой вариант прошу тоже поделится
ssss лично меня унификация не интересует совсем, я других камней использовать не планирую, нужен удобный хедер только для stm8s103f3p6. если понадобится stm32 можно взять STM32F103C8T6. уже все написано. все равно плюсы других камней, и даже этих раскроются только при более глубоком знании микроконтроллеров. лично моя цель не изучить максимально микроконтроллер, или написать универсальный хедер. нет. главное удобство и простота, и чтобы сразу делать устройство, не тратя время на долгое курение даташита. если так глубоко влезать то можно сделать отличный хедер, но ни одного устройства)) тут не вопрос экономии байтов, а времени. надеюсь ты меня понял
a5021 если ты уже оформил хедер поделись пожалуйста попробовать. кроме управления пинами и настройки пинов что нибудь еще добавлял?
Нет, я только за пины сподобился. Причем, ничего отдельно не оформлял. Просто вставил блок дифайнов в рабочий код и там откатал. В принципе, оформить отдельным заголовочным файлом ведь не сложно. Давай положу тут, пусть лежит, мож и мне когда понадобиться, если свой потеряю.
#ifndef __PINDEF_INCLUDED
#define __PINDEF_INCLUDED
//
// definitions to configure a pin in input mode
//
#define INPUT 0
#define FLOAT 0
#define PULL_UP (1 << 1)
#define NO_INT 0
#define INT (1 << 0)
// most common pin settings for input mode
#define INPUT_MODE PULL_UP
//
// definitions to configure a pin in output mode
//
#define OUTPUT (1 << 2)
#define OPEN_DRAIN 0
#define PUSH_PULL (1 << 1)
#define LOW_SPEED 0
#define HIGH_SPEED (1 << 0)
// most common pin settings for output mode
#define OUTPUT_MODE OUTPUT + PUSH_PULL + HIGH_SPEED
//
// pin state
//
#define LOW 0
#define HIGH 1
// macro to configure a pin
#define PIN_MODE(PORT, PIN, MODE)\
P##PORT##_DDR_DDR##PIN = (MODE) >> 2;\
P##PORT##_CR1_C1##PIN = ((MODE) >> 1) & 1;\
P##PORT##_CR2_C2##PIN = (MODE) & 1
// macro to set a pin
#define PIN_WRITE(PORT, PIN, VALUE)\
P##PORT##_ODR_ODR##PIN = VALUE
// macro to get state of a pin
#define PIN_READ(PORT, PIN)\
P##PORT##_IDR_IDR##PIN
#endif
Сохранить под именем pindef.h и подключать, соответствено, тоже
если вечером еще будут силы попробую. настройка получается полная, в принципе тоже удобно, немного запоминать, даже запоминать необязательно, все равно хедер открыт всегда
лично моя цель не изучить максимально микроконтроллер, или написать универсальный хедер. нет. главное удобство и простота, и чтобы сразу делать устройство, не тратя время на долгое курение даташита.
Тогда вам эти хедеры и макросы и не нужны, совсем. Для СТМ8 - СПЛ, для СТМ32 - ХАЛ или ардуина. И время зря тратить не нужно на всякие глупости.
С местом вообще вопрос малосущественный. Ну будет по три BSET/BRES на конфигурацию каждого пина, да и фиг с ним. Сколько там тех пинов, в конце концов.
Может быть. Но часто с вопросом места идёт и вопрос скорости выполнения кода.
Цитата:
Запись "как есть" страдает плохой читабельностью и не наглядна. Вы привели простой пример, где все пины выставляются одинаково. Нарисуйте тем же способом более сложную инициализацию и убедитесь, что там начинает образовываться каша.
Каша начнётся, когда к пинам добавятся попытки подобного оформления СПИ, ТИМ или И2Ц. Всех вариантов оно не покроет и придётся возвращаться к регистрам.
Можно привести и другой пример. Это из майна реальной проги.
Init_TIM1();
Init_TIM2();
Init_TIM3();
Init_TIM4();
rim();
Ничего лишнего, уровень абстракции достаточно высок. Можно ещё увеличить до
Init_TIM_all();
rim();
Но это хорошо когда всё работает, да и для майна больше и не надо. В случае же выявления ошибок и учитывая относительную сложность периферии всё равно придётся спускаться до регистров и битов. И вот здесь чем больше накручено, тем труднее докопаться до истины. Не зря же у многих отладка в СПЛ и ХАЛ просто вызывает шок. Да и мнение "макросы это зло" тоже не на ровном месте образовалось.
ну может я не так понял. это то о чем ты говоришь?
Я давно перестал отслеживать подобное. Как только появились СТМ8 я тоже пытался что-то улучшить, а потом понял что всё это зря и пустая трата времени. Так можно улучшать до бесконечности. Гораздо важнее вникнуть в суть реализации алгоритма проги и юзанию железа по максимуму где это возможно.
Тогда вам эти хедеры и макросы и не нужны, совсем. Для СТМ8 - СПЛ, для СТМ32 - ХАЛ или ардуина. И время зря тратить не нужно на всякие глупости.
В последний раз мне куб сварил 14кб инициализации в исполняемых кодах для камня с 16кб флеша. Нажав на крест я вздохнул и подумал, как хорошо, что это все не у меня.
Понимание устройства SPL не проникает в голову самостоятельно в то время, когда человек спит. Один хрен надо разбираться, что там к чему. Это время. А учитывая, что будущее SPL как-то неожиданно стало пытаться растаять в тумане, время есть смысл пытаться использовать с большей пользой. Тем паче, что былая привлекательность SPL, когда декларировалась некая переносимость между STM8 и STM32, теперь вообще исчезла окончательно.
Может быть. Но часто с вопросом места идёт и вопрос скорости выполнения кода.
Скорости чего? Расставления ног при начальной инициализации? Вот же страсти вы рассказывать мастер.
Цитата:
Каша начнётся, когда к пинам добавятся попытки подобного оформления СПИ, ТИМ или И2Ц. Всех вариантов оно не покроет и придётся возвращаться к регистрам.
У спи и и2с всего несколько параметров, настойка которых покрывает большинство случаев осмысленного использования этих интерфейсов. Обертку написать -- никакой проблемы. С таймерами, разумеется вопрос сложнее.
Цитата:
Init_TIM1();
Init_TIM2();
Init_TIM3();
Init_TIM4();
rim();
Ничего лишнего, уровень абстракции достаточно высок.
Капец! Это вообще о чем было? В таком ключе я могу описать фантазию, как я в одиночку одолел звезду смерти.
Цитата:
Не зря же у многих отладка в СПЛ и ХАЛ просто вызывает шок.
Ничего там не вызывает. Я даже как-то пару раз специально компилировал инициализации из под куба, чтобы в отладчике посмотреть, куда они там чего пишут, дабы по референсу лишний раз не шастать.
a5021 и ssss может хватит. будьте терпимее друг к другу. никто и мысли из вас как будто и не допускает о другом мнении и решении. каждое решение правильное, к тому же на вкус и цвет
да я лучше промечу тему как спам, сначала сохранив важную инфу. у них уже есть одна тема, и тот разговор начинает переходить сюда. им бы посидеть, водочки попить, может подраться
В последний раз мне куб сварил 14кб инициализации в исполняемых кодах для камня с 16кб флеша. Нажав на крест я вздохнул и подумал, как хорошо, что это все не у меня.
Ващета, СТМ для малых камней СТМ32Ф0ХХ и СТМ32Л организовала сниппетсы. А для больших камней, где ЮСБ и прочее, "16кб флеша" уже не имеют никакого значения. Так или иначе, КУБ и ХАЛ есть и юзается народом, а на СПЛе СТМ поставила крест.
Цитата:
Понимание устройства SPL не проникает в голову самостоятельно в то время, когда человек спит. Один хрен надо разбираться, что там к чему. Это время. А учитывая, что будущее SPL как-то неожиданно стало пытаться растаять в тумане, время есть смысл пытаться использовать с большей пользой. Тем паче, что былая привлекательность SPL, когда декларировалась некая переносимость между STM8 и STM32, теперь вообще исчезла окончательно.
Давайте прямо, что ближе к ардуине, СПЛ или самописные велосипеды, которые магическим образом изменяют геометрию колёс на ходу?
сделал печатку, на плате stm8 и uln2003. запаял stm быстро, никаких особых проблемм. но после нее so16 было как слишком просто, как будто километр между ногами))
Building configuration: Blink - Debug
Updating build tree...
main.c
iccstm8.exe C:\Yandexdisk\IAR\STM8S_blink\main.c -e -Ol --no_cse --no_unroll --no_inline --no_code_motion --no_tbaa
--no_cross_call --debug --code_model small --data_model medium -o C:\Yandexdisk\IAR\STM8S_blink\Debug\Obj --dlib_config D:\
IAR_STM8\stm8\LIB\dlstm8smn.h --vregs 16
IAR C/C++ Compiler V2.20.1.176 for STM8
Copyright 2010-2015 IAR Systems AB.
Standalone license - IAR Embedded Workbench for STMicroelectronics STM8, 8K KickStart Edition 2.20
Error[Pe017]: expected a "]" C:\Yandexdisk\IAR\STM8S_blink\main.c 5
Error[Pe040]: expected an identifier C:\Yandexdisk\IAR\STM8S_blink\main.c 5
Error[Pe146]: too many initializer values C:\Yandexdisk\IAR\STM8S_blink\main.c 7
Warning[Pe174]: expression has no effect C:\Yandexdisk\IAR\STM8S_blink\main.c 30
Warning[Pe174]: expression has no effect C:\Yandexdisk\IAR\STM8S_blink\main.c 32
Warning[Pe174]: expression has no effect C:\Yandexdisk\IAR\STM8S_blink\main.c 34
Warning[Pe174]: expression has no effect C:\Yandexdisk\IAR\STM8S_blink\main.c 36
Warning[Pe223]: function "__delay_cycles" declared implicitly C:\Yandexdisk\IAR\STM8S_blink\main.c 38
Error[Pe067]: expected a "}" C:\Yandexdisk\IAR\STM8S_blink\main.c 41
Errors: 4
Warnings: 5
Error while running C/C++ Compiler
Total number of errors: 4
Total number of warnings: 5
шаговый мотор 28BYJ-48. шпилька М5 и длинная гайка М5
гайка забивается в толкатель. переходник забивается на мотор, в переходнике я нарезал резьбу и промазал клеем. можно просто не нарезая резьбу врезать шпильку, проклеивать тогда не понадобится
Приветствую участников форума, вопрос по стандартной библиотеке стм есть, может кто подскажет. Хочу в программе сделать запись "#define RS номер бита регистра ODR GPIOC номер 3" для стандартной библиотеке . В библиотеке IAR много примеров и все просто "#define RS PC_ODR_bit.ODR3". Сама запись получается, но на переменную RS программа ругается. Не могу понять как в стандартной библиотеке обозначить номер бита. Пробовал в программе в другом месте такую запись GPIOB->ODR_BITS.bit4=1 , тоже программа ругается, работает только GPIOB->ODR |= GPIO_DDR_4. Заранее спасибо
Народ, сорри за некропостинг - но интересно продолжить тему. Вижу, что большинство участников ветки еще на форуме.
Вот такой вопрос - а что уважаемые используют в STM8 вместо millis ? - я понимаю, что очевидный путь - завести свой миллисекундный счетчик на любом из таймеров. Но может в СТМ есть какой-то другой вариант, про который я не в курсе?
а что уважаемые используют в STM8 вместо millis ? - я понимаю, что очевидный путь - завести свой миллисекундный счетчик на любом из таймеров. Но может в СТМ есть какой-то другой вариант, про который я не в курсе?
А что это такое... millis ??? Если нужны обычные тормозные задержки... то пофигу на чём и как... Можно ТИМ4 заюзать... он самый беспонтовый... Всякие фишки и протоколы предпочитаю юзать на таймерах... полуаппаратно...
А что это такое... millis ??? Если нужны обычные тормозные задержки... то пофигу на чём и как...
тормозные задержки можно и на пустом цикле делать, как в примерах ИАР-а.
миллис - счетчик, увеливающийся на 1 каждум миллисекунду, им удобно отмерять относительно большие задержки, для которых аппаратные таймеры слишком быстрые
А миллис в ардуине на чём сделан... на таймере??? Значит уже ответил... на беспонтовом ТИМ4... в прескалер 128... в регистр перезагрузки 124 (125 - 1)... прерывание через 1мС будет...
Как в ST Visual Develop посмотреть получившийся после компиляции размер кода и занятое место в памяти? - ну типа как Ардуино ИДЕ пишет в конце компиляции?
Как в ST Visual Develop посмотреть получившийся после компиляции размер кода и занятое место в памяти? - ну типа как Ардуино ИДЕ пишет в конце компиляции?
Скажите, это нормально, что бинарник, скомпилированный STDV Develop (через STD Periph Driver) занимает втрое больше места, чем этот же код от IAR с ИАРовскими хедерами? Дебаг и там и там включен, впрочем в Релизе соотношение такое же.
Код не сложный совсем, блинк на прерывании TIM4 и вывод в сериал.
STDV Develop - 3233 bytes
IAR 1322 bytes
Или я что-то не так делаю? - заметил, что в STDV Develop одна только минимальная настройка системного клока сразу отжирает 1000 байт:
CLK_DeInit();
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);
CLK_SYSCLKConfig(CLK_PRESCALER_HSIDIV1); // set 16 MHz for CPU
Кто всю эту хрень прочитал и хоть чего-нибудь понял, тот молодец. :)
Вещь хорошая и нужная. Вопрос: как быть со спецификой камней? В ардуине, как вы знаете - под все используемые камни директивами препроцессора решается. Вот что-то бы подобное под STM было бы - цены бы ему не было.
Скажу за себя: вот прямо сейчас есть задача под STM8L написать прошивку, но - вообще не знаю, с какой стороны подступиться, именно из-за зубодробительности. Кстати, пользуясь случаем: может, пнёте в нужном направлении? Надо на одной ноге частотомер сделать (мерять частоту входящего сигнала), с другой - мерять напряжение. С чего начать, собственно? Пните плз деревянного по уши, чтобы полетел в нужное русло.
Тут специфика STM8S никак не сказывается, т.к. режимы пинов на всей серии выставляются одинаково, т.е. тремя битами в трех регистрах. Прерывания, правда, нужно еще отдельно конфигурить в другом месте, но это тоже не очень сложно. С другой стороны, у STM8S наиболее интересны только младшие модели, т.ч. потребности учитывать такой спектр, как у атмеги, просто не ожидается.
Частоту измерять удобно таймером в режиме захвата. Тут и с мегой особой разницы нет. Зато результаты на STM8L можно оттаскивать с помощю DMA, что от таймера, что от АЦП, тем самым снижая нагрузку на ядро. Половину времени, а то и больше, пока идет процесс измерений, можно вообще ядро в сон класть с пробуждением по факту получения результата. Ядро жрет дофига и в плане снижения энергопотребления этот прием весьма эффективен.
А вообще я бы посоветовал вам развернуть какой-нибудь ИАР, набросать код мигания диодом и описать весь процесс в отдельной теме, наподобие этой. Там бы и обсуждали по ходу возникновения вопросов. Просто давать правильные советы в неких абстрактных условиях довольно сложно, да и мешать в кучу STM8S и STM8L не совсем хорошо. Они хоть и сильно похожи друг на друга, но есть куча специфики для каждого семейства. Будет возникать путаница.
a5021 хорошо получилось, а можешь тоже самое, но сгрупировать, перечисли записи возможные для настройки пинов, управления и считывания, мини инструкция
Так там сверху есть все дифайны для конфигурирования и на вход и на выход. Какие нужно, те бери и добавляй. Самые часто употребимые комбинации битов сведены в дифайны INPUT_MODE и OUTPUT_MODE. Никто не мешает добавить свои, если условия требуют.
Идея то в чем заключалась: режим выставлять набором нужных слагаемых.
Для входа:
INPUT [+PULL_UP или +FLOAT] [+INT или +NO_INT]
для выхода:
OUTPUT [+PUSH_PULL или +OPEN_DRAIN] [+HIGH_SPEED или +LOW_SPEED]
Из заключенного в квардатные скобки можно выбрать или что-то одно или совсем ничего. Совсем ничего будет эквивалентно выбору слагаемого, находящегося в правой части пары.
Имя порта при использовании макроса нужно указывать одной заглавной буквой. Причем, это именно буква, а не дифайн, переменная или константа.
А5021, советую присмотреться к этому подходу созджания сложных #define в т.ч. с оператором ## в реализации arhat.h. Там недаром сделано 2 уровня определений, потому что вызов вашего макроса с указанием в параметрах другого макроса приведет к очень "неожиданным результатам", ибо оператор ## блокирует разворачивание макроса из параметров. в общем, оно "работает" до поры до времени ..
Я этот момент уже кратко оговорил в последнем абзаце предыдущего своего сообщения. Если вы настаиваете, могу дать развернутое пояснение:
- первые два параметра макроса должны быть только литералами. Под литералами здесь нужно понимать значения, состоящие из одной заглавной буквы латинского алфавита на верхнем регистре от A до D для первого параметра (имя порта) и одной цифры от 0 до 7 для второго параметра (номер пина). Указание первых двух параметров иным способом недопустимо.
на третий параметр данные ограничения не действуют и он может быть представлен любым корректным с точки зрения синтаксиса языка Си способом.
Подобных обёрток в инете хоть пруд пруди и каждая по своему. Хочется абстракции, тогда уже проще на СПЛ мутить, там хоть какая-то унификация. А так, чтобы не изобретать очередной велосипед, проще писать как есть.
GPIOB->DDR |= GPIO_DDR_0 | GPIO_DDR_1 | GPIO_DDR_2; // Output mode
GPIOB->CR1 |= GPIO_CR1_0 | GPIO_CR1_1 | GPIO_CR1_2; // Push-pull
GPIOB->CR2 |= GPIO_CR2_0 | GPIO_CR2_1 | GPIO_CR2_2; // Output speed up to 10 MHz
GPIOB->ODR = 0;
Оно и места в памяти меньше отъедает.
С местом вообще вопрос малосущественный. Ну будет по три BSET/BRES на конфигурацию каждого пина, да и фиг с ним. Сколько там тех пинов, в конце концов.
Запись "как есть" страдает плохой читабельностью и не наглядна. Вы привели простой пример, где все пины выставляются одинаково. Нарисуйте тем же способом более сложную инициализацию и убедитесь, что там начинает образовываться каша. Потом можете сравнить:
a5021 если ты уже оформил хедер поделись пожалуйста попробовать. кроме управления пинами и настройки пинов что нибудь еще добавлял?
ssss если есть твой вариант прошу тоже поделится
ssss лично меня унификация не интересует совсем, я других камней использовать не планирую, нужен удобный хедер только для stm8s103f3p6. если понадобится stm32 можно взять STM32F103C8T6. уже все написано. все равно плюсы других камней, и даже этих раскроются только при более глубоком знании микроконтроллеров. лично моя цель не изучить максимально микроконтроллер, или написать универсальный хедер. нет. главное удобство и простота, и чтобы сразу делать устройство, не тратя время на долгое курение даташита. если так глубоко влезать то можно сделать отличный хедер, но ни одного устройства)) тут не вопрос экономии байтов, а времени. надеюсь ты меня понял
Нет, я только за пины сподобился. Причем, ничего отдельно не оформлял. Просто вставил блок дифайнов в рабочий код и там откатал. В принципе, оформить отдельным заголовочным файлом ведь не сложно. Давай положу тут, пусть лежит, мож и мне когда понадобиться, если свой потеряю.
Сохранить под именем pindef.h и подключать, соответствено, тоже
если вечером еще будут силы попробую. настройка получается полная, в принципе тоже удобно, немного запоминать, даже запоминать необязательно, все равно хедер открыт всегда
лично моя цель не изучить максимально микроконтроллер, или написать универсальный хедер. нет. главное удобство и простота, и чтобы сразу делать устройство, не тратя время на долгое курение даташита.
Тогда вам эти хедеры и макросы и не нужны, совсем. Для СТМ8 - СПЛ, для СТМ32 - ХАЛ или ардуина. И время зря тратить не нужно на всякие глупости.
ну может я не так понял. это то о чем ты говоришь?
а инструкции на русском к этому делу есть?)))
С местом вообще вопрос малосущественный. Ну будет по три BSET/BRES на конфигурацию каждого пина, да и фиг с ним. Сколько там тех пинов, в конце концов.
Может быть. Но часто с вопросом места идёт и вопрос скорости выполнения кода.
Запись "как есть" страдает плохой читабельностью и не наглядна. Вы привели простой пример, где все пины выставляются одинаково. Нарисуйте тем же способом более сложную инициализацию и убедитесь, что там начинает образовываться каша.
Каша начнётся, когда к пинам добавятся попытки подобного оформления СПИ, ТИМ или И2Ц. Всех вариантов оно не покроет и придётся возвращаться к регистрам.
Можно привести и другой пример. Это из майна реальной проги.
Init_TIM1();
Init_TIM2();
Init_TIM3();
Init_TIM4();
rim();
Ничего лишнего, уровень абстракции достаточно высок. Можно ещё увеличить до
Init_TIM_all();
rim();
Но это хорошо когда всё работает, да и для майна больше и не надо. В случае же выявления ошибок и учитывая относительную сложность периферии всё равно придётся спускаться до регистров и битов. И вот здесь чем больше накручено, тем труднее докопаться до истины. Не зря же у многих отладка в СПЛ и ХАЛ просто вызывает шок. Да и мнение "макросы это зло" тоже не на ровном месте образовалось.
ну может я не так понял. это то о чем ты говоришь?
Я давно перестал отслеживать подобное. Как только появились СТМ8 я тоже пытался что-то улучшить, а потом понял что всё это зря и пустая трата времени. Так можно улучшать до бесконечности. Гораздо важнее вникнуть в суть реализации алгоритма проги и юзанию железа по максимуму где это возможно.
да что есть. не подскажешь где почитать как этим пользоваться? хоть какая нибудь инструкция, пример
Не подскажу. СПЛом никогда не пользовался и русскоязычной лит-рой тоже.
В последний раз мне куб сварил 14кб инициализации в исполняемых кодах для камня с 16кб флеша. Нажав на крест я вздохнул и подумал, как хорошо, что это все не у меня.
Понимание устройства SPL не проникает в голову самостоятельно в то время, когда человек спит. Один хрен надо разбираться, что там к чему. Это время. А учитывая, что будущее SPL как-то неожиданно стало пытаться растаять в тумане, время есть смысл пытаться использовать с большей пользой. Тем паче, что былая привлекательность SPL, когда декларировалась некая переносимость между STM8 и STM32, теперь вообще исчезла окончательно.
Скорости чего? Расставления ног при начальной инициализации? Вот же страсти вы рассказывать мастер.
У спи и и2с всего несколько параметров, настойка которых покрывает большинство случаев осмысленного использования этих интерфейсов. Обертку написать -- никакой проблемы. С таймерами, разумеется вопрос сложнее.
Init_TIM2();
Init_TIM3();
Init_TIM4();
rim();
Ничего лишнего, уровень абстракции достаточно высок.
Капец! Это вообще о чем было? В таком ключе я могу описать фантазию, как я в одиночку одолел звезду смерти.
Ничего там не вызывает. Я даже как-то пару раз специально компилировал инициализации из под куба, чтобы в отладчике посмотреть, куда они там чего пишут, дабы по референсу лишний раз не шастать.
a5021 и ssss может хватит. будьте терпимее друг к другу. никто и мысли из вас как будто и не допускает о другом мнении и решении. каждое решение правильное, к тому же на вкус и цвет
да я лучше промечу тему как спам, сначала сохранив важную инфу. у них уже есть одна тема, и тот разговор начинает переходить сюда. им бы посидеть, водочки попить, может подраться
Чего хватит? Я вообще-то вполне серьезные и содержательные вещи говорю.
я не говорю о смысле, я говорю о том как
В последний раз мне куб сварил 14кб инициализации в исполняемых кодах для камня с 16кб флеша. Нажав на крест я вздохнул и подумал, как хорошо, что это все не у меня.
Ващета, СТМ для малых камней СТМ32Ф0ХХ и СТМ32Л организовала сниппетсы. А для больших камней, где ЮСБ и прочее, "16кб флеша" уже не имеют никакого значения. Так или иначе, КУБ и ХАЛ есть и юзается народом, а на СПЛе СТМ поставила крест.
Понимание устройства SPL не проникает в голову самостоятельно в то время, когда человек спит. Один хрен надо разбираться, что там к чему. Это время. А учитывая, что будущее SPL как-то неожиданно стало пытаться растаять в тумане, время есть смысл пытаться использовать с большей пользой. Тем паче, что былая привлекательность SPL, когда декларировалась некая переносимость между STM8 и STM32, теперь вообще исчезла окончательно.
Давайте прямо, что ближе к ардуине, СПЛ или самописные велосипеды, которые магическим образом изменяют геометрию колёс на ходу?
есть требования к разводке для stm8s103f3p6? там вроде дополнительные кондесаторы по питанию должны быть
Требования типовые, как и к другим МК.
Есть апнота
AN2860 Application note
EMC guidelines for STM8 microcontrollers
спасибо. нашел сборник ссылок по stm8
может скинешь пример, чтобы с нуля не разводить
вот кстати одна картинка. из конденсаторов понял минимум 2 конденсатора vcap-vss и vdd-vss
спасибо. нашел сборник ссылок по stm8
Ностальжи! "Да, были люди в наше время..."(с).
Там ещё одна интересная темка есть для почитать.
http://kazus.ru/forums/showthread.php?t=20861
вот кстати одна картинка. из конденсаторов понял минимум 2 конденсатора vcap-vss и vdd-vss
СТМ рекомендует ещё и на РЕСЕТ конденсатор ставить.
почитаю завтра. поздно уже. по разводке кое что набросал. необходимый минимум
сделал печатку, на плате stm8 и uln2003. запаял stm быстро, никаких особых проблемм. но после нее so16 было как слишком просто, как будто километр между ногами))
можете объяснить в чем ошибка. не понял
ошибки
ему почему то не нравится запись:
такое только на ардуине прокатывает чтоли?
действительно неправильно объявил массив. спасибо
я делаю дозатор для паяльной пасты. допилить код времени нет, выкладываю пока модели
https://yadi.sk/d/sulg8jcotnHdB
шаговый мотор 28BYJ-48. шпилька М5 и длинная гайка М5
гайка забивается в толкатель. переходник забивается на мотор, в переходнике я нарезал резьбу и промазал клеем. можно просто не нарезая резьбу врезать шпильку, проклеивать тогда не понадобится
Приветствую участников форума, вопрос по стандартной библиотеке стм есть, может кто подскажет. Хочу в программе сделать запись "#define RS номер бита регистра ODR GPIOC номер 3" для стандартной библиотеке . В библиотеке IAR много примеров и все просто "#define RS PC_ODR_bit.ODR3". Сама запись получается, но на переменную RS программа ругается. Не могу понять как в стандартной библиотеке обозначить номер бита. Пробовал в программе в другом месте такую запись GPIOB->ODR_BITS.bit4=1 , тоже программа ругается, работает только GPIOB->ODR |= GPIO_DDR_4. Заранее спасибо
Народ, сорри за некропостинг - но интересно продолжить тему. Вижу, что большинство участников ветки еще на форуме.
Вот такой вопрос - а что уважаемые используют в STM8 вместо millis ? - я понимаю, что очевидный путь - завести свой миллисекундный счетчик на любом из таймеров. Но может в СТМ есть какой-то другой вариант, про который я не в курсе?
а что уважаемые используют в STM8 вместо millis ? - я понимаю, что очевидный путь - завести свой миллисекундный счетчик на любом из таймеров. Но может в СТМ есть какой-то другой вариант, про который я не в курсе?
А что это такое... millis ??? Если нужны обычные тормозные задержки... то пофигу на чём и как... Можно ТИМ4 заюзать... он самый беспонтовый... Всякие фишки и протоколы предпочитаю юзать на таймерах... полуаппаратно...
А что это такое... millis ??? Если нужны обычные тормозные задержки... то пофигу на чём и как...
тормозные задержки можно и на пустом цикле делать, как в примерах ИАР-а.
миллис - счетчик, увеливающийся на 1 каждум миллисекунду, им удобно отмерять относительно большие задержки, для которых аппаратные таймеры слишком быстрые
А миллис в ардуине на чём сделан... на таймере??? Значит уже ответил... на беспонтовом ТИМ4... в прескалер 128... в регистр перезагрузки 124 (125 - 1)... прерывание через 1мС будет...
Добрый день!
Как в ST Visual Develop посмотреть получившийся после компиляции размер кода и занятое место в памяти? - ну типа как Ардуино ИДЕ пишет в конце компиляции?
Как в ST Visual Develop посмотреть получившийся после компиляции размер кода и занятое место в памяти? - ну типа как Ардуино ИДЕ пишет в конце компиляции?
Отвечаю сам - нужно включить в опциях линкера генерацию .map файла, как описано в конце вот этого мануала: st-visual-develop-ide-sreda-dlya-programmirovaniya-stm8
Информация в файле, правда. не слишком наглядная - но можно написать свой парсер, как пример вот: http://ziblog.ru/2011/09/29/formatirovanie-informatsii-o-razmerah-sektsiy-cosmic.html
Jeka, спасибо огромное, одновременно ответили :)
продолжаю мучать stm8s103
Скажите, это нормально, что бинарник, скомпилированный STDV Develop (через STD Periph Driver) занимает втрое больше места, чем этот же код от IAR с ИАРовскими хедерами? Дебаг и там и там включен, впрочем в Релизе соотношение такое же.
Код не сложный совсем, блинк на прерывании TIM4 и вывод в сериал.
STDV Develop - 3233 bytes
IAR 1322 bytes
Или я что-то не так делаю? - заметил, что в STDV Develop одна только минимальная настройка системного клока сразу отжирает 1000 байт: