Zase STM32

Hynek Sladký econf na centrum.cz
Neděle Listopad 29 18:32:50 CET 2020


Jestli myslite zapis ve tvaru:
TIM3->CCR0 = val;

tak k tomu jsou v CMSIS knihovnach soubory pro jednotlive typy 
procesoru. Takze bych si tipnul, ze to bude neco jako:
#include "stm32f030xx.h"
Mam tu nejakou hodne starou verzi a je tam soubor "stm32f0xx.h"...

Presny nazev je potreba najit v aktualnich verzich knihoven...

Hynek Sladky



Dne 29.11.2020 v 18:23 Pavel Hudecek napsal(a):
>
> 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
>
>

------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20201129/309abf15/attachment.html>


Další informace o konferenci Hw-list