Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Re: stm32 cubeide два инкремента не совместимы.

Сб фев 05, 2022 21:28:43

Ну вы профи .А я аматор.Я так понял как бороться против дребезга контактов.Кстати лучше в меню переключения происходят.

Re: stm32 cubeide два инкремента не совместимы.

Сб фев 05, 2022 21:46:31

Иван, у тебя по условию должно получится 200 нулей и единиц, даже с тем самым дребезгом и длинными паузами. Отчего смысл антидребезга полностью аннулируется.
Ну нет у тебя его.
В моём варианте считается 255 единиц (или нулей) подряд, если кнопка искрит - то счётчик сбрасывается на ноль. Время удержания кнопки всегда ровно 256мс.
Код проще выполнять в прерывании таймера 1мс.
При долгом удержании будет повторное нажатие каждые 256мс.

Re: stm32 cubeide два инкремента не совместимы.

Сб фев 05, 2022 23:07:30

Делал я в прерывании правда не 1 мс а 10.Но меню не переключалось?.Тогда я в основном цикле добавил задержку 10 мсек.Вот тогда всё переключалось.А почему так я не знаю.Вы имеете ввиду что кнопку вписывать в обработчик прерывания?Так я так и сделал.В чем дело я так и не понял.В AVR немного по другому.?

Добавлено after 4 minutes 16 seconds:
Правда я там настраивал на режим compare.

Re: stm32 cubeide два инкремента не совместимы.

Вс фев 06, 2022 17:08:09

Ну что, показать как кнопку проще всего сделать? Правда, немного с плюсами, но там лайт.

Re: stm32 cubeide два инкремента не совместимы.

Вс фев 06, 2022 17:13:39

Нет просто для прерывания нужно код переделывать

Re: stm32 cubeide два инкремента не совместимы.

Вс фев 06, 2022 17:16:22

Ну нет так нет. А у меня как раз с прерыванием.

Re: stm32 cubeide два инкремента не совместимы.

Вс фев 06, 2022 18:08:06

Вы хотите поделится? Кодом.Меня учили.Дают бери.Бьют-беги.Я не против.

Добавлено after 59 seconds:
Так существует симулятор для stm32?

Re: stm32 cubeide два инкремента не совместимы.

Вс фев 06, 2022 18:34:21

А то в жадины записали... Пользуйтесь!

Класс кнопки. С антидребезгом и настройкой нажатия по "1" или "0".
Спойлер
Код:
template <typename TPin, bool invert=false>
struct TKey final
{
  bool pressed() { return key_pressed?key_pressed=false,true:false; }
  inline void Scan()
  {
    if (bool state=TPin::read(); prev_state!=state)
    {
      if(!state==invert) key_pressed = true;
      prev_state = state;
    }
  };
private:
   volatile bool key_pressed = false;
   volatile bool prev_state = invert;
};

Пример использования. Кто знает как сделать проще - делитесь тоже.
Код:
using LED = TLed<GPIO::PA5>;
using Key = TKey <GPIO::PC13>;

Key key;

int main()
{
  for(;;)
  {
    if(key.pressed())
      LED::Toggle();
  }
}

void SysTick_Handler()
{
  key.Scan();
}


Сопутствующие классы. Упрощённо, без оптимизаций, чисто чтобы пример собирался.
СпойлерLED
Код:
template <typename TPin, bool invert=false>
struct TLed final
{
  static inline void On()  { invert ? TPin::clear() : TPin::set(); }
  static inline void Off() { invert ? TPin::set() : TPin::clear(); }
  static inline void Toggle() { TPin::toggle(); }
  static inline bool Read() { return invert ? !TPin::read() : TPin::read(); }
  inline TLed& operator=(bool state)
  {
    if(state) On(); else Off();
    return *this;
  }
  inline operator bool() const { return Read(); }
};


