Otazky ohladom STM32

Všetko čo sa týka mikropočítačov + Sekcia Arduino

Moderátori: psichac, Moderátori

bibibo
Stály člen
Stály člen
Príspevky: 483
Dátum registrácie: 05 Nov 2009, 00:00
Bydlisko: Bratislavský kraj

Otazky ohladom STM32

Príspevok od používateľa bibibo » 24 Máj 2020, 17:51

Ahojte, zalozil som toto vlakno pretoze sa ucim programovat STM32, konkretne STM32L011. Predpokladam, ze casom otazok bude viac bud ohladom HW alebo SW.

Mam otazku ohladom casovacov. Potreboval by som si naprogramovat casovac, ktory po urcitom case vyvola prerusenie. Ked vsak citam manual, tak tam pisu, ze napr. TIM2 ma 4 kanaly. Na a tieto TIM2_CHx su na niektorych konkretnych pinoch ako alternativna funkcia. Naco mi je casovac na pine ?
0

maskrtnik01
Ultimate člen
Ultimate člen
Príspevky: 1844
Dátum registrácie: 20 Júl 2010, 00:00
Bydlisko: okolie KE
Vek: 24

Príspevok od používateľa maskrtnik01 » 24 Máj 2020, 18:19

To ak by ste chceli napríklad pwm. Ak tieto časti nenastavíte, máte periodic interrupt. Takisto ak pin nenastavíte na alternate function a nevyberiete AFx zodpovedajúcu timeru, tak timer ten pin nebude ovplyvňovať a môže sa použiť inak.
0

bibibo
Stály člen
Stály člen
Príspevky: 483
Dátum registrácie: 05 Nov 2009, 00:00
Bydlisko: Bratislavský kraj

Príspevok od používateľa bibibo » 24 Máj 2020, 18:29

Myslel som, ze PWM sa robi prave v periodic interrupt a ovladanim niektoreho konkretneho pinu. To teda znamena, ze ak budem chciet v nejakom projekte pouzit PWM, tak obvod musim navrhnut tak, aby som pouzil niektory z kanalov casovaca a nie hociktory pin.
0

maskrtnik01
Ultimate člen
Ultimate člen
Príspevky: 1844
Dátum registrácie: 20 Júl 2010, 00:00
Bydlisko: okolie KE
Vek: 24

Príspevok od používateľa maskrtnik01 » 24 Máj 2020, 18:31

Softwarové pwm sa dá aj v ISR cez gpio. Obvykle sa používa hardwarové pwm na kanáloch timera, pretože cpu iba nastaví timer a potom už nemusí robiť nič.

Takže áno, tam kde sa predpokladá pwm, snažiť sa použiť pin ktorý má voľný kanál na niektorom timeri. Ak už je dps hotová a nedá sa cez kanály timera, dá sa to zachrániť softwarovým generovaním pwm, na úkor zaťaženia cpu.
0

bibibo
Stály člen
Stály člen
Príspevky: 483
Dátum registrácie: 05 Nov 2009, 00:00
Bydlisko: Bratislavský kraj

Príspevok od používateľa bibibo » 24 Máj 2020, 20:35

ok, diky. Myslel som si, ze to tak asi bude.
0

maskrtnik01
Ultimate člen
Ultimate člen
Príspevky: 1844
Dátum registrácie: 20 Júl 2010, 00:00
Bydlisko: okolie KE
Vek: 24

Príspevok od používateľa maskrtnik01 » 24 Máj 2020, 20:40

bibibo napísal:Myslel som, ze PWM sa robi prave v periodic interrupt a ovladanim niektoreho konkretneho pinu.
Ale aby sme si rozumeli, prerušenie s pwm nijako nutne nesúvisí. Môžete mať čítač ktorý generuje pravidelne prerušenie a negeneruje pwm. Takisto môžete mať čítač ktorý generuje pwm signál, a nie je k tomu vôbec treba prerušenia.
0

bibibo
Stály člen
Stály člen
Príspevky: 483
Dátum registrácie: 05 Nov 2009, 00:00
Bydlisko: Bratislavský kraj

Príspevok od používateľa bibibo » 02 Jún 2020, 09:07

