реклама на сайте
подробности

 
 
> Библиотеки для STM32
juvf
сообщение Mar 3 2017, 02:54
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Где можно подчерпнуть библиотеку для процессора stm32L030?

Раньше библиотеки можно было скачать с сайта st.com
сейчас их там нет. например библиотека stm32f10x standard peripheral library была тут, сейчас там "SORRY, PAGE NOT FOUND". Что то поменялось у ST? Теперь библиотек нет? Или они их в куб убрали?
Go to the top of the page
 
+Quote Post
26 страниц V  « < 14 15 16 17 18 > »   
Start new topic
Ответов (225 - 239)
juvf
сообщение Apr 19 2017, 09:57
Сообщение #226


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Цитата(Reflector @ Apr 19 2017, 14:26) *
Если с парой светодиодов работать именно как с пинами, то нельзя их выставить в 0 одной командой. Будет две записи в BSRR, разница лишь в том, что для второго светодиода базовый адрес уже будет загружен и вместо 3 команд на ассме получим 2.
О чем вы? Как же нельзя?
Задача: допустим надо 0 и 6 выствить в "0", а 1 и 7 выставить в 1.
решение:
GPIOA->BSRR = GPIO_BSRR_BR0 | GPIO_BSRR_BR6 | GPIO_BSRR_BS1 | GPIO_BSRR_BS7;
Go to the top of the page
 
+Quote Post
Forger
сообщение Apr 19 2017, 10:01
Сообщение #227


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(juvf @ Apr 19 2017, 12:48) *
тот же кто напишет Pin.hpp

Вы не понимаете моего подхода (( Еще раз:
Pin.hpp написан и отлажен один раз, после этого отложен в общую библиотеку, закинут в отдельную SVN-базу, поставлен аттрибут "только для чтения", его не нужно править от проекта к проекту. Вообще.
А ваши initRedLed, ledRedOff, ledRedOn зависят от проекта, в котором используются. Теперь понятно?

Цитата
Есть 1Wire, програмный i2c, can.....
В одном и том же коде на одном пине все это может висеть по очереди? Вы об этом?
Если да, тут я бы использовал только класс Pin. Хотя впервые слышу о чем-то подобном ...

Цитата
я менял один бит в соответствующем регистре.

Мне до лампочки сколько там битов меняется, на производительности никак не сказывается. Проверено. Экономия на спичках.

Цитата
например.... динамическая индикация 4-х 7-ми сегментников с точкой. в прерывании от таймера нужно 8 портов выкл/откл, плюс общие катоды (4 шт). можно конечно вашими классами это сделать, проскочить по всем пинам и дернуть у всех On() или Off(). сколько вы просидите в прерывании?

Я никогда не стану такие тяжелые вещи городить в прерывании, для этого у меня есть rtos, практически в каждом проекте.
Ногодрыг и другая активная деятельность производится в теле задачи, которая ждет неких событий. В данном случае его формирует прерывание. Остальной код не страдает и не тупит.


Цитата
И если на остальное времени не хватит... то вы "не будете втаптывать код".... попросите вагон спичек, ну чтоб не экономить.

Наш разговор переходит в разряд "глухого со слепым". Предлагаю заканчивать с этим и переключиться на что-то другое ))


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
Reflector
сообщение Apr 19 2017, 10:04
Сообщение #228


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 15-07-06
Пользователь №: 18 836



Цитата(juvf @ Apr 19 2017, 12:57) *
О чем вы? Как же нельзя?
Задача: допустим надо 0 и 6 выствить в "0", а 1 и 7 выставить в 1.
решение:
GPIOA->BSRR = GPIO_BSRR_BR0 | GPIO_BSRR_BR6 | GPIO_BSRR_BS1 | GPIO_BSRR_BS7;

Это нельзя сделать, точнее у меня это не реализовано по причине невостребованности, в классе имеющем дело с отдельными пинами. Если будет острая необходимость, то в принципе можно это сделать в таком же стиле:
Код
led1.base()->BSRR = ((led1.pinMask | led2.pinMask) << 16) | led3.pinMask | led4.pinMask;

