STM 32 вопрос

gal
Offline
Зарегистрирован: 08.06.2018
Здравствуйте.
Как преобразовать это для stm32 ?
 
ISR (TIMER1_OVF_vect) {
static uint8_t  n=0;
OCR1A =  OCR1B= sine_wave[n];
n++;
}

 

 

nik182
Offline
Зарегистрирован: 04.05.2015

Без программы инициализации таймера сказать ничего нельзя. Непонятно в каком режиме работает таймер.

gal
Offline
Зарегистрирован: 08.06.2018


А это поможет ?
Хотел всё переделать на STM
void setup(){
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
TCCR1B = (1<<WGM13)|(1<<CS10);
TCCR1A = (1<<COM1A1)|(1<<COM1B1)|(1<<COM1B0);
TIMSK1 = 1<<TOIE1;
ICR1=511; //считать до 255
OCR1A=0; //
OCR1B=0;
}

ISR (TIMER1_OVF_vect) {
static uint8_t n=0;
OCR1A = OCR1B= sine_wave[n];
n++;
}

void loop(){
}
Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Это не поможет. В СТМе совсем другие регистры.

gal пишет:
Хотел всё переделать на STM
Начни с замены среды программирования.

nik182
Offline
Зарегистрирован: 04.05.2015

Это поможет. Разобраться бы зачем это надо. Две ноги выдают два разных PWM. Длительность определяется массивом размером 256 точек. Не соображу в чём разность выдаваемых сигналов. Неначем сейчас проверить.

http://catethysis.ru/stm32-tim-dma-pwm-sin/

 

Как я понимаю здесь именно то что надо для STM. Процессоры разные, поэтому прямо переделать нельзя.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Точно режимы уже не помню, лезть в даташит - лениво. Сильно похоже что это режим счета таймера1 по регистру ICR до 512, с делителем на 4 или сколько-то там и настройкой двух ног на выдачу противофазного сигнала по массиву данных, возможно "синус".

В STM32 вроде как есть специальный режим для такой выдачи. Тупо надо залезть в даташит, посмотреть что за режим и на какой частоте пашет и подсунуть аналогичные настройки в СТМ-ку. Делов на 3 рубля. Но "этот" код - не подойдет, всяко. Да и среду разработки поменять тоже стоит.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

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

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Надеюсь, по памяти правильно его понял? :)

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Arhat109-2, ну да всё правильно. делитель правда /1.

gal
Offline
Зарегистрирован: 08.06.2018
 dimax
Собирался Вам этот вопрос задать, но это трехлетний скетч, подумал что Вас там уже  нет.
Помогите ?
gal
Offline
Зарегистрирован: 08.06.2018

nik182

Спасибо за линк, сохранил и проверю.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

gal, Тут железная привязка к архитектуре М.К.  AVR, переделать можно только под другие 8-битные AVR. Для СТМ нужно всё писать с "чистого листа".

gal
Offline
Зарегистрирован: 08.06.2018

Dimax

А Вы  можете перевести на русский язык что написано в строчках  #4 - # 15 ?

Сообщение #2

gal
Offline
Зарегистрирован: 08.06.2018

Вот нашел - изучаю

https://arduino-info.wikispaces.com/Timers-Arduino

gal
Offline
Зарегистрирован: 08.06.2018
TCCR1B = (1<<WGM13)|(1<<CS10); 
TCCR1A = (1<<COM1A1)|(1<<COM1B1)|(1<<COM1B0); 

 (1<<WGM13)|(1<<CS10);  // что это означает ?
 (1<<COM1A1)|(1<<COM1B1)|(1<<COM1B0); // что это означает ?

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

gal, в первых двух строчках в регистрах TCCR1A и TCCR1B устанавливаются в единицу нужные разряды, а в строчках 4 и 5 - херня какая-то. Не знаю, будет ли это компилироваться (а почему бы и нет?), но выполняться точно не будет.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

gal, по моему вам стоит начать изучение СИ с самого начала. - битовых операций (операции сдвига, поразрядные И/ИЛИ/исключающее ИЛИ)

gal
Offline
Зарегистрирован: 08.06.2018

Да, это и делаю, вот здесь получше видно.

http://sculland.com/ATmega168/Interrupts-And-Timers/16-Bit-Timer-Setup/

gal
Offline
Зарегистрирован: 08.06.2018

Которая строчка определяет частоту синуса ?

ISR (TIMER1_OVF_vect) {
static uint8_t  n=0;
?

 

nik182
Offline
Зарегистрирован: 04.05.2015

Строка 4 и 15 из второго сообщения.

gal
Offline
Зарегистрирован: 08.06.2018
1<<CS10             //  = Clock (No prescaling) = 16MHz 
1<<WGM13           // =  PWM mode
1<<COM1A1         // = Clear OC1A on Compare Match when up counting.
1<<COM1B1         //= Clear OC1B on Compare Match when up counting.
1<<COM1B0         // =  connects output to OC1B line = pinMode(9,OUTPUT);

Правильно ли я разобрался ?

Нашёл только один выход.