Zase STM32

František Burian BuFran na seznam.cz
Neděle Listopad 29 20:06:42 CET 2020


registry s podtržítky jsou definované v libopencm3 ale to jste asi nechtěl 
slyšet ...



---------- Původní e-mail ----------
Od: Pavel Hudecek <edizon na seznam.cz>
Komu: HW-news <hw-list na list.hw.cz>
Datum: 29. 11. 2020 18:23:57
Předmět: RE: Zase STM32 
"

Díky všem,

 

K PWM jsem si vytvořil hezký driver (viz dále). Ale nakonec jsem narazil na 
nečekaný problém: Po překladu jsou všechny řádky červené, počínaje tím, že 
nezná TIM3_CCR0.

 

A v default kódu vygenerovaném grafickým konfigurátorem jsou věci jako:

htim3.Init.CounterMode = TIM_COUNTERMODE_UP;

 

Mě by se teda líbilo, kdyby tam byly ty věci co jsem použil, s podtržítky, 
které souhlasí s názvy z datasheetu. Předpokládám, že bych měl něco 
includnout. Tak prosím ještě o název fajlu:-)

 

// 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) { // -------------------

       int n;

 

    RCC_APB1ENR |=2;                                //TIM3 en

    switch (port) {

             case 'A':

                    GPIOA_MODER |= 2<<(1<<pin);            //port alt fn

                    switch(chan) {

                           case 0:

                           break;

                           case 1:

                                  GPIOA_AFRL |= 1<<(pin<<2); // AF1

                           break;

                           case 2:

                                  GPIOA_AFRL |= 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_AFRL |= 1<<(pin<<2); // AF1

                           break;

                           case 2:

                                  GPIOB_AFRL |= 1<<(pin<<2); // AF1

                           break;

                           case 3:

                                  GPIOB_AFRL |= 1<<(pin<<2); // AF1

                           break;

                           case 4:

                                  GPIOB_AFRL |= 1<<(pin<<2); // AF1

                           break;

                    }

             break;

    }

    TIM3_CR1 = 0x1;                    // Bit 1 UDIS: Update disable

    TIM3_CCMR2_Output = 0b110<<12;     // OC4M out 111 PWM mode 2, 110 PWM 
mode 1

    TIM3_CCR4 = val;                          // PWM value

    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 tady použití:

 

  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);

 

PH

 

 
 Od: Fanda Kopriva(mailto:info na elektronikavyvoj.cz)
 Odesláno:neděle 29. listopadu 2020 13:22
 Komu: hw-list na list.hw.cz(mailto:hw-list na list.hw.cz)
 Předmět: Re: Zase STM32
 

 


dobry den



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?

 

Díky,

PH

 





_______________________________________________

HW-list mailing list  -  sponsored by <a href='http://www.hw.cz'>www.HW.cz</a>

<a href='mailto:Hw-list na list.hw.cz'>Hw-list na list.hw.cz</a>

<a href='http://list.hw.cz/mailman/listinfo/hw-list'>http://list.hw.cz/mailman/listinfo/hw-list</a>
"
 

 

_______________________________________________
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/feeda654/attachment.html>


Další informace o konferenci Hw-list