Но один из светодиодов уезжает на другой порт и все ломается...

Сообщение отредактировал Reflector - Apr 19 2017, 10:12
Go to the top of the page
 
+Quote Post
juvf
сообщение Apr 19 2017, 11:09
Сообщение #229


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Цитата(Forger @ Apr 19 2017, 15:01) *
Мне до лампочки сколько там битов меняется, на производительности никак не сказывается. Экономия на спичках.
Ни фига вы не слышите... спички спички.... вам говорият - каждая спичка на счету. Вы опять "Мне до лампочки.... на производительности никак не сказывается".... тут народ считает каждый дизасемблерную строку... вы опять - мне до лампочки, это спички... У меня крутой овернинженеринг, остальный сущности .... "Не хочу, не буду".

Цитата
В одном и том же коде на одном пине все это может висеть по очереди? Вы об этом?
и такое было. Но хотя бы просто только 1-Wire, нужно менять направление пина.
Цитата
Наш разговор переходит в разряд "глухого со слепым". Предлагаю заканчивать с этим и переключиться на что-то другое ))
вот с этим я согласен

Цитата
Если будет острая необходимость, то в принципе можно это сделать в таком же стиле:
Код
led1.base()->BSRR = ((led1.pinMask | led2.pinMask) << 16) | led3.pinMask | led4.pinMask;
да, стиль такой же... но... лень скролить всю тему... на вскидку прокоментирую.. поправте, если я не прав...
led1 - это переменная, структура или класс. pinMask - это поля этой структуры. что делает ваш код
1)led1.pinMask | led2.pinMask
2)<< 16
3) | led3.pinMask
4) | led4.pinMask
5) led1.base()
6) BSRR = чему-то там
вам наверно проще/быстрее 4 раза вызвать led*.on/off();

что делает мой код
1) BSRR = чему-то там

Цитата
Но один из светодиодов уезжает на другой порт и все ломается...
есть такое.... но не всё так печально. будет так
1)GPIOA->BSRR = чему-то там
2)GPIOB->BSRR = чему-то там
всё ранво есть выгода. и при проектировании я учитываю эту особенность МК и стараюсь вешать на один порт.
Go to the top of the page
 
+Quote Post
Forger
сообщение Apr 19 2017, 11:16
Сообщение #230


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(juvf @ Apr 19 2017, 14:09) *
тут народ считает каждый дизасемблерную строку..
Ну, что ж, остается лишь посочувствовать и пожелать удачи....
Видать, других дел нет, как экономить в одном месте битик, теряя сотни байт в других местах из-за криво организованного кода.
Каждый развлекается по-своему smile3046.gif

Цитата
каждая спичка на счету.
Уходите в asm, коли выбрали проц, в который не влазит код.
Чесс слово, это уже похоже на нытьё ... тока без обид laughing.gif


Цитата
и такое было. Но хотя бы просто только 1-Wire, нужно менять направление пина.

Никаких проблем: прямо в коде вызываем соотв. метод, отвечающий за направление пина. В моем случае вместо
Код
somePin.setAsDigitalOutput()

вызываем
Код
somePin.setAsDigitalInput()


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
juvf
сообщение Apr 19 2017, 11:22
Сообщение #231


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Цитата(Forger @ Apr 19 2017, 16:16) *
Никаких проблем, прямо в коде вызываем соотв. метод, отвечающий за направление.
ожидал tакой ответ.... просто объявите пин LedOpenDrain pin, меняете у него выход на вход.... и он уже не выход c ОК, а вход. Конечно работать будет. Но объект класса LedOpenDrain - есть входной пин. Как то уши режет.
Go to the top of the page
 
+Quote Post
Forger
сообщение Apr 19 2017, 11:25
Сообщение #232


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(juvf @ Apr 19 2017, 14:22) *
ожидал tакой ответ.... просто объявите пин LedOpenDrain pin, меняете у него выход на вход.... и он уже не выход c ОК, а вход. Конечно работать будет. Но объект класса LedOpenDrain - есть входной пин. Как то уши режет.

Я же уже сказал, что для подобной задачи есть более "базовый" класс Pin, его как раз и нужно использовать для этой задачи
или пойти чуть дальше и создать от Pin класс-наследник, который будет реализовывать функционал двунаправленного пина более красиво. Тут уже все упирается в вашу фантазию.

Теперь понятно?


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
juvf
сообщение Apr 19 2017, 11:27
Сообщение #233


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Цитата(Forger @ Apr 19 2017, 16:16) *
Уходите в asm, коли выбрали проц, в который не влазит код.
Чесс слово, это уже похоже на нытьё ... тока без обид laughing.gif
давно уже современные компиляторы сравнялись (или почти) с асмом. смысла нет. И зачем? Мне вполне комфортно в с/с++. В тесноте, да не в обиде.
Go to the top of the page
 
+Quote Post
Forger
сообщение Apr 19 2017, 11:32
Сообщение #234


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(juvf @ Apr 19 2017, 14:27) *
давно уже современные компиляторы сравнялись (или почти) с асмом. смысла нет. И зачем? Мне вполне комфортно в с/с++. В тесноте, да не в обиде.

Типа, съехал с темы ... Чтож, оно и к лучшему )))


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
Reflector
сообщение Apr 19 2017, 11:40
Сообщение #235


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 15-07-06
Пользователь №: 18 836



Цитата(juvf @ Apr 19 2017, 14:09) *
да, стиль такой же... но... лень скролить всю тему... на вскидку прокоментирую.. поправте, если я не прав...
led1 - это переменная, структура или класс. pinMask - это поля этой структуры. что делает ваш код
1)led1.pinMask | led2.pinMask
2)<< 16
3) | led3.pinMask
4) | led4.pinMask
5) led1.base()
6) BSRR = чему-то там

что делает мой код
1) BSRR = чему-то там

Нет, все совсем не так. Как я ранее говорил, в моем классе нет переменных, они есть у Forger. Сам классс выглядит следующим образом:
Код
template<uint32_t gpio, uint32_t pin_, uint32_t af_>
struct PinT
{
    static auto base() { return (GPIO_TypeDef*)gpio; }
    const static uint32_t af = af_;
    const static uint32_t pin = pin_;
    const static uint32_t pinMask = 1 << pin;
......
};

Так что pinMask - это обычная константа и генерируемый код будет в точности как у тебя.

Цитата
есть такое.... но не всё так печально. будет так
1)GPIOA->BSRR = чему-то там
2)GPIOB->BSRR = чему-то там
всё ранво есть выгода. и при проектировании я учитываю эту особенность МК и стараюсь вешать на один порт.

Эта выгода микроскопическая и думать над этим нужно только если уже все, флеш полностью закончился. Причем очевидно, что если пишешь достаточно компактный код и такое произошло, то скорее всего просто неверно выбран мк. На таких операциях много не сэкономишь, основная экономия лежит в области алгоритмов...
Go to the top of the page
 
+Quote Post
juvf
сообщение Apr 19 2017, 12:00
Сообщение #236


Профессионал
*****

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Цитата(Forger @ Apr 19 2017, 16:32) *
Типа, съехал с темы ... Чтож, оно и к лучшему )))

c какой темы? я уже всё сказал. сам же говоришь
Цитата
Наш разговор переходит в разряд "глухого со слепым". Предлагаю заканчивать с этим и переключиться на что-то другое ))
зачем мне асм? я вижу в твоем коде сплошной оверинжененринг. я это уже говорил. то, что можно сделать бистро и просто - у тебя разрослось в классы и шаблоны... в сущности... ты считаешь - что это хорошо- твоё право. я тоже пользую ООП в МК. но использование ООП - не значит отказ от 0b00001000. Ты, в ущерб производительности и компактности пишешь классы, Да пожалуйста, пиши. Но ты при этом говоришь "Чо экономить на спичках, хватит ныть и идите в асм". Что-то мне про ООП доказываешь. что тут доказывать - там где надо я сделаю и классы, и шаблоны и паттрены. Но в некоторых случаях делаю прямую запись в регистры, в некоторых в какие-то булевые операции в которых удобно литералы b использовать.

Пока что в твоём подходе использовать ООП всюду, отвергая литералы, - я не вижу смысла и удобства. У тебя в майне 3 строчки - у меня в майне 3 строчки. У тебя всё в майне понятно и прозрачно, у меня в майне всё понятно и прозрачно. Я перенесу на другую платформу - поправлю дефайны, майн не буду трогать. ты перенесешь на др платформу - так же будешь писать новый Pin.hpp, майн не изменишь. Если платформа та же... ноги другие.. ты в дефайнах исправишь пин и порт, я в дефайне изменю пин и порт. О чем спор? В удобстве стиля? не вижу преимуществ. а вот в производительности - тут можно поспорить. Но для тебя это экономия на спичках... так что дальше можно не дискутировать wink.gif

Цитата(Reflector @ Apr 19 2017, 16:40) *
Эта выгода микроскопическая и думать над этим нужно только если уже все, флеш полностью закончился.
не всегда так. в обработчиках прерывания это очень актуально, таже динамическая индикация....
Go to the top of the page
 
+Quote Post
Reflector
сообщение Apr 19 2017, 12:28
Сообщение #237


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 15-07-06
Пользователь №: 18 836



Цитата(juvf @ Apr 19 2017, 15:00) *
не всегда так. в обработчиках прерывания это очень актуально, таже динамическая индикация....

Ну что ж, еще раз sm.gif Есть два класса: PinX и GpioX. Первый имеет дело с одним пином, второй с портом в целом, но пишет/читает только в область ограниченную маской. Теперь подумай сколько ног используется при динамической индикации и какой класс больше для этих целей подходит sm.gif

Сообщение отредактировал Reflector - Apr 19 2017, 12:28
Go to the top of the page
 
+Quote Post
Forger
сообщение Apr 19 2017, 12:40
Сообщение #238


Профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831



Цитата(juvf @ Apr 19 2017, 15:00) *
В удобстве стиля? не вижу преимуществ.

Я раньше писал код для работы с пинами (да и не только) по практически точно такому же принципу, что и вы, но ушел на нынешнее решение.
Поэтому я отлично вижу преимущества, скорее всего, потому, что я пробовал и так и сяк...

Короче. Я поделился своим опытом, показал примеры. Буду рад, если кому-то пригодится wink.gif


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Apr 19 2017, 13:02
Сообщение #239


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Reflector @ Apr 19 2017, 11:45) *
В общем так, проинитил я 5 пинов, получил 144 байта, против 188 у меня. Проинитил 10 пинов, получил 252 vs 216, уже в мою пользу.

Интересно, как это так? У тебя же вроде тоже нет общего базового класса.
Цитата(Reflector @ Apr 19 2017, 11:45) *
Но при этом твой код изначально не работает на F1, также там используется bitBand, значит он не работает и на F0, но главное это его размер в дебаге... У меня он вырос в 2.4 раза, у тебя в 110 sm.gif Ты принципиально не пользуешься отладкой?

А посмотреть на уровень выше? sm.gif
Там есть pin.h, который включает нужный pin_xxx.h, в зависимости от типа контроллера. Для F1 другой вариант, для F0 третий.

Цитата(SasaVitebsk @ Apr 19 2017, 11:16) *
И что?
Ещё раз повторяю. Совершенно бессмысленно.
Приведу пример. Только что делал модификацию прибора. Изменилось количество каналов, полностью переразведена плата, на первой версии стояла отдельный МК который управлял клавой, светодиодами пищалкой и подключен был по I2C. В новой версии применили 595/165 SPI и отдельный таймер на пищалку.

Это всё замечательно, но как это относится к классу управления ножкой микроконтроллера?

Цитата(SasaVitebsk @ Apr 19 2017, 11:16) *
Чем поможет конструкция "PA5::On()"?

Ну вот, например. Есть класс-АЦП на SPI. Он оформлен в виде шаблона, принимающего параметр - ножку CS. (Ссылка на SPI передаётся в конструктор). Очень удобно.
Я пишу в файле описания железа:

Код
using AdcCsPin = Pin<'A', 2, 'L'>;
using AdcSpi = SPI<3, DIV_2>;
using AdcType = Ad7714<AdcCsPin>;


И потом использую. Разве не удобно?

Цитата(SasaVitebsk @ Apr 19 2017, 11:16) *
То есть нужен ещё слой, чтобы PA5::On превратился в
удобоваримое powerled(red) или adc_cs_on. Я сейчас не о стилистике написания, поймите. Пусть стилистика будет ваша. Но применять по тексту основной программы обезличенные данные аппаратных ресурсов - тоже, что писать reg = 5. Это также недопустимо! Ни одной константы по тексту программы.
Итак над этой хренью появляется ещё один файл абстракций. Итого 2. А у меня он 1. Сразу аппаратура в абстракцию.


Никакого ещё одного слоя, как вы видите из примера выше. Вместо вашего макроса adc_cs_on у меня в коде класса Adc будет CS:On();

Цитата(SasaVitebsk @ Apr 19 2017, 11:16) *
Ну хорошо рассмотрим переносимость данного класса и его применимость в другом проекте.
Ну и какая она? Громко заявлена, что она pin_stm32F4xx.h. То есть сразу же радуемся, что при использовании этой чудо хрени в stm32f0 мы в пролёте. Более того, при использовании её в f1 там придётся переписать половину.
Но и это ещё не всё. Я утверждаю, что эта хрень не заработает даже на всех камнях F4. Почему? Поищите сами. Или наступите на грабли.
При переносе на lpc это полностью переписать. И код использующий данный класс - тоже будет полностью переписан.
Вот у меня теперь вопрос. В ЧЁМ ВЫИГРЫШ БРАТ?!!!

Я уже ответил выше, но повторюсь. У меня включается файл pin.h, который в свою очередь включает нужный файл в зависимости от типа контроллера. Я дал ссылку на конкретную реализацию, чтобы люди не заблудились в репозитории. Но получил обратный эффект.

Что касаемо переносимости между контроллерами, то она тоже имеется (хотя и не полная). Для всех контроллеров, которые я использовал, я писал свой вариант pin.h.

А, и про это:
Цитата(SasaVitebsk @ Apr 19 2017, 11:16) *
Я утверждаю, что эта хрень не заработает даже на всех камнях F4. Почему? Поищите сами.

Насчёт хрени - я вас чем-то обидел? Откуда такие бурные эмоции?
А насчёт "не заработает даже на всех камнях F4" - буду благодарен за информацию о косяке.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Reflector
сообщение Apr 19 2017, 13:08
Сообщение #240


Участник
*

Группа: Участник
Сообщений: 48
Регистрация: 15-07-06
Пользователь №: 18 836



Цитата(AHTOXA @ Apr 19 2017, 15:46) *
Интересно, как это так? У тебя же вроде тоже нет общего базового класса.

Нет, у меня всего один класс и отдельно от него функция инициализации.

Цитата
А посмотреть на уровень выше? sm.gif
Там есть pin.h, который включает нужный pin_xxx.h, в зависимости от типа контроллера. Для F1 другой вариант, для F0 третий.

Это хорошо, но с дебагом все равно нужно что-то делать sm.gif
Go to the top of the page
 
+Quote Post

26 страниц V  « < 14 15 16 17 18 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th August 2025 - 16:07
Рейтинг@Mail.ru


Страница сгенерированна за 0.01547 секунд с 7
ELECTRONIX ©2004-2016