[ cukovanny @ 24.02.2018. 20:23 ] @
ukoliko ima dokonih gurua ARM-a, molio bih za jednu brzu pomoć.

nemam vremena (kratak je život) za iščitavanje brojnih funkcija registara bluepill-a, a treba pomoć i objašnjenje šta čovek ovde u ovom kodu radi da bi dobio PUSH PULL PWM sa dva kanala stm32f103 ?
ukratko koment za svaku liniju da bih svojeručno mogao preneti kod u arduino okruženje iz koga programiram stm32.
kod je sledeći:

Code:

#include "stm32f10x.h"
#include "stm32_ports.h"

#define TIM1_CH1N_PB        13
#define TIM1_CH1_PA         8
#define TIM1_CH2_PA         9

#define LED1_G_PC           9
#define LED2_B_PC           8

#define PWM_VALUE           20
#define TMR_T               200
#define DEADTIME            20

#define PP_MODE
//#define COMPL_MODE

void main(void)
{
    RCC->APB2ENR|=RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN | RCC_APB2ENR_TIM1EN;

    GPIOA->CRH=SET_CRH(TIM1_CH1_PA,M_OUT_50M,OUT_AF_PP) | SET_CRH(TIM1_CH2_PA,M_OUT_50M,OUT_AF_PP);
    GPIOB->CRH=SET_CRH(TIM1_CH1N_PB,M_OUT_50M,OUT_AF_PP);
    GPIOC->CRH=SET_CRH(LED1_G_PC,M_OUT_50M,OUT_GP_PP) | SET_CRH(LED2_B_PC,M_OUT_50M,OUT_GP_PP);

#ifdef PP_MODE
    //CH1: PWM mode 2, CH2: PWM mode 1, preload enabled on all channels
    TIM1->CCMR1=TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0 | TIM_CCMR1_OC1PE | TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2PE;
    TIM1->CCER=TIM_CCER_CC1E | TIM_CCER_CC2E;
    TIM1->BDTR=TIM_BDTR_MOE;
    TIM1->CCR1=TMR_T - PWM_VALUE;
    TIM1->CCR2=PWM_VALUE;
    TIM1->ARR=TMR_T;
    TIM1->CR1=TIM_CR1_ARPE | TIM_CR1_CMS_1 | TIM_CR1_CMS_0;
    TIM1->CR1|=TIM_CR1_CEN;
    TIM1->EGR=TIM_EGR_UG;
#endif


zašto bi mi pomogli ?
zato što ću ovde dati moj kod za istu stvar na atmega168 kontrolerima.
možda nekome bude trebalo.
sigurno će trebati.
pozdrav svima.
[ bogdan.kecman @ 25.02.2018. 01:04 ] @
ne kontam pitanje, pa copy / paste ovoga u stm32duino okruzenje ce da radi ne mora menjas nista ako se ja dobro secam? ... nema bas niko dovoljno dokon al evo nesto na brzaka

Code:

RCC->APB2ENR|=RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN | RCC_APB2ENR_TIM1EN;


podesava rcc paraetre (Reset and Clock Control System) - pali klok na APB2 periferiji IOPA, IOPB, IOPC i TIMER1

Code:

    GPIOA->CRH=SET_CRH(TIM1_CH1_PA,M_OUT_50M,OUT_AF_PP) | SET_CRH(TIM1_CH2_PA,M_OUT_50M,OUT_AF_PP);
    GPIOB->CRH=SET_CRH(TIM1_CH1N_PB,M_OUT_50M,OUT_AF_PP);
    GPIOC->CRH=SET_CRH(LED1_G_PC,M_OUT_50M,OUT_GP_PP) | SET_CRH(LED2_B_PC,M_OUT_50M,OUT_GP_PP);

CRH je "gornjih 16 bitova", znaci postavlja za portove A, B i C pinove (gore su ti definisani koji su pinovi u #define delu) na 1
(source: http://embedded-lab.com/blog/stm32-gpio-ports-insights/ )

ovo ti je crh registar


ovo ti je objasnjenje sadrzaja registra


Code:

   //CH1: PWM mode 2, CH2: PWM mode 1, preload enabled on all channels
   TIM1->CCMR1=TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0 | TIM_CCMR1_OC1PE | TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2PE;
   TIM1->CCER=TIM_CCER_CC1E | TIM_CCER_CC2E;
   TIM1->BDTR=TIM_BDTR_MOE;
   TIM1->CCR1=TMR_T - PWM_VALUE;
   TIM1->CCR2=PWM_VALUE;
   TIM1->ARR=TMR_T;
   TIM1->CR1=TIM_CR1_ARPE | TIM_CR1_CMS_1 | TIM_CR1_CMS_0;
   TIM1->CR1|=TIM_CR1_CEN;
   TIM1->EGR=TIM_EGR_UG; 

pise gore u komentaru, pali pwm1 na mode 2, pwm2 na mode1 pali u pokrece iste


imas ovde semu tajmera ( source: http://embedded-lab.com/blog/stm32-timers/ )


inace iz http://www.st.com/content/ccc/...translations/en.DM00042534.pdf
Citat:


The timer is able to generate PWM in edge-aligned mode or in center-aligned mode with a frequency determined by the value of the TIMx_ARR register, and a duty cycle determined by the value of the TIMx_CCRx register.

PWM mode 1
• In up-counting, channelx is active as long as CNT< CCRx, otherwise it is inactive.
• In down-counting, channelx is inactive as long as CNT> CCRx, otherwise it is active.

PWM mode 2
• In up-counting, channelx is inactive as long as CNT < CCRx, otherwise it is active.
• In down-counting, channelx is active as long as CNT > CCRx, otherwise it is inactive.

Note:
Active when OCREF = 1, inactive when OCREF = 0.
To configure the timer in this mode:
1. Configure the output pin:
a) Select the output mode by writ ing CCS bits in CCMRx register.
b) Select the polarity by writing the CCxP bit in CCER register.
2. Select the PWM mode (PWM1 or PWM2) by writing OCxM bits in CCMRx register.
3. Program the period and the duty cycle respectively in ARR and CCRx registers.
4. Set the preload bit in CCMRx register and the ARPE bit in the CR1 register.
5. Select the counting mode:
a) PWM edge-aligned mode: the counter must be configured up-counting or down-counting.
b) PWM center aligned mode: the counter mode must be center aligned counting mode (CMS bits different from '00').
6. Enable the capture compare.
7. Enable the counter.


u svakom slucaju savet je mani se arduina, skini atolic true studio (sad se zove valjda stm32 true studio), full je ide i free je i radi do jaja sa stm32, skini cubemx, tamo lepo nacrtas sta oces i on ti izgenerise sve ovo ... ako vec neces da citas sta je koji registar onda klikci i zaobidji stm32duino

[ cukovanny @ 25.02.2018. 06:54 ] @
bogdane, pa ovo je najbolja indirektna pomoć u svetskoj konkurenciji na olimpijadi indirektnih pomoći :)

Citat:
ne kontam pitanje, pa copy / paste ovoga u stm32duino okruzenje ce da radi ne mora menjas nista ako se ja dobro secam?


ne radi u stm32duino okruženju sa copy/paste ni iz daleka. onaj koji je portovao funkcije , promenio je nomenklaturu, tako da klasa npr. TIM1 iz originalnog koda, u stm32duino okruženju dobija ime TIMER1_BASE..... e sad, logika kaže ajde jedan od članova te klase je CCMR - to prolazi, ali bitset, odnosno maska TIM_CCMR1_OC1M_2 ili TIM_CCMR1_OC1M_1 ili TIM_CCMR1_OC1M_0 nema nikakve šanse ... a dokumentacija za stm32duino je štura ...