Narazil som na dalsi problem s ktorym sa trapim uz treti den. Mam k LPUART pripojeny GPS modul, ktory vysiela NMEA protokol s rychlostou 9600bps a viem ho prepnut na binarny protokol OSP. OSP protokol na rychlosti 9600bps funguje bez problemov. Problem ma vsak ak nastavim LPUART a aj GPS modul na rychlost 115200bps. Vtedy mi ten OSP protokol dobre nefunguje a niekde sa mi to zasekne. MCU mi bezi na MSI 2.097MHz, tak podla manualu by rychlost 115200bps mal zvladnut. Prikladam kod.

Kód: Vybrať všetko

void LPUART1_IRQHandler(void)

{
	led_on();
	char t;
	while (!(LPUART1 -> ISR & USART_ISR_RXNE)){}
		t = LPUART1 ->RDR;


		if ( t != 179 && t !='\n')
		{
			rxBuf_LPUART1[rxIndex_LPUART1] = t;
			rxIndex_LPUART1 ++;
			led_off();

			//rxIndex_LPUART1 = 0;


		}
			else if (t =='\n' ){//led_off();
				memcpy (command, rxBuf_LPUART1, rxIndex_LPUART1);
				//command[rxIndex_LPUART1] = 179;
				command[rxIndex_LPUART1] ='\n';
				command[rxIndex_LPUART1 + 1] = '\0';
				rxIndex_LPUART1 = 0;

				txFlag_USART2 = 1;
			}
			else if (t == 179) {
				memcpy (command, rxBuf_LPUART1, rxIndex_LPUART1);
				command[rxIndex_LPUART1] = 179;
				//command[rxIndex_LPUART1] ='\n';
				command[rxIndex_LPUART1 + 1] = '\0';
				rxIndex_LPUART1 = 0;

				txFlag_USART2 = 1;

			}



}


Kód: Vybrať všetko

while (1)
  {


		if (txFlag_USART2 == 1)
		{

			USART2_write(command);
			txFlag_USART2 = 0;

		}
}

Kód: Vybrať všetko

void USART2_write(char *Buffer)
	{

	while (*Buffer != 179){

		while (!(USART2 -> ISR & USART_ISR_TXE)) {}
			USART2->TDR = *Buffer++;

	}

}
NMEA data su zakoncene znakom '\n' a OSP su zakoncene 0xB3 = 179. Ten USART2_write nemam este doladeny, ale pravdepodobne sa mi to zasekne niekde v tom preruseni. Tak ako pisem, staci len ked zmenim vsetko na rychlost 9600bps a OSP protokol funguje. Ziadny iny zasah do programu nerobim. Poradite kde moze byt problem ?
0

Používateľov profilový obrázok
Tribec Zacks
Pokročilý člen
Pokročilý člen
Príspevky: 661
Dátum registrácie: 26 Jún 2010, 00:00
Bydlisko: Levice / Cork IRL
Vek: 38
Kontaktovať používateľa:

Príspevok od používateľa Tribec Zacks » 02 Jún 2020, 22:18

bibibo, pozri sa ako mas nastaveny prescaler na APB1, musi byt na 1, inak bude uart clocknuty nizsie ako core, /2 /4..., potom cekni ako mas nastaveny oversampling na uarte. a do tretice, z prerusenia volas led on/off funkcie, ak to seriozne potrdbujes, definuj ich ako inline. kodu mas v preruseni strasne vela (volanie inych funcii a specialne memcopy). z prerusenia by si nemal volat kod, ktory sa da volat z inych miest, tiez je velmi pravdepodobne ze ti ten handler nestihne skoncit ked primas data 12x rychlejsie ako na 9600baud rate.
ak ti mozem poradit, prestuduj DMA sekciu v datashite, specialne periperal to memory mod, taktiez pozri na uarte CMIE bit v CT1 registri :) mozes ho pouzit na stopnutie dma vtedy kedy treba (pozri do DS a dojde ti to). v preruseniach let setni flagy podla ktorych hlavny loop bude vedet co robit, nesnaz sa spracovat data v handleri. taktiez dma podporuje double buffer teda vie zapisovat do jedneho buferu kym ti cpu spracuje druhy, prerusenia ti oznamia co to robi a podla flagov budes vedet ktory bufer spracovavat dalej
neboj sa pouzivat hw toho mcu ;)
0
Kreativita a motivacia je to, co prinasa originalne napady a myslienky, disciplina je to, co ich dokaze zrealizovat.

Používateľov profilový obrázok
lucky62
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1095
Dátum registrácie: 14 Feb 2012, 20:16
Bydlisko: Liptovský Mikuláš, SK

