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

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

Just now, Priest_89 said:

время на постройку костылей

а тратить время на новую плату, программу, отладку и еще сто разных вещей не входит в общую смету ?

Думаю вариант с нопами прокатит.

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

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


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

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

Самый быстрый по моему просто прибавить нужное смещение, кто нить знает как это сделать в iar ?

А чем мой способ не угодил предводителю дворянства?

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


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

2 hours ago, jcxz said:

А чем мой способ не угодил предводителю дворянства?

слишком просто и даже переносимо получается.

 

надо сделать что-нибудь вроде 

void delay(int cycles){
  __asm__("add pc, r0");
  __asm__("nop");
  __asm__("nop");
  __asm__("nop");
  __asm__("nop");
//...
}
чтобы потом всё раком встало при "не правильном" переданном значении аргумента функции.

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


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

А чем мой способ не угодил предводителю дворянства?
предводителю уездного дворянства

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


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

5 hours ago, whale said:

Вижу только один путь - делаем сто нопов подряд и смещаем указатель команд на нужную строку нопов.

Весь вопрос как сместить это указатель (счетчик команд) на нужную величину с минимальными потерями, тк смещение от цикла к циклу все время меняется.

Самый быстрый по моему просто прибавить нужное смещение, кто нить знает как это сделать в iar ?

 

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

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


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

Just now, firstvald said:

инкрементил этот указатель на число нопов

Вот это и есть самый главный секретный вопрос  - как инкрементировать указатель команд на нужное значение в stm32 iar

В avr все было просто тут хрен разберешь, перерыл всю доку так и не нашел где  в каком секретном регистре содержится этот указатель.

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

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


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

1 hour ago, _pv said:

надо сделать что-нибудь вроде 

Черт возьми но вот это похоже работает, сдвигает на 3кгц но есть нюанс,

при cycles = 0,1   значение сдвига одинаковые (те не сдвигает) также такой  эффект повторяется далее через пару цифр -  2,3    4,5 итд

те между 1 и 2 сдвиг 3кгц

между 2 и 3 сдвиг ноль.

между 3 и 4 сдвиг3кгц

между 4 и 5 сдвиг ноль.

итд

может что то с длинной pc связано, в принципе можно сдвиг умножать на два )

void delay(char cycles){
  asm("add pc, r0");
  asm("nop");
  asm("nop");
  asm("nop");
  asm("nop");
  asm("nop");
  asm("nop");
  asm("nop");
  asm("nop");  
  asm("nop");
  asm("nop");
  asm("nop");
  asm("nop"); 

 

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

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


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

35 minutes ago, whale said:

где  в каком секретном регистре содержится этот указатель.

В регистре PC (R15)   (Cortex-M0 Technical Reference Manual, п.3.5)
 

5 hours ago, whale said:

а тратить время на новую плату, программу, отладку и еще сто разных вещей не входит в общую смету ?

Решать, безусловно, Вам, но..
Плата - насколько я понял из ваших постов, у Вас макетная версия, которая все равно требует переделки. Серии STM и их клонов полностью или с небольшими оговорками совместимы по пинам. Так что из переделок - 4 перемычки на выходы таймеров, а если повезет - то и их не понадобится.
Программа - опять же, рабочая программа на Си переносится без особых проблем, с небольшими изменениями в работе периферии и перенастройкой делителей в таймерах и интерфейсах.
В то же время, если оставлять старый контроллер, любая доработка/модификация в будущем приведет к возврату к обсуждаемому геморрою, либо ресурсов не хватит в принципе и опять же придется менять контроллер.

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


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

если так хочется делать ногодрыгами и НОПами, я бы сделал по-другому: создал бы с десяток функций
 

void f1() { asm("nop"); return; }

void f2() { asm("nop"); asm("nop"); return; }

...

void f10() { asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); return; }

запихнул бы их адреса в массив указателей на функцию, измерил бы точно сколько они длятся и вызывал бы так, что f10() вызывается в цикле сколько надо раз, а потом управление попадает на одну из тех, что в массиве. Тогда при точном измерении длительности такого извращения можно с точностью до такта настроить такую задержку.

 

 

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


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

Может проще приспособить копеечный синтезатор ?

Видел, применяется в китайских лазерных рулетках.

https://www.compel.ru/infosheet/RUIMENG/MS5351M

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


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

А что с прерываниями делать?

Насколько независимое управление нужно? Там же трёхфазный таймер, можно по фазе на мост и одна фаза запасная.

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


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

41 minutes ago, whale said:

Черт возьми но вот это похоже работает, сдвигает на 3кгц но есть нюанс,

это clang аргумент в r0 передаёт, и вроде ничего больше не делает, судя по godbolt.org,

что именно там делает iar в прологе если фунция не naked объявлена это в листинг смотреть надо.

инструкция nop вроде как два байта занимает, и почему при сдвиге на нечётный адрес он вообще в какой-нибудь hard fault не улетает я не очень понимаю.

jcxz на первой странице нормальный вариант на С через switch привёл. Да, за компилятором в листинг поглядывать надо, потому что при разных уровнях оптимизации он вероятно может и в цепочку ifов скомпилировать, но такие вещи либо целиком на ассемблере, либо бороться с оптимизатоциями компилятора без каких-либо гарантий.

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


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

Just now, _pv said:

switch

switch if  и прочее я пробовал еще до постинга этой темы, там минимум 35-50кгц шаг, оптимизацию тоже разную пробовал,

единственный рабочий вариант это ваш получился.

Если ноп два байта тогда понятно, думаю меньше шаг уже не получить.

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

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


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

2 minutes ago, whale said:

switch if  и прочее я пробовал еще до постинга этой темы, там минимум 35-50кгц шаг, оптимизацию тоже разную пробовал,

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

clang для арма из предложенного jcxz свича сам делает ровно такую же последовательность нопов и инкремент pc.

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


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

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

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

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

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

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

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

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

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

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