arduinov kompajler vraća: error , TIM_CCMR1_OC1M_2 was not declared in this scope !



enivej, ostaje mi da iščitavam za sada stm32duino dokumentaciju, uz veliku prednost koju mi ti dade...


Citat:
u svakom slucaju savet je mani se arduina, skini atolic true studio (sad se zove valjda stm32 true studio), full je ide i free je i radi do jaja sa stm32, skini cubemx, tamo lepo nacrtas sta oces i on ti izgenerise sve ovo


to je sjajno! treba li neki hw specijalan za upucavanje koda ili ?
[ MilanCeNS @ 25.02.2018. 07:06 ] @
Ja već godinama čitam Bogdanove odgovore na mnoga pitanja i oduševljavam se
koliko ima volje i želje da pomogne. Svaka čast.
[ cukovanny @ 25.02.2018. 08:34 ] @
istina.

da objasnim šta radim i zbog čega pokrenuo temu :

radim (meni) zanimljiv projekat MCU kontrolisanog smps buck/bust tipa.
to treba da bude integrisano okruženje sa LCD info na prvu ruku U(in) / U(out), I(in) / I (out) , remote ethernet parametri, digitalna štela izlaza, ogr. struje itd itd. sve to na FN sistemima... Integrisani invertor monofazni/dvofazni/trofazni ... itd itd


ovakva rešenja da se kupe gotova, cenovna kategorija zavisno od snage ide od 500eur do 20k eur.


avr sam pretresao insideout. dspic mi nije ciljana platforma, ali stm32f10X je logična.
mali ima snage za sve što mi treba.
na žalost, atmega ima snage samo toliko da radi korekciju pwm , ma koja topologija smps-a bila ...
ima, doduše, malo preko snage da se poneki potrošač uklj isklj , i to samo ako se radi sa kompariranjem, nikako A/D ulazima.

brzina korekcije napona izlaza smps u sledećem kodu AVR-a (obećao sam) je oko 20.000 puta u sekundi.
stvar radi lepo i sa velikim snagama. ali to nije tema ovog posta i foruma.
pwm je 100Khz, "phase correct pwm" , deathtime propisan. H most zadovoljan.

Code:
// 03.02.2018       100kHz
// Pin 9 i 10 su izlazi PWM
// A0 piše kec ili 0 u zavisnosti kako si podesio v.divider ili tl431 ako hoćeš opto razdvajanje

#define Kristal 16000000            // kristal arduina 16mhz
#define Frekvencija 100000            // ovde ide frekv pwm koja ti treba

#define VrednostICR1 Kristal/Frekvencija/2
#define VrednostOCR1A (VrednostICR1 / 2) + 10
#define VrednostOCR1B (VrednostICR1 / 2) - 10

//-----------------------------------------------------------------------
//
//-----------------------------------------------------------------------
void setup() {
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);

  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1 = 0;

  TCCR1B |= _BV(CS10);


  ICR1 = VrednostICR1;

  OCR1A = VrednostOCR1A;
  TCCR1A |= _BV(COM1A1) | _BV(COM1A0);

  OCR1B = VrednostOCR1B;
  TCCR1A |= _BV(COM1B1);

  TCCR1B |= _BV(WGM13);
  TCCR1A |= _BV(WGM11);
}
//-----------------------------------------------------------------------
// pin A0 komparator 2.2V valjda, ili je 1.1V ?!?, proveri koji je nivo bapona jedinica u atmega168 ???
//-----------------------------------------------------------------------
void loop()
{
  if (PINC & 1)            // arduino A0 pin atmega168
  {
    OCR1A = VrednostICR1;
    OCR1B = 0;
  }
  else
  {
    OCR1A = VrednostOCR1A;
    OCR1B = VrednostOCR1B;
  }
}


UPDATE : referentni nivo jedinice u atmega je okolo 2.2-2.3VDC

[ goran_68 @ 25.02.2018. 09:29 ] @
Mislim da ti je bolja platforma STM32F4 ili čak STM32F7. Imaš familije sa LCD i ethernet kontrolerom na čipu, imaš DSP i FPU, moćniji sistem tajmera za PWM... Takođe, što bi se uopšte zezao sa xxxduino. Uzmi lepo Atollic, CubeMX, STM32Cube_FW_F4 ili STM32Cube_FW_F7 i neki STM32_Discovery i vozi.
[ bogdan.kecman @ 25.02.2018. 13:29 ] @
Citat:
cukovanny:
ne radi u stm32duino okruženju sa copy/paste ni iz daleka.

pih bre, na prvi pogled je delovalo da je 1/1

Citat:
cukovanny:
Citat:
u svakom slucaju savet je mani se arduina, skini atolic true studio (sad se zove valjda stm32 true studio), full je ide i free je i radi do jaja sa stm32, skini cubemx, tamo lepo nacrtas sta oces i on ti izgenerise sve ovo

to je sjajno! treba li neki hw specijalan za upucavanje koda ili ?


pa vidi ti u svaki ARM mozes da upucas sw preko seriskog porta to si do sada valjda skontao.. truestudio sigurno nece raditi kroz arduino bootloader na bluepill-u ili sta vec od stm32duino hw-a koristis ali taj bootloader je svakako uzas tako da ga savetujem zaobilaziti svakako...

ne znam sta od hw-a trosis ali obzirom da pises o F103 kontam da si verovatno kupio par bluepill-a ili redpill-a posto je to najjeftinija plocka sa 103 koju mozes da nadjes :D (obrati paznju na bluiepill R10 je 10k umesto 1k5 usb pullup i zbog toga usb ne radi svuda kako treba, zamenis taj otpornik sa 1k5 i radi usb mnogo bolje) ... elem, ako imas bluepill nekoliko komada mozes jedan da promovises u black magic probe - odlican debuger i programer alat... ili, sto je idealna varijanta, uzmes ovako nesto za 3-4$:
https://www.ebay.com/itm/Mini-...M32-w-Metal-Shell/122929448536
https://www.ebay.com/itm/Mini-...STM32-Metal-Shell/152216586407
to ti je stlink v2 klon podrzava ga skoro sve sto radi sa armovima direkt debagiras iz truestudia ili keila ili ...

tako da.. stm32cubemx prvo, u njemu naklikas i konfigurises svu periferiju, on ti izgenerise projekat za truestudio (ili keil ili ..) i onda ucitas projekat u truestudio i vozi misko
https://pasteboard.co/H9hkLYi.png

https://pasteboard.co/H9hlo12.png

https://pasteboard.co/H9hlLYX.png

[ bogdan.kecman @ 25.02.2018. 13:47 ] @
inace slazem se sa kolegom da ti je F4 ili F7 bolje resenje, ne samo zbog dsp i fpu vec ako hoces da imas eternet i lcd onda ti je F1 malecan ...

pogledaj razne discovery plocke ovde: http://www.st.com/en/evaluatio...querycriteria=productId=LN1848
http://www.st.com/content/st_c...ery-kits/32f746gdiscovery.html
http://www.st.com/content/st_c...ery-kits/32f429idiscovery.html

malo vise kosta nego bluepill ali kad pogledas sta sve dobijes isplati se
[ goran_68 @ 25.02.2018. 16:20 ] @
Treba ti žešća matematika za konvertor koji misliš uraditi. Neće moći STM32F1xx a dsPIC je mnogo bolje rešenje nego taj STM. U praznom hodu i nekako ali zamisli šta se dešava pri naglim promenama opterećenja. Moraš da imaš regulaciju a za to ti treba matematika. LCD ima da ti bude najmanja briga. Evo ti jedan AN od ST baš na tu temu "Buck-boost converter using the STM32F334 Discovery kit":

