Перейти к содержанию
    

STM32 управление мостами

Видел, применяется в китайских лазерных рулетках.
https://www.compel.ru/infosheet/RUIMENG/MS5351M

Занятная "балалайка", вот только кварц к ней 25..27 МГц и дока - "TRUE CHINA" )-8Ж
За ProgMan-ом обращаться к нашим очень "дорогим чайным друзьям".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 часов назад, Obam сказал:

дока - "TRUE CHINA"

Оно? https://ur8qp.com/_ld/0/3_MS5351_M.pdf

(upd) Неполное. Впрочем, перевести 39 страниц - дня на 2 работы...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 часов назад, vov4ick сказал:

Там же трёхфазный таймер, можно по фазе на мост и одна фаза запасная.

Да, когда выяснилось, что это по-прежнему то же самое изделие из предыдущих тем, и каналов не сотня, а всего два, вопрос про решению задачи на TIM1 аппаратно снова актуален.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 hours ago, _pv said:

листинг в студию.

   
       __NOP();__NOP();__NOP();__NOP();__NOP();   
      
      switch (FG) {
      case 3: asm(" NOP");
      case 2: asm(" NOP");
      case 1: asm(" NOP");
      case 0: asm(" NOP");
      }
       __NOP();__NOP();__NOP();__NOP();__NOP(); 



   \      0x160   0xBF00             Nop
   \      0x162   0xBF00             Nop
   \      0x164   0xBF00             Nop
   \      0x166   0xBF00             Nop
   \      0x168   0xBF00             Nop
   \      0x16A   0x....             LDR      R4,??DataTable17_2
   \      0x16C   0x7825             LDRB     R5,[R4, #+0]
   \      0x16E   0x2D00             CMP      R5,#+0
   \      0x170   0xD0E5             BEQ      ??main_17
   \      0x172   0x2D02             CMP      R5,#+2
   \      0x174   0xD0E1             BEQ      ??main_15
   \      0x176   0xD3E1             BCC      ??main_16
   \      0x178   0x2D03             CMP      R5,#+3
   \      0x17A   0xD0DD             BEQ      ??main_14
   \                     ??main_18: (+1)
   \      0x17C   0xBF00             Nop
   \      0x17E   0xBF00             Nop
   \      0x180   0xBF00             Nop
   \      0x182   0xBF00             Nop
   \      0x184   0xBF00             Nop

Вот нопами окропил по краям чтобы точно выделить код.

Мы видим постоянные сравнения что и приводит к шагу в 50кгц

 

А с вашей задержкой такой код

 

  \        0x0   0x4487             add pc, r0
    115            
    116            asm("nop");
   \        0x2   0xBF00             nop
    117            asm("nop");
   \        0x4   0xBF00             nop
    118            asm("nop");
   \        0x6   0xBF00             nop
    119            asm("nop");
   \        0x8   0xBF00             nop
    120            asm("nop");
   \        0xA   0xBF00             nop
    121            asm("nop");
   \        0xC   0xBF00             nop
    122            asm("nop");
   \        0xE   0xBF00             nop
    123            asm("nop");  
   \       0x10   0xBF00             nop
    124            asm("nop");
   \       0x12   0xBF00             nop
    125            asm("nop");
   \       0x14   0xBF00             nop

Правда при изменении r0 c

10->12

18->20

26->28

итд

шаг делает 10 кгц

при других изменениях 4кгц

с чем связано непонятно

Изменено пользователем whale

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, whale said:

Мы видим постоянные сравнения что и приводит к шагу в 50кгц

 

On 8/18/2024 at 2:15 AM, jcxz said:

При достаточно большой величине N должен получиться как раз ваш "вычисляемый переход".

при 4 ветках видимо "дешевле" развернуть в сравнения, если сделать switch побольше и ещё и оптимизацию по скорости включить вроде должен нормально сделать, но опять же без особых гарантий что при смене параметров оптимизации не сломается.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Just now, _pv said:

смене параметров оптимизации не сломается

Я вообще стараюсь оптимизацию не применять могут быть всякие глюки.

 

А по сбою шага никаких идей не подскажите ? как то слишком периодично ровно через 8 сбивается.

В листинге все гладко, загадка....

Изменено пользователем whale

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

4 minutes ago, whale said:

А по сбою шага никаких идей не подскажите ? как то слишком периодично ровно через 8 сбивается.

flash wait states, исполнение из ram

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

17 минут назад, whale сказал:

стараюсь оптимизацию не применять

Зря, очень зря. Без оптимизации используется наиболее простейший алгоритм построения, с минимальным набором инструкций и РОН. Включение оптимизации ускоряет генерируемый код в 2-3 раза.

20 минут назад, whale сказал:

как то слишком периодично ровно через 8 сбивается

А никто и не гарантирует, что NOP-ы будут равномерно проходить и исполняться. Они вообще могут выкидываться из исполнения, поскольку NOP применяется так же и для выравнивания инструкций по границам 4-х байт

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, whale сказал:
   
       __NOP();__NOP();__NOP();__NOP();__NOP();   
      
      switch (FG) {
      case 3: asm(" NOP");
      case 2: asm(" NOP");
      case 1: asm(" NOP");
      case 0: asm(" NOP");
      }
       __NOP();__NOP();__NOP();__NOP();__NOP(); 



   \      0x160   0xBF00             Nop
   \      0x162   0xBF00             Nop
   \      0x164   0xBF00             Nop
   \      0x166   0xBF00             Nop
   \      0x168   0xBF00             Nop
   \      0x16A   0x....             LDR      R4,??DataTable17_2
   \      0x16C   0x7825             LDRB     R5,[R4, #+0]
   \      0x16E   0x2D00             CMP      R5,#+0
   \      0x170   0xD0E5             BEQ      ??main_17
   \      0x172   0x2D02             CMP      R5,#+2
   \      0x174   0xD0E1             BEQ      ??main_15
   \      0x176   0xD3E1             BCC      ??main_16
   \      0x178   0x2D03             CMP      R5,#+3
   \      0x17A   0xD0DD             BEQ      ??main_14
   \                     ??main_18: (+1)
   \      0x17C   0xBF00             Nop
   \      0x17E   0xBF00             Nop
   \      0x180   0xBF00             Nop
   \      0x182   0xBF00             Nop
   \      0x184   0xBF00             Nop

Вот нопами окропил по краям чтобы точно выделить код.

Может хотя-бы прочитать что я писал?

В 18.08.2024 в 03:15, jcxz сказал:

При достаточно большой величине N должен получиться как раз ваш "вычисляемый переход".

Вроде как очевидно, что 4 - слишком мало. Хотя-бы 8 нужно или больше. И очевидно что - оптимизация должна быть включена на максимум.

1 час назад, whale сказал:

Я вообще стараюсь оптимизацию не применять

Тогда никаких "вычисляемых переходов" можете не ждать.

1 час назад, whale сказал:

могут быть всякие глюки.

Надо код правильно писать. Чтобы глюков не было.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, _pv said:

flash wait states, исполнение из ram

Поправить как нить можно  в данном контексте?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

44 minutes ago, whale said:
2 hours ago, _pv said:

flash wait states, исполнение из ram

Поправить как нить можно  в данном контексте?

собственно второе и лечит первое, вызванное тем что МК на большой частоте не успевает читать флэш что даже кэш на несколько слов не помогает и соответственно добавляет паузы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

При линейном исполнении кода и при правильно настроенных буферах предвыборки задержек возникать не должно, поскольку по параллельной шине с флеши забирается инструкций больше, чем требуется. Задержки из-за сброса конвейера могут происходить при ветвлении кода.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

45 minutes ago, EdgeAligned said:

При линейном исполнении кода и при правильно настроенных буферах предвыборки задержек возникать не должно, поскольку по параллельной шине с флеши забирается инструкций больше, чем требуется. Задержки из-за сброса конвейера могут происходить при ветвлении кода.

это при правильно настроенных, PRFTEN по умолчанию выключен у STM32G070.

в ram перенести этот десяток nopов всё равно надёжней.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

PRFTEN действительно выключен, я так понял он уменьшает два такта считывания 8 байт из памяти до одного + можно уменьшить задержку сейчас LATENCY = 2 при 64мгц.

Попробовать смогу только завтра.

17 minutes ago, _pv said:

в ram перенести этот десяток nopов всё равно надёжней.

Получается 80 нопов тут для более-менее перекрытия диапазона.

С ram пока не работал, действительно можно объявить функцию через __ramfunc при инициализации 

а потом обращаться к ней в коде и будет выполнение из ram без задержек ? Или все несколько сложнее ?

Изменено пользователем whale

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...