Zase STM32
Fanda Kopriva
info na elektronikavyvoj.cz
Neděle Listopad 29 22:39:56 CET 2020
dobry vecer
tyto zapisy moc nepouzivam .takze mozna budu kecat ,ale vychazi mi to
nejak divne proto pisu "asi":
void pwmInit(uint8_t chan, char port, uint8_t pin, uint16_t per,
uint16_t val) parametry funkce
jak dopadne volani jednotlivych funkci
pwmInit(PWM0_chan, 'B', 0, CPU_freq/PWM_freq, pwm0); //chan = 3
GPIOB->MODER |= 2<<(1<<pin); > 2<<(1<<0) = 4 asi by melo byt
2 port.1 je asi nastaven do vystupu misto port.0 do altern.
case 3:
GPIOB->AFR[0] |= 1<<(pin<<2); // AF1 > 1<<(0<<2) = 1 to je asi spravne
break;
pwmInit(PWM1_chan, 'B', 1, CPU_freq/PWM_freq, pwm1); //chan =
4 toto volani asi by melo fungovat pro nastaveni portu
GPIOB->MODER |= 2<<(1<<pin); > 2<<(1<<1) = 8 to je asi
dobre nastavi port.1 do altern.
case 4:
GPIOB->AFR[0] |= 1<<(pin<<2); // AF1 > 1<<(1<<2) = 0x10 to je asi
spravne
break;
pwmInit(PWM2_chan, 'A', 7, CPU_freq/PWM_freq, pwm2); //chan = 2
GPIOA->MODER |= 2<<(1<<pin); > 2<<(1<<7) = 2 << 0x80 to je asi
na druhe strane vesmiru
case 2:
GPIOA->AFR[0] |= 1<<(pin<<2); // AF1 1<<(7<<2) = 0x10000000 to je asi
spravne
break;
taky nevim jestli GPIOA->AFR[0] je totez co GPIOA_AFRL
Dne 29. 11. 2020 v 21:42 Pavel Hudecek napsal(a):
>
> Ale teď mi to taky nechodí, tak už nevim…
>
> #define CPU_freq 48000000 // 48 MHz
>
> #define PWM_freq 240000 // 240 kHz
>
> // moje PWM TIM3 chan
>
> #define PWM0_chan 3 // az po propojeni
>
> #define PWM1_chan 4
>
> #define PWM2_chan 2
>
> void pwmSet(char chan, uint16_t val) { // hodnota PWM
> -------------------------------------------------
>
> switch(chan) {
>
> //case 0: TIM3->CCR0 = val; break;
>
> case 1: TIM3->CCR1 = val; break;
>
> case 2: TIM3->CCR2 = val; break;
>
> case 3: TIM3->CCR3 = val; break;
>
> case 4: TIM3->CCR4 = val; break;
>
> }
>
> }
>
> void pwmInit(uint8_t chan, char port, uint8_t pin, uint16_t per,
> uint16_t val) { // -------------------
>
> RCC->AHBENR |= (1<<17) + (1<<18);
> // IOPAEN IOPBEN
>
> RCC->APB1ENR |= 2; // APB peripheral
> clock enable TIM3
>
> switch (port) {
>
> case 'A':
>
> GPIOA->MODER |= 2<<(1<<pin); // port alt fn
>
> switch(chan) {
>
> case 0:
>
> break;
>
> case 1:
>
> GPIOA->AFR[0] |= 1<<(pin<<2); // AF1
>
> break;
>
> case 2:
>
> GPIOA->AFR[0] |= 1<<(pin<<2); // AF1
>
> break;
>
> case 3:
>
> break;
>
> case 4:
>
> break;
>
> }
>
> break;
>
> case 'B':
>
> GPIOB->MODER |= 2<<(1<<pin); //port alt fn
>
> switch(chan) {
>
> case 0:
>
> break;
>
> case 1:
>
> GPIOB->AFR[0] |= 1<<(pin<<2); // AF1
>
> break;
>
> case 2:
>
> GPIOB->AFR[0] |= 1<<(pin<<2); // AF1
>
> break;
>
> case 3:
>
> GPIOB->AFR[0] |= 1<<(pin<<2); // AF1
>
> break;
>
> case 4:
>
> GPIOB->AFR[0] |= 1<<(pin<<2); // AF1
>
> break;
>
> }
>
> break;
>
> }
>
> TIM3->CR1 = 1;
> // Bit 1 UDIS: Update disable
>
> TIM3->CCMR2 = 0b110<<12; // OC4M out 111 PWM mode 2,
> 110 PWM mode 1
>
> TIM3->CCER = 0x3000; // CC4P 1: OC1 active low / CC4E 1:
> On - OC1 signal is output
>
> TIM3->CNT = 0; // counter
>
> TIM3->PSC = 0; // nedelit - 48 MHz
>
> TIM3->ARR = per; // perioda
>
> TIM3->CR1 = 0x1; // CEN 1:
> Counter enabled
>
> pwmSet(chan, val);
> // hodnota PWM
>
> }
>
> A v mainu je:
>
> pwm0=10; pwm1=30; pwm2=180;
>
> pwmInit(PWM0_chan, 'B', 0, CPU_freq/PWM_freq, pwm0);
>
> pwmInit(PWM1_chan, 'B', 1, CPU_freq/PWM_freq, pwm1);
>
> pwmInit(PWM2_chan, 'A', 7, CPU_freq/PWM_freq, pwm2);
>
> while (1) {
>
> HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, 1);
>
> for (n=0; n<1000000; n++);
>
> HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, 0);
>
> for (n=0; n<1000000; n++);
>
> }
>
> LEDka bliká, ale PWMky nePWMkujou.
>
> PH
>
> *Od: *Pavel Hudecek <mailto:edizon na seznam.cz>
>
> No to jsem udělal, ale ono to právě pak stejně nechodilo.
>
> *Od: *Jaroslav Buchta <mailto:jaroslav.buchta na hascomp.cz>
>
> Tak ted se mi zda, ze prece jen aspon pro prvni pokusy je dobre pouzit
> konfigurator a HAL - naklika se to, spusti se timer a jede to...
> Postup spusteni je primo soucasti zdrojaku kdyz nekdo nechce hledat.
>
> Dne 29.11.2020 v 20:16 Fanda Kopriva napsal(a):
>
> posilam soukromne tak to snad dojde
>
> fanda
>
> Dne 29. 11. 2020 v 19:43 Pavel Hudecek napsal(a):
>
> Mohl bych poprosit o zaslání .h ve kteém jsou ty registry
> STM32F030K6T6 zadefinovaný?
>
> Stáhnul jsem několik takových fajlů a nefunguje ani jedno ani
> druhý
>
> TIM3_CCR0 = val;
>
> TIM3->CCR0 = val;
>
> Zajímavý je, že je v nich nadefinovaných spousta věcí, jako
> TIM1_..., nebo TIM17_... takže třeba s TIM1 by mi to tak šlo,
> ale k TIM3 je tam jen BASE.
>
> Díky,
>
> PH
>
> *Od: *Fanda Kopriva <mailto:info na elektronikavyvoj.cz>
>
> s STM32F030K6T6 jsem delal pro kamarada nastavovani
> modelarskeho serva opakovacka 20 ms a pulz 1-2ms
>
> void motor(char co)
> {
> unsigned int pwmx;
> switch (co) {
> case 'I':
> RCC_APB1ENR |=2; //servo
> inicializace
> GPIOB_MODER |= 0x00000008; //port pb1
> GPIOB_AFRL |= 0x00000010;
> TIM3_CR1 = 0x1;
> TIM3_CCMR2_Output = 0x7000;
> TIM3_CCR4 = 0; //togle
> TIM3_CCER = 0x3000; //11
> TIM3_CNT = 0;
> TIM3_PSC = 7; //1us
> TIM3_ARR = 20000; //20ms
> TIM3_CR1 = 0x1; //43
> TIM3_CCR4 = 1000; //1.5ms
> break;
> case 'P':
> pwmx = servo * 50 + 1000; //servo nastaveni
> if (pwmx>2000) pwmx=2000;
> TIM3_CCR4 = pwmx;
> break;
> case 'S':TIM3_CCR4 = 1000; //1.5ms servo stop
> break;
> }
> }
>
> jeste priklad pro stm32f446 -
>
> #define enc1 0 //pc7 T3ch2
> #define enc2 0 //pc8 T3ch3
>
> void encod(unsigned char co){
> if (co=='I') { //inicializace
> GPIOC_MODER &= 0xfffc3fff;
> GPIOC_MODER |= 0x00028000;
> GPIOC_AFRH |= 0x00000002;
> GPIOC_AFRL |= 0x20000000;
> GPIOC_OSPEEDR |=0x00028000;
> RCC_APB1ENR |= 0x2; //tim3 168/4 42MHz
> TIM3_CR1 = 0x81;
> TIM3_CCMR1_Output = 0x7000;
> TIM3_CCMR2_Output = 0x0070;
> TIM3_CCER = 0x0110;
> TIM3_CNT = 0;
> TIM3_PSC = 0;
> TIM3_ARR = 20000;
> TIM3_CCR2 = 10000;
> TIM3_CCR3 = 10000;
> TIM3_CR1 = 0x81; //zisk ad603 pwm1 ch1
> }
>
> if (co=='P') { //nastaveni
>
> if (laserA>18000) pwmx=18000; else pwmx=18000 - laserA;
> TIM1_CCR2 = pwmx;
> if (laserB>18000) pwmx=18000; else pwmx=18000 - laserB;
> TIM1_CCR3 = pwmx;
> }
> }
>
> mam tady jeste priklad pro stm32f427 -
>
> //#define laspwm 0x200 //d14 T4ch3
> //#define pwina // d12 T4ch1 //zisk
> //#define pwin // d13 T4ch2
>
> unsigned int laseron ;
> void laser(unsigned char co)
> {
> signed int laspoz;
> switch (co) {
> case 'I':
> GPIOD_MODER &= 0xc0FFFFFF;
> GPIOD_MODER |= 0x2a000000;
> GPIOD_AFRH |= 0x02220000;
> RCC_APB1ENR |= 0x4;
> TIM4_CR1 = 0x1;
> TIM4_CCMR2_Output = 0x70;
> TIM4_CCMR1_Output = 0x7070;
> TIM4_CCER = 0x0111; //11
> TIM4_CNT = 0;
> TIM4_PSC = 10;
> TIM4_ARR = 256;
> TIM4_CCR3 = 255;
> TIM4_CR1 = 0x1; //zisk ad603 pwm1 ch1
> unsigned int lasset,lasproud,maxlaser;
> break;
> case 'P':
> TIM4_CCR3 = laserproud;
>
> TIM4_CCR2 = zisk;
> TIM4_CCR1 = ziska;
> break;
> }
> }
>
> fanda
>
> Dne 29. 11. 2020 v 11:15 Pavel Hudecek napsal(a):
>
> Dobrý den všem,
>
> Trápím se tady s STM32F030K6T6, k PC připojeno přes
> STM32F0308 discovery, Cube IDE.
>
> 1. Jak udělat, aby program běžel i po disconnect?
>
> 2. Nedaří se mi zprovoznit PWM. Byla by nějaká ukázka,
> nejlépe pro TIM3?
>
>
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20201129/34de1491/attachment.html>
Další informace o konferenci Hw-list