Príspevok od používateľa lucky62 » 03 Jún 2020, 06:20

Na konfiguráciu hodín doporučujem STM32CubeMX.

Jednoducho vyberieš procesor, navolíš funkciu pinov:
STM32_Pinout.png
a potom sa hráš s hodinami.
Ak je v konfigurácii hodín chyba, program to ukáže.
STM32_Clock.png
0
....môj bazar....

...Nikdy sa nehádaj s blbcom...

bibibo
Stály člen
Stály člen
Príspevky: 483
Dátum registrácie: 05 Nov 2009, 00:00
Bydlisko: Bratislavský kraj

Príspevok od používateľa bibibo » 03 Jún 2020, 14:52

No, prescaler APB1 nestaveny nemam a ani oversampling. Led on/off som tam dal len pre kontrolu. Vyhodim to odtial. Tiez som uvazoval, ze to skusim s DMA, ale nemam v tom ziadnu skusenost. Takze nic ine mi neostava len to nastudovat a skusat. Dam vediet ako to dopadlo.
0

maskrtnik01
Ultimate člen
Ultimate člen
Príspevky: 1844
Dátum registrácie: 20 Júl 2010, 00:00
Bydlisko: okolie KE
Vek: 24

Príspevok od používateľa maskrtnik01 » 03 Jún 2020, 15:26

Tak potom by sa hodilo skontrolovať reset hodnoty. Prescaler je nejako nastavený aj keď sa ho nedotknete, je to v reference manuáli. Takisto všetky parametre všetkých periférii majú svoje reset hodnoty.
0

bibibo
Stály člen
Stály člen
Príspevky: 483
Dátum registrácie: 05 Nov 2009, 00:00
Bydlisko: Bratislavský kraj

Príspevok od používateľa bibibo » 03 Sep 2020, 10:39

Ahojte, robim si zariadenie IOT a je tam osadeny STM32L073. Zariadenie bude napajane z baterie. Rad by som vsak vyuzil aj USB CDC. Docital som sa, ze pre komunikaciu USB vyzaduje zbernica 48Mhz. Chcel by som vsak docielit to, ze ked sa USB nepouziva, tak by som znizil frekvenciu, aby MCU mal nizsi odber. Nedocital som sa nikde akym sposobom je mozne toto docielit resp. nejaky tip. Mate s tym niekto skusenost ?
0

maskrtnik01
Ultimate člen
Ultimate člen
Príspevky: 1844
Dátum registrácie: 20 Júl 2010, 00:00
Bydlisko: okolie KE
Vek: 24

Príspevok od používateľa maskrtnik01 » 03 Sep 2020, 11:35

Skúsenosti nie, ale teória je taká, že stm32 umožňuje za behu prepnúť napríklad aj system clock mux. Komplikácia je to, že sa zmenia hodiny pre periférie, a takto sa vedia poškodiť pakety uart/spi/i2c, rozbije sa časovanie timerov a pod.

Nebude jednoduchšie použiť sleep módy? Hodiny sa nemenia, ale dynamicky sa vypínajú časti mcu, ktoré práve nie sú potrebné.
0

bibibo
Stály člen
Stály člen
Príspevky: 483
Dátum registrácie: 05 Nov 2009, 00:00
Bydlisko: Bratislavský kraj

Príspevok od používateľa bibibo » 03 Sep 2020, 11:58

Mas pravdu. Sleep mody asi budu lepsie. Este mam otazku ohladom pinu VUSB. je toto pin na detekciu pripojenia USB ? alebo sa detekcia robi standardnym pinom nakonfigurovanym ako vstup ?
0

maskrtnik01
Ultimate člen
Ultimate člen
Príspevky: 1844
Dátum registrácie: 20 Júl 2010, 00:00
Bydlisko: okolie KE
Vek: 24

Príspevok od používateľa maskrtnik01 » 03 Sep 2020, 13:01

Asi na tú detekciu, niekde v cubemx som to tuším videl. Ono tu si treba ujasniť rozdiel medzi self powered a bus powered. Keď je mcu aj tak napájaný z usb, nie je to dôležité. Keď je napájaný zo samostatného zdroja, tak nesmie spínať D+ D- linky ak nie je plne pripojený k pc.