http://www.st.com/content/ccc/...translations/en.DM00108726.pdf
[ cukovanny @ 25.02.2018. 19:17 ] @
hvala kraljevi na savetima, ali ja sam samo obična amaterčina koji uživam u smps-u, konverzijama energija itd....
volim i mikrokontrolere i to mi je sve deo hobija koji jako volim i "gubim" mnogo vremena .... samim tim sam daleko od nivoa znanja koji se zahteva za ono što mi preporučujete.

sve što sam radio oko MCU su 8pin/8bit atmel i sada arduino/atmega...
u elektronici sam isto tako početnik.

kad vidim koliko toga moram savladati u stm32 familiji kontrolera, dođe mi da odem na neki odmor od 5 meseci samo da mu povatam registre i flow :)

mada, iz iskustva znam da će to sve doći radom i trudom....

Citat:
goran_68: Treba ti žešća matematika za konvertor koji misliš uraditi. Neće moći STM32F1xx a dsPIC je mnogo bolje rešenje nego taj STM. U praznom hodu i nekako ali zamisli šta se dešava pri naglim promenama opterećenja. Moraš da imaš regulaciju a za to ti treba matematika. LCD ima da ti bude najmanja briga. Evo ti jedan AN od ST baš na tu temu "Buck-boost converter using the STM32F334 Discovery kit":

http://www.st.com/content/ccc/...translations/en.DM00108726.pdf


za sada sam hteo da ono parče koda sa početka teme "preteram" u arduino ide, i da mi to proradi, pa da vidim kakav će tranzijentni odziv imati smps kojeg pogoni stm32f103 i kojeg simultano mori upravljanje lcd i ethernetom.... međutim dokumentacija i primeri na netu su gotovo nepostojeći .... nigde ne mogu da nađem kako je dasa koji je portovao librarije nazvao delove registra i maske kad ih je preneo u arduino ide...


vidim ja, učiće se taj stm32cubemx i da se kupuje st-link....

Citat:
bogdan.kecman:
ne znam sta od hw-a trosis ali obzirom da pises o F103 kontam da si verovatno kupio par bluepill-a ili redpill-a posto je to najjeftinija plocka sa 103 koju mozes da nadjes :D (obrati paznju na bluiepill R10 je 10k umesto 1k5 usb pullup i zbog toga usb ne radi svuda kako treba, zamenis taj otpornik sa 1k5 i radi usb mnogo bolje) ... elem, ako imas bluepill nekoliko komada mozes jedan da promovises u black magic probe - odlican debuger i programer alat... ili, sto je idealna varijanta, uzmes ovako nesto za 3-4$:
https://www.ebay.com/itm/Mini-...M32-w-Metal-Shell/122929448536
https://www.ebay.com/itm/Mini-...STM32-Metal-Shell/152216586407
to ti je stlink v2 klon podrzava ga skoro sve sto radi sa armovima direkt debagiras iz truestudia ili keila ili ...



trošim STM32F103C8T6, to je valjda bluepill. nabavio 10 komada za sitne pare. privukao me je snagom , cenom , jednostavnošću (khm, khm) ...
jes jednostavan kad hoćeš nešto jednostavno, ali složeni poslovi zahtevaju ozb posvećenost. vidim da je loše portovan čitav i2c i wire i da ne radi (kažu radi).
pročitaću sve što si mi napisao detaljno. volim ekstrakte znanja , ali isto tako svestan da prečica nema ....

[ goran_68 @ 25.02.2018. 20:13 ] @
Ako ti treba postovaću ovde par primera za blue pill i CUbeMX
[ mikikg @ 25.02.2018. 21:40 ] @
Pogledaj ovo za pocetak:
http://www.elitesecurity.org/p3794487

Preporucujem ti da uzmes Keil MDK ARM, Arduino IDE "posle" ... : )

Tajmere od STM32 bi valjalo da savladas, mora se cita dokumentacija, evo cookbook sta sve rade sa njima:
http://www.st.com/content/ccc/...translations/en.DM00236305.pdf

Taj PWM u STM32F103 je "onako", prosecan, ima ovakvu rezoluciju naspram generisane frekvencije:

16bit @~1kHz,
15bit @2k,
14bit @4k,
13bit @8k,
12bit @16k,
11bit @32k,
10bit @64k
9bit @128k
8bit @256k

Recimo dsPIC33EP64MC202 tuce ove rezultate 3-4x bolje i ako je 16bitni kontroler (DSC), famozni Texas Instruments isto 16bit DSC Piccolo tuce te rezultate 10x, dok njihov Delfino tuce jedno 15x !!!
Piccolo ima 150ps rezoluciju PWM-a, Delfino 70ps (piko sekunde)!
Drugi ST ARM kontroleri imaju HRPWM, pogledaj malo oko toga, cisto da znas kakve su mogucnosti i sta mozes da ocekujes ...

ST-LinkV2 nabavi, to je stalno potrebna stvarcica a to ce ti ustedeti gomilu muka sa USB i bootloaderima i cudima raznim, uzmes Keil i taj programator, nabodes na Blue Pill i vozi Misko, imas odlican debug i teraj, snalazi se, to je to :)
[ mikikg @ 25.02.2018. 22:24 ] @
Jos malo dokumentacije oko STM32 tajmera:
http://homepage.cem.itesm.mx/c...rs/SLIDES/STM32F3%20Timers.pdf
http://mazsola.iit.uni-miskolc...4/DM00042534_stm32f4_timer.pdf

Ovo je za F7 tajmere, imaju neke jos dodatne opcije koje nemaju druge serije:
http://www.st.com/content/ccc/...n.STM32F7_WDG_TIMERS_GPTIM.pdf

Dithering za poboljsanje rezolucije:
http://www.st.com/content/ccc/...translations/en.DM00119042.pdf

Tajmeru su im generalno vrlo "mocni" ali i kompleksni, srz je skontati kako oni interno rade i kako se to moze iskoristi za neku konkretnu potrebu, ima gomila mogucih kombinacija resenja sa tajmerima, uvezu se medjusobno ovako-onako, preko DMA sa A/D konverterom i tako dalje, krenes lagano od pocetka samo da pokrenes PWM na nekoj ucestanosti u open-loop postavci pa posle dalje redom jedno po jedno resavas, tu ne pomaze ni Arduino ni CubeMX, jednostavno mora da se poznaje interna struktura tajmer modula da bi mogao da odradis ono sto hoces. Cak tu postoje vrlo specificne funkcije bas predvidjene za SMPS, postoje break-inputi (fault) i dead-time generator, to je bas za to predvidjeno ali moras da skontas tacno kako to interno funkcionise da bi mogtao da iskoristis.

Kad ti se to malo "zavrti" onda predji na A/D konverter pa probaj da stavis to u kontrolnu petlju ... tu pocinje veselje ali dok dodjes dotle neke stvari ce ti biti jasnije ili pitaj ovde sta nije jasno ...



[Ovu poruku je menjao mikikg dana 26.02.2018. u 00:40 GMT+1]
[ mikikg @ 25.02.2018. 22:51 ] @
PS: Keil je super zgodan jer mu je KOMPLETNA definicija svih registra i flagova u jednom heder fajlu stm32f10x.h, 98% svih naziva se uglavnom poklapa sa oficialnom dokumentacijom a i ako nesto se ne poklapa, caskom moze da se skoci u taj fajl i pronadje tacna definicija tako da nema previse lutanja kao sa ostalim StdLib-ovima i gomilom overhead krsha koji dodaju Arduino i CubeMX, tu se vrte prakticno 4-5 neka registra koja zavrsavaju posao koje prozivas u po jednoj C instrukciji, prosto ...
[ mikikg @ 25.02.2018. 23:11 ] @
Pitanje za iskusnije STM-ovce, sto ne moze onda da se Blue Pull pretvori u ST-LinkV2 (ne u Black Magic Probe) ?

Jel ima HEX negde za ST-LinkV2? (mora da ga ima negde cim kinezi to stancuju na tone)

Kako isprogramirati to ako korisnik na lageru ima samo Blue Pill(ove) i seriske adaptere? : )

Da se prvo napravi BMP od Blue Pill preko BOOT1-USART, pa sa njim da se upuca HEX za St-LinkV2, ili moze da se preskoci BMP korak?
[ bogdan.kecman @ 26.02.2018. 01:43 ] @
- sto bre keil koji kosta ko bubreg kad je truestudio sada bedza, a u
kombinaciji sa cubemx i jedan i drugi koriste potpuno iste hedere (te su
definicije portova, registara i slicno absolutno identicne)... pri tome
je truestudio sada u vlasnistvu stm-a i radi besno sa svim stm32 cipovima?

- moze bluepill u st-link v2 direktno, upucas mu direkt hex od st-linkv2
sa nekim drugim programatorom (drugim stiinkom) .. mada su vec gotovi
stlinkovi toliko bedza da se ne isplati :D (nisam otvarao da vidim dal
je unutra st32 ili gd32, gd32 je brza kopija pogledaj sta je sjaak pisao
kod njega na blogu https://smdprutser.nl/blog/category/gd32/ )
[ bogdan.kecman @ 26.02.2018. 01:47 ] @
inace trenutno no1 ide po meni je https://www.embitz.org/ ... em je
free, em je mali, em je sumanuto brz em su uspeli da nabudze svoj
debuger koji izvlaci kroz stlinkv2 stvari koje nijedan drugi debuger ne
moze, tj za koje svi debugeri zahtevaju one 500eur+ jtag adaptere... tj.
ima "live variables" i "EBmonitor" (i nije vezan za stm radi sa svima)
... mada ja za pocetnike poput kolege op-a savetujem stm32cubemx +
truestudio .. mnogo bolji ide od keila, dzaba, potpuno podrzan od strane
stm-a, isprobano dobar i stabilan..
[ cukovanny @ 26.02.2018. 06:47 ] @
Citat:
goran_68: Ako ti treba postovaću ovde par primera za blue pill i CUbeMX


ajde goran_68
idi u detalje koliko ti vreme i obaveze dozvoljavaju.
ja sam trenutno u hendikepu jer nemam taj mali Mini ST-Link V2 Stlink Emulator Downloader Programming STM8 STM32 w/ Metal Shell.
ali ide jedan iz kine i jedan iz bg, "paćmo gubit zimskoga vremena" :)


kolega mikikg, neka si se uključio, znam da voliš dsPic :)
ima u ovom projektu tvojih zasluga , ali i direktnih komponenti, ali o tome tamo u podforumu elektronika :)
reduciri footprintova koje si mi poklonio su mi bili presudni da počnem da se bavim sa integralcima veličine kapljice kalaja na lemilu :)
odoh sad na posao pa te čitam posle.
pozdrav svima.
[ bogdan.kecman @ 26.02.2018. 06:53 ] @
za pocetak instaliraj stm32cubemx i probaj ga, klikci po njemu
[ bogdan.kecman @ 26.02.2018. 07:57 ] @
prva dva videa za startup

https://www.youtube.com/watch?v=YZjnCOun1wU

https://www.youtube.com/watch?v=JnmjmP2Xchg
[ mikikg @ 27.02.2018. 02:58 ] @
Kad se malo zadje dublje u te tajmere i PWM, onda vidis da je isto tako jednostavno uraditi i full-bridge i jos preko toga dodati jedan PWM za neku "ZVS/ZCS Macolijadu" i sa onim Si8233 drajverima mozes da napravis kilovatni pretvarac za koje hoces napone i struje : ) ... Inace mi fali jedan od 200+A ... :D
Samo se sloze tajmeri i konfigurisu da tacno to rade i to je opako dobra tehnika. Naravno neophodno je prvo poznavanje topologije pretvaraca pa tek onda to sprovesti u ARM code sto sve zajedno nije bas lako, ali tu smo pa pitaj sve sto ti nije jasno.

Moguce je praviti trofazne pretvarace, moguce je uraditi isto jako zanimljive polifazne-buck-ove, moze isto Ćuk konverter da se napravi sa istovremenom buck/bust funkcijom!
Pa su tu jos i LLC, pa onda sve vise potrebna stvar za sinhrone ispravljace u sekundaru i tako dalje.

Jedan MCU moze da odradi prakticno celu logiku pretvaraca za bilo koju topologiju, iskoriste se skoro svi resursi u MCU i samo to radi, tako da LCD/Display/Touch, mreza WiFi, LAN ovo-ono to taj MCU ne moze da radi niti treba to taj MCU da radi : ) Odvoji jeda USART (opciono galvanski razdvojen) pa pricaj sa nekim drugim MCU koji se bavi tim stvarima.

[Ovu poruku je menjao mikikg dana 27.02.2018. u 04:17 GMT+1]
[ cukovanny @ 27.02.2018. 09:19 ] @
Citat:
mikikg: Kad se malo zadje dublje u te tajmere i PWM, onda vidis da je isto tako jednostavno uraditi i full-bridge i jos preko toga dodati jedan PWM za neku "ZVS/ZCS Macolijadu" i sa onim Si8233 drajverima mozes da napravis kilovatni pretvarac za koje hoces napone i struje : ) ... Inace mi fali jedan od 200+A ... :D
Samo se sloze tajmeri i konfigurisu da tacno to rade i to je opako dobra tehnika. Naravno neophodno je prvo poznavanje topologije pretvaraca pa tek onda to sprovesti u ARM code sto sve zajedno nije bas lako, ali tu smo pa pitaj sve sto ti nije jasno.

Moguce je praviti trofazne pretvarace, moguce je uraditi isto jako zanimljive polifazne-buck-ove, moze isto Ćuk konverter da se napravi sa istovremenom buck/bust funkcijom!
Pa su tu jos i LLC, pa onda sve vise potrebna stvar za sinhrone ispravljace u sekundaru i tako dalje.

Jedan MCU moze da odradi prakticno celu logiku pretvaraca za bilo koju topologiju, iskoriste se skoro svi resursi u MCU i samo to radi, tako da LCD/Display/Touch, mreza WiFi, LAN ovo-ono to taj MCU ne moze da radi niti treba to taj MCU da radi : ) Odvoji jeda USART (opciono galvanski razdvojen) pa pricaj sa nekim drugim MCU koji se bavi tim stvarima.

[Ovu poruku je menjao mikikg dana 27.02.2018. u 04:17 GMT+1]


što se tiče zvs/zcs, daleko smo od toga ... tek smo provalili malo topologije i zagrebali ispod površine onoga što svaki laik vidi kao "trafo brale" :)
tek smo (persiram sebi) savladali malo topologije half bridge, full bridge ... ma i to nismo dobro baš savladali ...
si8233 mi stoje, nisam ih proučavao zbog nedostatka životnoga vremena, a dizajn koji radim se zasniva baš na "macolijadi 2000" :) malo je to izmenjeno , ali u suštini lepo radi, čak i sa atmega168 kontrolom. planiram kobogda u 62.oj godini :) da počnem da se bavim i invertorima, za početak monofaznim.

dok se proučava literatura od goran_68 i bogdan_kecman, sinoć sam uradio izmenjeni i dopunjeni kod kvalitetnog push pulla za atmega168/328.
MCU sada koriguje pwm ispunu od zadatog do zadatog, a ciklusi kontrole su na 30Khz bukvalno "pulse to pulse". ja radim na 100Khz pa mi ne smeta kontrola na svako tri pulsa. kod je konačan i dobro radi.

Code:
// 26.02.2018
// Pin 9 i 10 su izlazi PWM
// A0 pin meri napon

#define Kristal 16000000            // Kristal Atmega168 NE MENJAJ
#define Frekvencija 100000                                            // PODESI FREKV . DOZVOLJENO JE DO 300kHz

#define VrednostICR1 Kristal/Frekvencija/2
// 47.5% duty cycle

#define PeriodICR1 VrednostICR1 / 2

#define DeadTime 5                              // PODESAVANJE DEADTIME-A. OD 1 DO 10 JE OK.
#define VrednostOCR1A PeriodICR1 + DeadTime
#define VrednostOCR1B PeriodICR1 - DeadTime

unsigned int OstvareniDuty=0,Duty=0;

//-----------------------------------------------------------------------
//
//-----------------------------------------------------------------------
void setup()
{
    pinMode(9, OUTPUT);
    pinMode(10, OUTPUT);

    TCCR1A = 0;
    TCCR1B = 0;
    TCNT1 = 0;

    TCCR1B |= _BV(CS10);


    ICR1 = VrednostICR1;

    OCR1A = VrednostICR1;
    TCCR1A |= _BV(COM1A1) | _BV(COM1A0);

    OCR1B = 0;
    TCCR1A |= _BV(COM1B1);

    TCCR1B |= _BV(WGM13);
    TCCR1A |= _BV(WGM11);
}
//-----------------------------------------------------------------------
//
//-----------------------------------------------------------------------
void loop()
{
    if(PINC & 1)                                  // Arduino A0 pin atmega168&328. Maska je &2 za pin 1, &4 za pin2 itd ...
        {
        OCR1A = VrednostICR1;
        OCR1B = 0;
        OstvareniDuty /= 2;
        }
    else
        {
        if(OstvareniDuty < 50)                // PODESITI MAX DUTY PREMA PRORACUNU SMPS. MAX JE 90%
            OstvareniDuty++;

        Duty = OstvareniDuty;
        Duty *=PeriodICR1;
        Duty /=100;
  
        OCR1A = VrednostICR1-Duty;
        OCR1B = Duty;
        }
}


[Ovu poruku je menjao cukovanny dana 27.02.2018. u 11:39 GMT+1]
[ cukovanny @ 08.03.2018. 12:20 ] @
dopuna:

važna stvar: atmegaXXX ima watchdog koji je poseban oscilator na chipu.
naravski, treba za ovakav projekat koristiti istoga:


u include delu koda ide:
Code:
#include <avr/wdt.h>




u setup() delu koda:
Code:
wdt_enable(WDTO_15MS);




na kraju loop() petlje ide:
Code:
wdt_reset();




pade mi na pamet , jer će ovaj smps da ide na 1700m nadmorske đe će da pucaju gromovi letos fino.
videćemo da li će , i koliko preživeti ...



[ cukovanny @ 17.03.2018. 21:23 ] @
hehe osećam se kao da vodim unutrašnji monolog, elem, još uvek dok se proučava CubeMX i Atollic i čeka STLink...
proučavam stm32f10x.h i našao sam vrednosti bitova registra TIM_CCER

/******************* Bit definition for TIM_CCER register *******************/
#define TIM_CCER_CC1E ((uint16_t)0x0001) /*!<Capture/Compare 1 output enable */
#define TIM_CCER_CC1P ((uint16_t)0x0002) /*!<Capture/Compare 1 output Polarity */
#define TIM_CCER_CC1NE ((uint16_t)0x0004) /*!<Capture/Compare 1 Complementary output enable */
#define TIM_CCER_CC1NP ((uint16_t)0x0008) /*!<Capture/Compare 1 Complementary output Polarity */
#define TIM_CCER_CC2E ((uint16_t)0x0010) /*!<Capture/Compare 2 output enable */
#define TIM_CCER_CC2P ((uint16_t)0x0020) /*!<Capture/Compare 2 output Polarity */
#define TIM_CCER_CC2NE ((uint16_t)0x0040) /*!<Capture/Compare 2 Complementary output enable */
#define TIM_CCER_CC2NP ((uint16_t)0x0080) /*!<Capture/Compare 2 Complementary output Polarity */
#define TIM_CCER_CC3E ((uint16_t)0x0100) /*!<Capture/Compare 3 output enable */
#define TIM_CCER_CC3P ((uint16_t)0x0200) /*!<Capture/Compare 3 output Polarity */
#define TIM_CCER_CC3NE ((uint16_t)0x0400) /*!<Capture/Compare 3 Complementary output enable */
#define TIM_CCER_CC3NP ((uint16_t)0x0800) /*!<Capture/Compare 3 Complementary output Polarity */
#define TIM_CCER_CC4E ((uint16_t)0x1000) /*!<Capture/Compare 4 output enable */
#define TIM_CCER_CC4P ((uint16_t)0x2000) /*!<Capture/Compare 4 output Polarity */
#define TIM_CCER_CC4NP ((uint16_t)0x8000) /*!<Capture/Compare 4 Complementary output Polarity */



nađem nekog zemljaka koji iz nekog razloga sa par redova iz stm32duino okruženja lako podešava dva komplementarna PWM sledećim linijama koda:

Code:
#define PWM_OUT PA8                                       //prvi PWM
#define PWM_OUT_COMP PB13                            //invertovani PWM

HardwareTimer timer1 = HardwareTimer(1);
timer1.setPrescaleFactor(1);
timer1.setPeriod(10);                                         //period 10 je 100kHz... 

  
  pinMode(PWM_OUT, PWM);                              // podesimo da je prvi izlaz tipa pwm
 pinMode(PWM_OUT_COMP, PWM);                     // isto drugi izlaz pwm

  
  timer_dev *t = TIMER1;                                //refers t to Timer 8 memory location, how to read back?
  timer_reg_map r = t->regs;
   

  bitSet(r.adv->CCER,0);                                //this should enable complimentary outputs
  bitSet(r.adv->CCER,2);


.... te se uz pomoć gornjih redova koda sada lako podešava ispuna pwm funkcijom na pinu PWM_OUT što automatski prati komplementarna vrednost na pinu PWM_OUT_COMP. funkcija koja se koristi je pwmWrite(gpioPIN,duty);

pitanje> da li se izmenom vrednosti CCER registra na druge vrednosti može lako dobiti push pull na PA8 i PB13 umesto komplementarnog, i ako da koje vrednosti da stavim umesto 0 i 2 ?
[ bogdan.kecman @ 17.03.2018. 22:23 ] @
Citat:
da li se izmenom vrednosti CCER registra na druge vrednosti
može lako dobiti push pull na PA8 i PB13 umesto komplementarnog,
i ako da koje vrednosti da stavim umesto 0 i 2 ?


cek, ne razumem, kako mislis push/pull na pa8 i pb13 umesto komplementarnog?

to su dve potpuno razlicite stvari o kojima pricas, push/pull je tip
izlaza pina, hardwerski tip izlaza, da li je pin push/pull (forsirano
vcc za high i forsirano vss za low) ili je open drain (forsirano vss za
low, hiz za high), pa dodatno moze da ima pull-up i pull-down otpornik...

to nema nikakve veze sa logicki sta se nalazi na tom pinu (ako je na pwm
pinu izlaz high na pwm komplementarnom je low - uz eventualnu neku dead
time kalkulaciju)

tako da na sta mislis kada kazes push pull izlaz iz pwm-a ?

znam da to postoji kao "push pull pwm" arhitektura smps uredjaja ali bas
zbog toga valjda i imas taj komplementarni izlaz, da bi jedan vezao na
push tradnzu a drugi na pull trandzu
[ mikikg @ 18.03.2018. 11:58 ] @
Mozda ovo pomogne:
http://we.easyelectronics.ru/_...mere-1-kontrollerov-stm32.html

U push-pull pwm modu Duty mora bit manji od 50% ...
[ cukovanny @ 19.03.2020. 06:23 ] @
ajmo još jednom probamo da oživimo temu uz rizik da tražim pomoć iskusnijih kolega bez uloženog truda.
ovo dve godine sam prečešljo internet uzduž i popreko i nikog živog nema da je napravio push pull pwm na STM32F103C (popularni bluepill) u popularnom arduino IDE, a da je to objavio negde....
radimo na tome ja i kolega pomalo kad se ima vremena, ali uglavnom se svede na to da je previše registara, previše datasheet-a, a premalo iskustva sa stm32. po vašim savetima sam jurio i stm32cube ali kako vidim svelo se na to da nazirem jedno 2 godine života spucano na učenje stm32...

ima neko ovde da ima volje komercijalno da prevede ovaj kod u stm32duino okruženje ?
pošto je pandemija korone i kućni pritvor, možda je sad pravi trenutak za to???
ponude na PP.

treba mi ovaj kod preveden da radi u stm32duino okruženje sa stm32f103 (bluepill), tako da imam subrutinu kojoj dam frekvenciju i djuti i vozi !!!

Code:
#include "stm32f10x.h"
#include "stm32_ports.h"

#define TIM1_CH1N_PB        13
#define TIM1_CH1_PA         8
#define TIM1_CH2_PA         9

#define LED1_G_PC           9
#define LED2_B_PC           8

#define PWM_VALUE           20
#define TMR_T               200
#define DEADTIME            20

#define PP_MODE
//#define COMPL_MODE

void main(void)
{
    RCC->APB2ENR|=RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN | RCC_APB2ENR_TIM1EN;

    GPIOA->CRH=SET_CRH(TIM1_CH1_PA,M_OUT_50M,OUT_AF_PP) | SET_CRH(TIM1_CH2_PA,M_OUT_50M,OUT_AF_PP);
    GPIOB->CRH=SET_CRH(TIM1_CH1N_PB,M_OUT_50M,OUT_AF_PP);
    GPIOC->CRH=SET_CRH(LED1_G_PC,M_OUT_50M,OUT_GP_PP) | SET_CRH(LED2_B_PC,M_OUT_50M,OUT_GP_PP);

#ifdef PP_MODE
    //CH1: PWM mode 2, CH2: PWM mode 1, preload enabled on all channels
    TIM1->CCMR1=TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0 | TIM_CCMR1_OC1PE | TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2PE;
    TIM1->CCER=TIM_CCER_CC1E | TIM_CCER_CC2E;
    TIM1->BDTR=TIM_BDTR_MOE;
    TIM1->CCR1=TMR_T - PWM_VALUE;
    TIM1->CCR2=PWM_VALUE;
    TIM1->ARR=TMR_T;
    TIM1->CR1=TIM_CR1_ARPE | TIM_CR1_CMS_1 | TIM_CR1_CMS_0;
    TIM1->CR1|=TIM_CR1_CEN;
    TIM1->EGR=TIM_EGR_UG;
#endif

#ifdef COMPL_MODE
    //CH1: PWM mode with complementary output & deadtime
    TIM1->CCMR1=TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1PE;
    TIM1->CCER=TIM_CCER_CC1E | TIM_CCER_CC1NE;
    TIM1->BDTR=TIM_BDTR_MOE | DEADTIME;
    TIM1->CCR1=PWM_VALUE;
    TIM1->ARR=TMR_T;
    TIM1->CR1=TIM_CR1_ARPE;
    TIM1->CR1|=TIM_CR1_CEN;
    TIM1->EGR=TIM_EGR_UG;
#endif

    while (1)
    {
    }
}
[ mikikg @ 19.03.2020. 13:18 ] @
Vidi ovako, code koji si postavio (verujem da radi) je prilicno jednostavan, ima inicializaciju periferija (RCC, I/O, tajmeri itd) i nakon toga odmah ulazi u konfiguraciju TIM1 periferije i to je sve, dakle kada se upali odmah pocne da vrti tajmer.

Dobra stvar je sto je taj program pisan u stilu CMSIS (to je neki da kazemo low-level pristup) i kao takav moze direktno da se iskoristi u Arduino okruzenju jer su inace Arduinove high-level funkcije pisane u CMSIS, trebalo bi da bude 99% sve isto, ono sto nije isto mogu da budu nazivi registra/flagova ali uz malo kombinatorike i gledanju po header fajlovima moze da se skonta koji je tacan naziv, negde ima crtica, negde nema, fali slovo i tome slicno.

Dakle kreni sa praznim programom u Arduino i onda dodaj jednu po jednu instrukciju.
U sustini ceo taj code treba da ide u setup(), dakle jednom se poziva da izkonfigurise periferije i to je to.

U main() onda lagano kreni sa "korisnickim interfejsom" koji obraduje neke tvoje buttone ili potenciometre i kao rezultat da upisuje nove vrednosti u PWM_VALUE (za menjanje duty).
Menjanje frekvencije je po slicnom principu ali je jedino neophodno da preracunas nove vrednosti za CCR1 i ARR jer su duty i frekvencija medusobno zavisne, ako menjas frekvenciju promenice se i duty.

To bi bilo ukratko, probaj pa ako zapne pitaj ...

[ cukovanny @ 19.03.2020. 18:36 ] @
Citat:
Vidi ovako, code koji si postavio (verujem da radi) je prilicno jednostavan, ima inicializaciju periferija (RCC, I/O, tajmeri itd) i nakon toga odmah ulazi u konfiguraciju TIM1 periferije i to je sve, dakle kada se upali odmah pocne da vrti tajmer.


hi Miki, bio sam ubeđen da se niko neće javiti. nadam se da si ispravan i zdrav u ovo nezgodno vreme...
ljudi imaju otklon prema arduino ide, kao to nije okruženje za profesionalce itd itd.... meni je sve ok što mi je jednostavno i čini mi posao.



Citat:
Dobra stvar je sto je taj program pisan u stilu CMSIS (to je neki da kazemo low-level pristup) i kao takav moze direktno da se iskoristi u Arduino okruzenju jer su inace Arduinove high-level funkcije pisane u CMSIS, trebalo bi da bude 99% sve isto, ono sto nije isto mogu da budu nazivi registra/flagova ali uz malo kombinatorike i gledanju po header fajlovima moze da se skonta koji je tacan naziv, negde ima crtica, negde nema, fali slovo i tome slicno.


proveo sam dosta vremena pokušavajući da iskompajliram ovaj kod kakav jeste u samom arduino okruženju. iskren da budem - ja i ne znam u kom develope okruženju je ovaj kod od ovog rusa pisan. ali radi mu sigurno jer je dao oscilograme komplementarnog moda i PP moda.
da se vratim na kompajliranje u arduino ide - hmm ne ide ... kompajler se non stop žali , traži ovo traži ono , drž ne daj , prolazi to kroz još 12ak dependency fileova , itd itd...
čisto kao info, evo lista zavisnih datoteka koju ovaj kod poziva:

core_cm3.h
core_cmFunc.h
core_cmInstr.h
ioports.h
ioreg.h
stm32f10x.h
startup_stm32f10x.h
static_assert.h
stm32_ports.h
stm32f10x_conf.h
stm32f10x_gpio.h
i još dvetri koje ne vidim jer ne mogu da nateram tabova udesno više...

