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