Пины
Код:
namespace SimpleSTM32Pin
{

template<uint32_t pGPIO, uint32_t Pin>
struct TPin final
{
  static inline void set()   { base()->BSRR = pin_mask; }

#if (defined(GPIO_BRR_BR0) && (GPIO_BRR_BR0!=GPIO_BSRR_BR0)) // Есть ли BRR?
  static inline void clear()
  {
    base()->BRR = pin_mask;
  }
#else
  static inline void clear()
  {
    *((volatile uint16_t*)&base()->BSRR + 1) = pin_mask;
  }
#endif

  static inline void toggle(){ if (base()->ODR & pin_mask) clear(); else set(); }

  static inline void write(bool data)
  {
    base()->BSRR = (pin_mask << 16) | (data ? pin_mask : 0);
  }

  static inline bool read() { return base()->IDR & pin_mask; }

  inline TPin& operator=(const TPin& pin)
  {
    write(pin.read());
    return *this;
  }

  inline TPin& operator=(bool value)
  {
    write(value);
    return *this;
  }

  inline operator bool() const { return read(); }

private:
  static constexpr uint32_t pin_mask = 1UL << Pin;
  static constexpr auto base() { return (GPIO_TypeDef*)pGPIO; }

};

} //namespace SimpleSTM32Pin

#define MAKE_16PINS(PORT_NAME) \
using P##PORT_NAME##0  = SimpleSTM32Pin::TPin<(uint32_t)GPIO##PORT_NAME##_BASE,0>; \
using P##PORT_NAME##1  = SimpleSTM32Pin::TPin<(uint32_t)GPIO##PORT_NAME##_BASE,1>; \
using P##PORT_NAME##2  = SimpleSTM32Pin::TPin<(uint32_t)GPIO##PORT_NAME##_BASE,2>; \
using P##PORT_NAME##3  = SimpleSTM32Pin::TPin<(uint32_t)GPIO##PORT_NAME##_BASE,3>; \
using P##PORT_NAME##4  = SimpleSTM32Pin::TPin<(uint32_t)GPIO##PORT_NAME##_BASE,4>; \
using P##PORT_NAME##5  = SimpleSTM32Pin::TPin<(uint32_t)GPIO##PORT_NAME##_BASE,5>; \
using P##PORT_NAME##6  = SimpleSTM32Pin::TPin<(uint32_t)GPIO##PORT_NAME##_BASE,6>; \
using P##PORT_NAME##7  = SimpleSTM32Pin::TPin<(uint32_t)GPIO##PORT_NAME##_BASE,7>; \
using P##PORT_NAME##8  = SimpleSTM32Pin::TPin<(uint32_t)GPIO##PORT_NAME##_BASE,8>; \
using P##PORT_NAME##9  = SimpleSTM32Pin::TPin<(uint32_t)GPIO##PORT_NAME##_BASE,9>; \
using P##PORT_NAME##10 = SimpleSTM32Pin::TPin<(uint32_t)GPIO##PORT_NAME##_BASE,10>; \
using P##PORT_NAME##11 = SimpleSTM32Pin::TPin<(uint32_t)GPIO##PORT_NAME##_BASE,11>; \
using P##PORT_NAME##12 = SimpleSTM32Pin::TPin<(uint32_t)GPIO##PORT_NAME##_BASE,12>; \
using P##PORT_NAME##13 = SimpleSTM32Pin::TPin<(uint32_t)GPIO##PORT_NAME##_BASE,13>; \
using P##PORT_NAME##14 = SimpleSTM32Pin::TPin<(uint32_t)GPIO##PORT_NAME##_BASE,14>; \
using P##PORT_NAME##15 = SimpleSTM32Pin::TPin<(uint32_t)GPIO##PORT_NAME##_BASE,15>;