izgleda da je jedino rešenje jedna po jedna linija , to kako ti kažeš , i da se gledaju nazivi registara, flegovi itd itd...




Citat:
Dakle kreni sa praznim programom u Arduino i onda dodaj jednu po jednu instrukciju.
U sustini ceo taj code treba da ide u setup(), dakle jednom se poziva da izkonfigurise periferije i to je to.


da. to sam skapirao da čitav kod ide u setup(), a u loop() posle jurim djuti preko promenljive PWM_VALUE.



Citat:
U main() onda lagano kreni sa "korisnickim interfejsom" koji obraduje neke tvoje buttone ili potenciometre i kao rezultat da upisuje nove vrednosti u PWM_VALUE (za menjanje duty).
Menjanje frekvencije je po slicnom principu ali je jedino neophodno da preracunas nove vrednosti za CCR1 i ARR jer su duty i frekvencija medusobno zavisne, ako menjas frekvenciju promenice se i duty.


nemam potove ni butone. u suštini projekat je oko solarnog pretvarača napona veće snage oko 1-2kW. na ADC stm32f103 bi merio ulazne napone solarnog stringa i baterija koje puni pa prema tome kalkulisao djuti kako bi čitav sistem bio u dozvoljenim naponima i radio u mppt tački.



Citat:
To bi bilo ukratko, probaj pa ako zapne pitaj ...


oki.
[ mikikg @ 19.03.2020. 23:28 ] @
Evo sredio sam ti ovaj code da moze da se prevede ;)
Sad ti malo nastavi pa vici ako treba pomoc ... Nisam proveravao da li stvarno radi i generise signale na izlazu, to ostavljam tebi ...

Code:

#define TIM1_CH1N_PB        13
#define TIM1_CH1_PA         8
#define TIM1_CH2_PA         9
#define LED1_G_PC           9
#define LED2_B_PC           8
#define PWM_VALUE           20
#define TMR_T               200
#define DEADTIME            20
#define M_IN        0x00
#define M_OUT_2M    0x02
#define M_OUT_10M   0x01
#define M_OUT_50M   0x03
#define IN_ANALOG   0x00
#define IN_FLOATING 0x01
#define IN_PULLED   0x02
#define OUT_GP_PP   0x00
#define OUT_GP_OD   0x01
#define OUT_AF_PP   0x02
#define OUT_AF_OD   0x03
#define SET_CRL(pin_no,mode,conf)           (((mode) | ((conf) << 2)) << (4*(pin_no)))
#define SET_CRH(pin_no,mode,conf)           (((mode) | ((conf) << 2)) << (4*((pin_no)-8)))
#define PIN_MASK(pin_no)                    (1<<(pin_no))
#define PIN_SETMASK(pin_no)                 (1<<(pin_no))
#define PIN_RSTMASK(pin_no)                 (1<<((pin_no)+16))

void setup() {

  RCC->APB2ENR|=RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN | RCC_APB2ENR_TIM1EN;
  
  GPIOA->CRH=SET_CRH(TIM1_CH1_PA,M_OUT_50M,OUT_AF_PP) | SET_CRH(TIM1_CH2_PA,M_OUT_50M,OUT_AF_PP);
  GPIOB->CRH=SET_CRH(TIM1_CH1N_PB,M_OUT_50M,OUT_AF_PP);
  GPIOC->CRH=SET_CRH(LED1_G_PC,M_OUT_50M,OUT_GP_PP) | SET_CRH(LED2_B_PC,M_OUT_50M,OUT_GP_PP);

  //CH1: PWM mode 2, CH2: PWM mode 1, preload enabled on all channels
  TIM1->CCMR1=TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0 | TIM_CCMR1_OC1PE | TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2PE;
  TIM1->CCER=TIM_CCER_CC1E | TIM_CCER_CC2E;
  TIM1->BDTR=TIM_BDTR_MOE;
  TIM1->CCR1=TMR_T - PWM_VALUE;
  TIM1->CCR2=PWM_VALUE;
  TIM1->ARR=TMR_T;
  TIM1->CR1=TIM_CR1_ARPE | TIM_CR1_CMS_1 | TIM_CR1_CMS_0;
  TIM1->CR1|=TIM_CR1_CEN;
  TIM1->EGR=TIM_EGR_UG;  
}

void loop() {
  // ... nastavi ...
}


[ cukovanny @ 20.03.2020. 06:10 ] @
@mikikg, ti si kralj :)

nego, šta si stavio gore u #include ?
da ! još ovo: da li koristiš stm32 library (arm) originalnu iz arduino ide, ili si "digao" rodger clark -ovu stm32duino library sa githuba ?

javlja mi:


Code:
Arduino: 1.8.12 (Windows 7), Board: "Generic STM32F103C series, STM32F103CB (20k RAM. 128k Flash), Serial, 48Mhz (Slow - with USB), Smallest (default)"


stm32f103_push_pull_MIKIKG:28:3: error: 'RCC' was not declared in this scope

   RCC->APB2ENR|=RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN | RCC_APB2ENR_TIM1EN;

   ^

stm32f103_push_pull_MIKIKG:30:10: error: 'struct gpio_dev' has no member named 'CRH'

   GPIOA->CRH=SET_CRH(TIM1_CH1_PA,M_OUT_50M,OUT_AF_PP) | SET_CRH(TIM1_CH2_PA,M_OUT_50M,OUT_AF_PP);

          ^

stm32f103_push_pull_MIKIKG:31:10: error: 'struct gpio_dev' has no member named 'CRH'

   GPIOB->CRH=SET_CRH(TIM1_CH1N_PB,M_OUT_50M,OUT_AF_PP);

          ^

stm32f103_push_pull_MIKIKG:32:10: error: 'struct gpio_dev' has no member named 'CRH'

   GPIOC->CRH=SET_CRH(LED1_G_PC,M_OUT_50M,OUT_GP_PP) | SET_CRH(LED2_B_PC,M_OUT_50M,OUT_GP_PP);

          ^

stm32f103_push_pull_MIKIKG:35:3: error: 'TIM1' was not declared in this scope

   TIM1->CCMR1=TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0 | TIM_CCMR1_OC1PE | TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2PE;

   ^

stm32f103_push_pull_MIKIKG:35:15: error: 'TIM_CCMR1_OC1M_2' was not declared in this scope

   TIM1->CCMR1=TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0 | TIM_CCMR1_OC1PE | TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2PE;

               ^

stm32f103_push_pull_MIKIKG:35:34: error: 'TIM_CCMR1_OC1M_1' was not declared in this scope

   TIM1->CCMR1=TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0 | TIM_CCMR1_OC1PE | TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2PE;

                                  ^

stm32f103_push_pull_MIKIKG:35:53: error: 'TIM_CCMR1_OC1M_0' was not declared in this scope

   TIM1->CCMR1=TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0 | TIM_CCMR1_OC1PE | TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2PE;

                                                     ^

stm32f103_push_pull_MIKIKG:35:72: error: 'TIM_CCMR1_OC1PE' was not declared in this scope

   TIM1->CCMR1=TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0 | TIM_CCMR1_OC1PE | TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2PE;

                                                                        ^

stm32f103_push_pull_MIKIKG:35:90: error: 'TIM_CCMR1_OC2M_2' was not declared in this scope

   TIM1->CCMR1=TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0 | TIM_CCMR1_OC1PE | TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2PE;

                                                                                          ^

stm32f103_push_pull_MIKIKG:35:109: error: 'TIM_CCMR1_OC2M_1' was not declared in this scope

   TIM1->CCMR1=TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0 | TIM_CCMR1_OC1PE | TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2PE;

                                                                                                             ^

