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