Ešte jednu radu, keď budete kresliť schému bacha na pullup. Niektoré stm majú interný, niektoré nie. Naposledy som ho musel provizórne dorábať, inak mi pc ani nerozoznal, že som niečo pripojil.
0

bibibo
Stály člen
Stály člen
Príspevky: 483
Dátum registrácie: 05 Nov 2009, 00:00
Bydlisko: Bratislavský kraj

Príspevok od používateľa bibibo » 10 Nov 2020, 19:27

Ahoj,
mam takuto dosku
http://www.lilygo.cn/prod_view.aspx?Typ ... t3:50033:3

Stiahol som si k tomu SDK. SDK je pre KEIL. Ja vsak pouzivam STM32Cube IDE. Vytvorilsom si teda novy projekt a postupne prekopiroval vsetky potrebne priecinky, kniznice atd. V Properties daneho projektu som si nastavil cesty k tym priecinkom. Spustil som kompilaciu a samozrejme je tam niekolko problemov. Jazyku C velmi nerozumiem a neviem kde moze byt chyba.
Napr. mam problem s SPI_HandleTypeDef. Pise, ze je to neznamy nazov. Tento SPI_HandleTypeDef som vsak nasiel v stm32lxx_hal_spi.h Vid obrazky. Poradite aky tam moze byt este problem ?
Prílohy
Snímka obrazovky 2020-11-10 o 19.20.44.png
Snímka obrazovky 2020-11-10 o 19.21.54.png
0

bibibo
Stály člen
Stály člen
Príspevky: 483
Dátum registrácie: 05 Nov 2009, 00:00
Bydlisko: Bratislavský kraj

Príspevok od používateľa bibibo » 10 Nov 2020, 20:02

nahral som to este sem lebo tie obrazky su velmi male.
https://we.tl/t-23g8i2JHJJ
0

bibibo
Stály člen
Stály člen
Príspevky: 483
Dátum registrácie: 05 Nov 2009, 00:00
Bydlisko: Bratislavský kraj

Príspevok od používateľa bibibo » 10 Nov 2020, 20:11

tak pridal som na zaciatok #include "stm32l0xx_hal_spi.h" a uz je to ok.
0

bibibo
Stály člen
Stály člen
Príspevky: 483
Dátum registrácie: 05 Nov 2009, 00:00
Bydlisko: Bratislavský kraj

Príspevok od používateľa bibibo » 21 Nov 2020, 23:23

Ahojte, uz asi tyzden sa trapim rozchodit STM32L073 s SX1276. resp. mam tuto dosku
http://www.lilygo.cn/prod_view.aspx?Typ ... t3:50033:3. Je osadena modulom S76G, ktory obsahuje STM32L073 + SX1276 s CXD5603GF. Momentalne ma zaujima iba spolupraca s Lorawan. Na programovanie pouzivam prioritne STM32CubeIDE. Stiahol som si SDK pre tento moful S76G ale pomocou STM32CubeIDE sa mi to nepodarilo rozbehat. Ked som to nainportoval do Keil, tak to fungovalo. Budem mat cas, tak sa na to este pozriem. Viac ma vsak trapi, ze chcel som pouzit nejaky iny priklad na komunikaciu STM32L0xx + Lorawan. Skusam toto
https://github.com/drakkar-lig/st-lrwan.
Povodne sa tam pouziva SPI1 a samozrejme ine piny pre dalsie veci. Zmenil som teda vsetko co sa tyka SPI1 na SPI2 a taktiez som zmenil piny ako reset, nss, ant. sw, D0 - D3 podla vnutorneho zapojenie S76G. Bohuzial, nedari sa mi to rozchodit. Cez Uart mi dava nejaky vystup, takze MCU zije. Vedel by mi niekto poradit ako by to bolo mozne diagnostikovat problem popripade na co si dat pozor alebo overit ?
0

bibibo
Stály člen
Stály člen
Príspevky: 483
Dátum registrácie: 05 Nov 2009, 00:00
Bydlisko: Bratislavský kraj

Príspevok od používateľa bibibo » 23 Nov 2020, 09:12

Tak ja uz tomu nerozumiem. Vratil som sa k tomu SDK, ktory mi funguje v Keil-y, tak ked to SDK manualne nakopirujem a nastavim vsetky cesty na kniznice, symboly do STM32cubeIDE, tak mi to nefunguje. Pritom kompilacia skonci bez chyby. Kde moze byt chyba ?
0

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok