0
«Не поймите меня неправильно», разумеется. :D
  • avatar
  • _YS_
  • 08 января 2018, 17:21
+1
Ради интереса, когда (и, если не секрет) для чего вам было необходимо получать произвольный сдвиг между каналами ШИМ? :)

Но это ладно. Я выше писал в предположении, что мы используем один таймер. Если разрешить себе использовать два таймера, то все сводится к конфигурации ШИМ-каналов от разных таймеров и задании разных начальных значений для этих двух таймеров. Дальше все будет происходить само по себе.

Надо сказать, что в STM32 это делается гораздо спокойнее, потому что таймеров там, как правило, больше, и потратить два не так жалко. :)

Вместо SBI/CBI в STM32 есть механизм bit-banding (отображение битов на индивидуальные адреса памяти). Для портов там вообще есть специальные регистры атомарной установки/снятия битов.

Не поймите меня правильно, я не продвигаю STM32 (или какую-то другую) архитектуру как абсолют. Если бы какая-то архитектура была абсолютом, то уже давно осталась бы она одна. Просто мы с вами разговариваем именно о STM32 и AVR, потому и примеры на STM32. С тем же успехом я мог бы приводить примеры на MSP430. Просто мы о них пока не говорим.

Кстати, у MSP430 мне как раз таки очень нравится ассемблер. Писать на нем — одно удовольствие! Вот это супер-архитектура для ассемблерного кода. Попробуйте, не пожалеете. Из них можно многое выжать.

А так, контроллер надо выбирать под задачу. В разных задачах разные архитектуры имеют преимущество. Скажем, в AVR мне нравится АЦП, а в STM32 — таймеры, особенно поддержка инкрементального энкодера.
  • avatar
  • _YS_
  • 08 января 2018, 17:19
0
Отписался в комментарии ниже.
  • avatar
  • _YS_
  • 08 января 2018, 16:44
0
Вы знаете, я еще раз подумал над вашими и Lifelover'а словами про края и серединки. Тут, конечно, надо рисовать, чтобы всем все стало понятно. Но если имеется в виду получение совсем произвольного сдвига между каналами (зачем?), то для этого можно сделать следующее (даже не трогая остальные аппаратные возможности):

— настроить прерывание по обнулению (при счете вниз) и переполнению (при счете вверх) таймера;
— в этом прерывании при достижении максимального значения таймера прибавлять значение сдвига к основному значению CCR канала, а при счете вниз и достижении нуля — вычитать.

Таким образом можно получить любой сдвиг.
  • avatar
  • _YS_
  • 08 января 2018, 16:44
0
Нутк, без MOE (TIM_BDTR_MOE) действительно ничего не будет работать. :))
  • avatar
  • _YS_
  • 07 января 2018, 17:30
0
Еще одну статью, чтобы показать остальные режимы, кроме PWM1 и PWM2, я писать не буду. ;)
  • avatar
  • _YS_
  • 07 января 2018, 16:33
0
Как вам конструкция типа (USART_RXEN_bm|USART_TXEN_bm)?

Мне норм, самое то. :)

Такие имена очень облегчают жизнь при использовании IDE с автодополнением. Вместо того, чтобы помнить точные имена всех битов, можно просто набрать, скажем, «USART_» и ждать, что предложит автодополнение. Ну а дальше выбрать подходящий вариант и нажать Enter. :)

У STM32 еще круче — название бита включает имя регистра, для которого он релевантен. Это еще удобнее — не даст записать не то не туда. А соблазн есть, потому что названия некоторых битов ох как похожи…
  • avatar
  • _YS_
  • 13 июня 2017, 19:47
+1
Воу-воу-воу, сколько экспрессии! :) Я даже с трудом вспомнил пароль и авторизовался тут, чтобы расставить плюсы-минусы и написать этот комментарий. :D

Так-то я тоже адепт MISRA и периодически воинствующий противник кубических ардуин. :) Давайте глубоко вдохнем, выдохнем и пойдем дальше рисовать схемы и писать код, оставив некоторых наших коллег за изготовлением мультивибратора из STM32F4. Все равно заказчик, намучившись с такими решениями, в итоге придет к нам. ;)
  • avatar
  • _YS_
  • 29 апреля 2017, 14:43
0
Офигеть. Я вот изобрел примерно то же самое. :) Только сейчас увидел эту статью. :)

В моем варианте настройка выглядит как-то так:


    GPIOC->MODER=PIN_OUT(LED1_PC) | PIN_OUT(LED2_PC) | PIN_OUT(LED3_PC) | PIN_AF(WIFI_UART_RX_PC) | PIN_AF(UART_TX_PC);
    GPIOC->OTYPER=0;
    GPIOC->OSPEEDR=PIN_LSPEED(LED1_PC) | PIN_LSPEED(LED2_PC) | PIN_LSPEED(LED3_PC) | PIN_HSPEED(UART_TX_PC);
    GPIOC->PUPDR=0;
    GPIOC->ODR=0;
    GPIOC->AFR[1]=AF_AFR1(7,WIFI_UART_TX_PC);

    ...

    GPIOC->ODR|=PIN_MASK(LED1_PC);


Соответственно, макросы определены как-то так:


#define PIN_OUT(pin_no)          (1<<(2*(pin_no)))
#define PIN_AF(pin_no)           (2<<(2*(pin_no)))
#define PIN_ANALOG(pin_no)       (3<<(2*(pin_no)))

#define PIN_MASK(pin_no)         (1<<(pin_no))


Ну и так далее. LEDn_Px и прочее определено цифирками, соответствующими номерам пинов. В конце добавляю _Px, просто чтобы не забыть, на каком порту соответствующий пин.
  • avatar
  • _YS_
  • 30 сентября 2016, 12:37
0
Не могу понять желания набивать шишки лично. Умный, как правило, учится на чужих ошибках…
  • avatar
  • _YS_
  • 27 марта 2016, 23:44
0
Мне это советовать уже поздно, ибо мне уже не восемнадцать, не двадцать и даже не двадцать три. :)

В любом случае, привычка думать о последствиях перед тем, как что-то делать, практически исключает возможность действовать так, как вы описали. :)

Хотя у меня есть друг детства, который делал именно описанным образом. Не могу сказать, что по итогам я ему завидую…
  • avatar
  • _YS_
  • 27 марта 2016, 23:43
0
Отличный пример. Так вот, в случае с Ардуино эти «подростки с калашами» рвутся (и поощряемы) выполнять задачи, подходящие только для спецназа. При этом они представляют опасность для окружающих.
  • avatar
  • _YS_
  • 27 марта 2016, 21:39
0
Да-да, нормальное распределение, хаос. Так вот, достойный порог вхождения и систематическая система обучения очень разравнивает это распределение, сильно уменьшая количество разработчиков, но повышая их качество.
  • avatar
  • _YS_
  • 27 марта 2016, 21:36
0
Вот такие проекты и вызывают самую серьезную озабоченность.
  • avatar
  • _YS_
  • 27 марта 2016, 17:50
0
Будем надеяться, что, несмотря на тараканы в голове, она не последует вашему совету. :)
  • avatar
  • _YS_
  • 27 марта 2016, 17:49
0
А как относитесь к хору?

Хорошо, если только это не хор кубанского казачества, например. :) Впрочем, к упомянутому я тоже хорошо отношусь. Только слушать вряд ли буду. :)

Все хочу сходить послушать Carmina Burana целиком.
  • avatar
  • _YS_
  • 27 марта 2016, 17:48
0
Однако…
  • avatar
  • _YS_
  • 27 марта 2016, 17:46
0
Да-да-да, примерно так все и бывает, я даже спорить не буду.
  • avatar
  • _YS_
  • 27 марта 2016, 17:45
0
А что такое нормальный® стек?
  • avatar
  • _YS_
  • 27 марта 2016, 17:04
0
Нет, то, что он получает удовольствие, это я уверен. Интересно, получают ли удовольствие его слушатели. :D
  • avatar
  • _YS_
  • 27 марта 2016, 17:02