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

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

Just now, iiv said:

700кГц по идее должно потянуть, вернее если на вашем процессоре первый цикл тоже как у меня 6 тактов, то 888кГц и ниже все должно охватить.

 

а чем он больше-то? У меня в страницу поместилось все со всеми тестами. Если говорить о том, что вам конкретно надо, так это только nop_delay1 и nop_delay2, которые займут примерно 50 байт в бинарнике. Я сомневаюсь, что простыня нопов и скачки по ним будут лучше, а то, что ваш метод дает вольность контроллеру не закачивать часть нопов из флеша, даст вам сказочные неприятности, у вас то будет работать, то не будет работать.

Будут скачки из за выборки из памяти.

Для эксперимента можно попробовать чуть позже, для задания сейчас верхней граничной частоты нужно 40 нопов, уложиться ваш код в них ?

 

 

Пока вроде  глюков не наблюдается.

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

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


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

1 hour ago, iiv said:

сделаю еще одну попытку прояснить вам мою идею. У вас stm32g070, у которого такт - 64МГц и вам нужен ногодрыг на 500кГц, то есть между переключениями у вас есть как минимум 64 такта. То, что я предлагаю, позволяет дозировать задержку с точностью до одного такта в диапазоне от 36 тактов до бесконечности. То есть вы с легкостью получите 500кГц, выставив 64 такта задержку, и 64/65/2*1000=492.3кГц, а если согласитесь на слегка не 50% форму сигнала, то и 64/129*1000=496.12кГц. Больше с этого дохлого контроллера взять не получится.

ЗЫ: хоть и мое решение занимает меньше страницы уже отлаженного кода, считаю, что ТС надо при таких хотелках задуматься о более жирном процессоре, а лучше плиске. Не рекламы ради, очень советую взять мелкий GoWin - на нем с легкостью можно сделать шаг в районе 500кГц вплоть до единиц Герцев, если конечно еще подавать слегка не равномерные длины окон тактовой.

и я бы сделал аргументы глобальными а не передавал в параметрах функций

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


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

10 minutes ago, whale said:

для задания сейчас верхней граничной частоты нужно 40 нопов, уложиться ваш код в них ?

у вас наверное сложности сравнить 36 с 40 🙂

1 minute ago, firstvald said:

и я бы сделал аргументы глобальными а не передавал в параметрах функций

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

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


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

5 hours ago, iiv said:

у вас наверное сложности сравнить 36 с 40

Как то я сильно сомневаюсь,  у вас

старт

nop_delay_ini1

вызывает 

 

nop_delay(time);

в которой есть умножение и деление, которая в свою очеред вызывает 

 

nop_delay1

финиш

те общее время складывается из всего этого последовательного вызова старт-финиш, деления, умножения, сравнения  и все это укладывается в 36 команд ? 

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

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


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

16 minutes ago, whale said:

те общее время складывается из всего этого последовательного вызова старт-финиш, деления, умножения, сравнения  и все это укладывается в 36 команд ? 

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

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


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

Just now, iiv said:

а вы все сомневаетесь.

Я во всем сомневаюсь и проверить его не так просто как вам кажется для это минимум надо разобрать железку которая на тесте и подключить ее к программатору, осциллографу итд

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

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


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

Just now, iiv said:

эти жалкие три строчки

Что такое CCOUNT

что за команда RSR(CCOUNT, begin);

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

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


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

10 minutes ago, whale said:

что за команда RSR(CCOUNT, begin);

можно было погуглить добавив тот процессор, на котором я это тестировал (esp32), можно было догадаться, что это - измерение времени в тактах процессора.

Такое чувство, что мне больше надо, чтобы у вас это запустилось, чем вам, так как вы, к моему полнейшему сожалению, совершенно не проявляете любопытства и не пытаетесь додумать что в каких местах этого кода могло бы быть написано 😞

 

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

 

Предвкушая ваш следующий вопрос, а то вы опять что-то не дочитаете, тайминги у вас могут слегка отличаться от моих, поэтому значения NOP_Param_1, NOP_Param_2 могут быть на несколько единиц больше или меньше и их надо подобрать методом научного тыка, ну или решив не сильно сложное уравнение. Это уравнение я не стал здесь приводить, так как по опыту предыдущих Ваших вопросов я уверен, что не смогу даже за неделю вам это объяснить, и предлагаю совместно сэкономить наше время, а решать научным тыком.

57 minutes ago, whale said:

Я во всем сомневаюсь и проверить его не так просто как вам кажется для это минимум надо разобрать железку которая на тесте и подключить ее к программатору, осциллографу итд

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

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


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

Just now, iiv said:

можно было погуглить добавив тот процессор

Слишком запутанный и заумный код, я так понял  RSR(CCOUNT, begin);  мне не надо .

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

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


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

Just now, iiv said:

очередь стараюсь создать удобную для себя среду разработки

Если свести всю вашу простыню к вот такому коду

 

void nop_delay(unsigned int time) 
{   
  
  int NOP_Param_1=6;
  int NOP_Param_2=6;
  
  unsigned int i;
  
  unsigned int q = time - NOP_Param_2;
  unsigned int q2 = q/NOP_Param_1;
  unsigned int q1 = q - q2*NOP_Param_1;
 
  i=q1;
  while(i>0)
  { asm("nop");
    i--;
  }
  i=q2-q1;
  while(i>0)
  { asm("nop");
    asm("nop");
    i--;
  }
  return;
}

то при time 0..1...2 итд

 i в while  постоянно вылетает в минус и все виснет,

какие критерии для выбора time ?

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


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

Короче, если выше код правильный то при задании time от 0 и выше происходят жесткие глюки с частотой, мало того постоянно все виснет так еще и бегает в разные стороны )

Сдвигать она конечно может на такт но вычисление q1 q2  неверно.

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


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

On 8/16/2024 at 9:51 PM, whale said:
while(FG2--){__NOP();}

есть ли конструкция аналогичная выше но выполняемая в 5-10  раз быстрее ?

 

Быстрее в 3 раза без лишних телодвижений: выбрасываете из тела цикла абсолютно ненужный nop, включаете хотя бы самую лёгкую оптимизацию.

Вместо портянки из 6 инструкций/итерацию

Оптимизиция -O0
void TEST(unsigned int FG2)
{
	while(FG2--){__NOP();}
}


080002cc:   nop     
080002ce:   ldr     r3, [r7, #4]
080002d0:   subs    r2, r3, #1
080002d2:   str     r2, [r7, #4]
080002d4:   cmp     r3, #0
080002d6:   bne.n   0x80002cc <TEST+16>

получаете 2 инструкции/итерацию

Оптимизиция -O1
void TEST(unsigned int FG2)
{
	while (--FG2);
}

08000260:   subs    r0, #1
08000262:   bne.n   0x8000260 <TEST+6>

Выхлоп из GCC, но IAR на таких тривиальных вещах должен выдавать аналогичный результат

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


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

2 hours ago, Sergey_Aleksandrovi4 said:

получаете 2 инструкции/итерацию

Выхлоп из GCC, но IAR на таких тривиальных вещах должен выдавать аналогичный результат

bne ещё не за 1 такт выполняется, а iar этот пустой цикл без наличия volatile выкинет целиком скорее всего, при хоть какой-то включенной оптимизации.

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


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

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

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

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

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

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

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

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

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

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