stm32f103_push_pull_MIKIKG:35:128: error: 'TIM_CCMR1_OC2PE' was not declared in this scope

   TIM1->CCMR1=TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0 | TIM_CCMR1_OC1PE | TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2PE;

                                                                                                                                ^

stm32f103_push_pull_MIKIKG:36:14: error: 'TIM_CCER_CC1E' was not declared in this scope

   TIM1->CCER=TIM_CCER_CC1E | TIM_CCER_CC2E;

              ^

stm32f103_push_pull_MIKIKG:36:30: error: 'TIM_CCER_CC2E' was not declared in this scope

   TIM1->CCER=TIM_CCER_CC1E | TIM_CCER_CC2E;

                              ^

stm32f103_push_pull_MIKIKG:37:14: error: 'TIM_BDTR_MOE' was not declared in this scope

   TIM1->BDTR=TIM_BDTR_MOE;

              ^

stm32f103_push_pull_MIKIKG:41:13: error: 'TIM_CR1_ARPE' was not declared in this scope

   TIM1->CR1=TIM_CR1_ARPE | TIM_CR1_CMS_1 | TIM_CR1_CMS_0;

             ^

stm32f103_push_pull_MIKIKG:41:28: error: 'TIM_CR1_CMS_1' was not declared in this scope

   TIM1->CR1=TIM_CR1_ARPE | TIM_CR1_CMS_1 | TIM_CR1_CMS_0;

                            ^

stm32f103_push_pull_MIKIKG:41:44: error: 'TIM_CR1_CMS_0' was not declared in this scope

   TIM1->CR1=TIM_CR1_ARPE | TIM_CR1_CMS_1 | TIM_CR1_CMS_0;

                                            ^

stm32f103_push_pull_MIKIKG:42:14: error: 'TIM_CR1_CEN' was not declared in this scope

   TIM1->CR1|=TIM_CR1_CEN;

              ^

stm32f103_push_pull_MIKIKG:43:13: error: 'TIM_EGR_UG' was not declared in this scope

   TIM1->EGR=TIM_EGR_UG;  

             ^

exit status 1
'RCC' was not declared in this scope





[Ovu poruku je menjao cukovanny dana 20.03.2020. u 07:28 GMT+1]
[ mikikg @ 20.03.2020. 07:31 ] @
Za ovaj primer trenutno ne treba nikakav #include

Imao sam stariju verziju Arduino IDE bez STM32 podrske, pratio sam ovo uputstvo za instalaciju:
https://github.com/stm32duino/wiki/wiki/Getting-Started

Po uputstvu sam dodao tamo u preferences URL sa dodatnim paketima, posle sa te URL povuce sve sto treba, nisam nista manualno dodavao ili instalirao, sve odradjeno po uputstvu iz samog Arduino IDE.
[ cukovanny @ 20.03.2020. 08:24 ] @

BRAVO !!!
moraju se instalirati sve stm32 core datoteke i to baš na ovaj način kako si gore napisao.
to je 130+ megabajta prekompajliranih soure-ova.


hajde kad malo razigram ovo i vidim da li radi , pa da mi ukratko iskomentarišeš red po red koda - radi daljeg učenja, a i radi svih koje ovo zanima :)
poz
[ cukovanny @ 21.03.2020. 20:26 ] @
@mikikg

krenuo da testiram kod koji si ti prilagodio da može da se kompajlira, ali shvatio ubrzo da je u slučaju "stm32core for arduino ide" biblioteke - nemoguće upucavati kod u bluepill bez bootloader-a prethodno upucanog u sam bluepill....
aj reko to da instaliramo i podesimo, ali kad videh da su alati za sve to teški preko 170Mb i da ima nekih tisuću podešavanja, reko aj da ja ipak pregledam onaj manual od STM32F103C od 400tinak strana - naučiće se nešto i nema ko drugi to za mene da uradi.
drugo što sam morao da pregledam je ovo http://docs.leaflabs.com/stati...etimer.html#lang-hardwaretimer
treće što sam morao da pregledam je ovo https://github.com/stm32duino/wiki/wiki/HardwareTimer-library

suština je da se iste ili slične stvari podešavaju unutar koda koji ću postovati i onog kojeg si ti prilagodio.
razlika je u tome što je nomenklatura registara i flagova u Rodger Clark "Stm32duino" biblioteci (koja podržava serial ftdi upload) , i ona u "stm32core for arduino ide" - donekle različita.
na kraju sam sklepao kod koji radi i može da se kompajlira sa "stm32duino" bibliotekom.

evo koda:
Code:

// Konachno radi 21.03.2020 - push pull pwm na GPIO PA8 i PA9

#define    Frekvencija        22000                            // Za IGBT u push pull izlazima 
//#define    Frekvencija     70000                          // Za Mosfet u push pull izlazima 


#define Brojach            72000000/4/Frekvencija        // STM32F103 moze raditi na 48Mhz/72Mhz/128Mhz
#define DeadTime        2
#define MaxPwmVrednost        Brojach / 2 - DeadTime

int PWM_Vrednost = 1;
// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
void SetDuty(int Duty)                            // max. vrednost djutija je 72.000.000/4/zeljena f-ja pwm
{                                                 // primer> f-ja pwm 22khz> 72.000.000/4=18.000.000/22.000=818
    if(Duty > MaxPwmVrednost)                     // dakle, na 22khz push pull-a mozemo "ulaziti" sa
        Duty = MaxPwmVrednost;                    // djutijem od 1-818. 
                                                  // ako je stm32f103 klokovan na 128Mhz, onda je deljenik 128.000.000
    TIMER1_BASE->CCR1 = Brojach - Duty;           // i automatski osim brzine mcu, dupliramo i rezoluciju pwm
    TIMER1_BASE->CCR2 = Duty;  

    TIMER1_BASE->CR1 = 225;
    TIMER1_BASE->EGR = 1;
}
// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
void setup()
{

// koga zanima sta se ovde radi - potrudio sam se da dam stranice u manualu
// a manual stm32f103c ima par stotina strana :)
// da nije covid-19 histerije - nikad se ne bi stiglo ovo citati
// sustina je da se pali Timer1 i dozvoli izlaz PortA

    RCC_BASE->APB2ENR = 2076;                   // ??? stranica 112
    GPIOA_BASE->CRH = 187;                      // ??? stranica 172
    TIMER1_BASE->CCMR1 = 26744;                 // ??? stranica 349
    TIMER1_BASE->CCER = 17;                     // ??? stranica 353
    TIMER1_BASE->BDTR = 32768;                  // ??? stranica 359
    TIMER1_BASE->ARR = Brojach;                 // ??? stranica 356
    PWM_Vrednost = 1;
}
// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
void loop()                                     // loop radi test-a
{
    SetDuty(PWM_Vrednost++);

    if(PWM_Vrednost > MaxPwmVrednost)
        PWM_Vrednost = 1;

    delay(20);                                    // delay radi hvatanja oscilograma 
}


[ cukovanny @ 07.04.2020. 21:46 ] @
iz nekog razloga - Bit 9 ADC1EN u registru APB2ENR mora se promeniti na 1, tj dekadna vrednost registra APB2ENR mora biti 2564 (popaljeni bitovi drugi, deveti i jedanaesti) da bi radila ADC konverzija i I2C magistrala koju koristim za ispis vrednosti smps-a za kojeg koristim stm32f103.

dakle, promeniti u pushh pull kodu ovaj red:
RCC_BASE->APB2ENR = 2564;

eto :) ako nekome ikome ovo treba, potroših 2 dana da nađem problem pa rekoh hajde da nekome olakašam ....

[Ovu poruku je menjao cukovanny dana 07.04.2020. u 23:35 GMT+1]