namespace GPIO
{

#ifdef GPIOA
MAKE_16PINS(A)
#endif

#ifdef GPIOB
MAKE_16PINS(B)
#endif

#ifdef GPIOC
MAKE_16PINS(C)
#endif

#ifdef GPIOD
MAKE_16PINS(D)
#endif

#ifdef GPIOE
MAKE_16PINS(E)
#endif

#ifdef GPIOF
MAKE_16PINS(F)
#endif

#ifdef GPIOG
MAKE_16PINS(G)
#endif

#ifdef GPIOH
MAKE_16PINS(H)
#endif

#ifdef GPIOI
MAKE_16PINS(I)
#endif

#ifdef GPIOK
MAKE_16PINS(K)
#endif

} //namespace GPIO

Re: stm32 cubeide два инкремента не совместимы.

Вс фев 06, 2022 18:41:00

А обычный таймер использовать.Прерывание по таймеру.

Добавлено after 2 minutes 13 seconds:
Владислав слишком заумно.Для буржуев пишите.И для профи.Я не отношусь ни к тем ни к другим.

Re: stm32 cubeide два инкремента не совместимы.

Вс фев 06, 2022 18:45:11

Какая разница какой таймер? Любой, лишь бы тикал с нужной частотой - примерно 100 Гц плюс/минус.

Re: stm32 cubeide два инкремента не совместимы.

Вс фев 06, 2022 18:45:46

Так существует симулятор для stm32?

Давно в Proteus есть.

Re: stm32 cubeide два инкремента не совместимы.

Вс фев 06, 2022 18:47:36

Для буржуев пишите.
Каких таких буржуев? У меня даже комментарии на русском :)

Re: stm32 cubeide два инкремента не совместимы.

Вс фев 06, 2022 18:48:44

Какая версия.Я пытался установить .У меня только устанавливается 7.7.

Re: stm32 cubeide два инкремента не совместимы.

Вс фев 06, 2022 18:50:54

Лучший симулятор - живой чип. Какую-нибудь nucleo-g474 простенькую купите и сможете что угодно отлаживать.

Re: stm32 cubeide два инкремента не совместимы.

Вс фев 06, 2022 18:56:19

ivan dimir, на F103 и F401 есть с ограничениями, а смысл? Лучше в отладчике на реальном железе.

Re: stm32 cubeide два инкремента не совместимы.

Вс фев 06, 2022 19:01:33

Какая версия.Я пытался установить .У меня только устанавливается 7.7.
Вложения
Screenshot_366.jpg
(147.86 KiB) Скачиваний: 35

Re: stm32 cubeide два инкремента не совместимы.

Вс фев 06, 2022 19:03:08

tonyk писал(а):Давно в Proteus есть.
Протеус 8.10 SP3 чип F103, флаг USART_SR_TC не так обрабатывается как в железе, прерывание IDLEIE вообще отсутствует, ну ни как не хочет срабатывать, а в железе срабатывает.

Re: stm32 cubeide два инкремента не совместимы.

Вс фев 06, 2022 19:26:42

ivan dimir, на F103 и F401 есть с ограничениями, а смысл? Лучше в отладчике на реальном железе.

ИМХО, лучше взять Нуклию или Дискавери с МК, имеющим побольше ОЗУ и грузить программу в ОЗУ. Это и быстро, и ресурс флэш сберегается.
Если уж ivan dimir не может дашит осилить, то где уж ему читать и вникать в ограничения симулятора, которые описаны в отдельном файле. Я ему эту картинку из Протеза напоглумиться показал, а то достала эту пустая болтовня. Причём удивляет то, что все вопросы, которые он задаёт, в пыль разжёваны в статьях в Инете, причём по-русски.

Re: stm32 cubeide два инкремента не совместимы.

Вс фев 06, 2022 19:42:35

Судя по этому видео там вполне нормальный отладчик.

Re: stm32 cubeide два инкремента не совместимы.

Вс фев 06, 2022 20:00:31

которые он задаёт, в пыль разжёваны в статьях в Инете, причём по-русски.[/uquote]

Есть маленькая проблемка.Я не русский.Но не молдован.
Ответить