stm32 registro trapeni

Jan Waclawek konfera na efton.sk
Úterý Duben 11 14:22:37 CEST 2023


>netusite prosim nekdo co delam blbe?

Tusim. 

Neustale sa vraciate do toho isteho bodu: v nadeji, ze sa da usetrit na
procese naucit sa ovladat nejaku periferiu pouzivate rozne pochybne
"kniznice". To funguje len ak chcete, aby to robilo presne to, co autor
"kniznice" zamyslal, ale akakolvek odchylka znamena, ze budete preslapavat
uplne nezname chodnicky ktore su naviac prebezne zarubavane prave tou
"kniznicou" ktoru ste v ramci zjednodusenia pouzili.

Stary pan Gordon Moore to uz sice ma za sebou, nech mu je zem lahka, a
vdaka za to co za svoj zivot urobil; ale nasledky jeho predpovede si
ponesieme este desatrocia. Moznost na***bat miliony tranzistorov na lacny
cip prinieslo neuveritelnu zlozitost vsetkych periferii vo vsetkych
sucasnych mcu, ktore su pochopitelne mizerne zdokumentovane a maju rozne
muchy, najma co sa tyka casovania.

Aby som to skratil, zahodte vsetko, zacnite odznova. U toho I2C, zacnite z
resetu a rucne nakonfigurujte jednotlive registre, priamym zapisom. Tento
I2C nemam sice velmi preslapany, ale ten starsi v 'F4 ma vselijake
vnutorne stavy, s ktorymi sa neda nijako rozumne vybabrat iba ho resetnut.
Nie nahodou ma resetovaci bit priamo v CR1. Tento novsi ten resetovaci bit
sice nema, ale zato ma rozne podozrive poznamky v dokumentacii, napr. pre
I2C_CR1.PE:

> When cleared, PE must be kept low for at least 3 APB clock cycles.

co moze znamenat napriklad, ze v tom Vasom kode, ak nepockate po vynulovani
PE dost dlho, tak ta zmena TIMINGR sa internymi registrami ignoruje.

Ale este raz zopakujem, pre istotu: neexperimentujte s "kniznicou",
nepokusajte sa pouzit "kniznicu" a potom nejake patche; ale nastavte to
I2C komplet rucne.

>tak jsem zkusil jeste zpomalit SYSCLK ze ktereho je ten I2C1 podle dat v registru ziveny, pomoci RCC_CFGR a MCOPRE[2:0]

MCOPRE nema s I2C nic spolocne, je to prescaler pre pin MCO. Frekvenciu
SYSCLK zmenite jedine v PLL, ak teda PLL pouzivate.

wek





----- Original Message ---------------
>zdravim,
> 
>mam prosim dotaz... snazim se v online mbedu-keilstudiu zpomalit CLK signal pro I2C1 periferii v STM32G431KB... aby se dala komunikace dobre sledovat pomalym osciloskopem...
>mbed ma na to funkci .frequency(Hz)   ale ta nefunguje... 
> 
>tak jsem to chtel zkusit "naprimo" pres nastaveni registru, nasel base address pro I2C1 v STM32G431
>0x4000 5400 - 0x4000 57FF 1 KB I2C1 Section 41.7.12: I2C register map
> 
>pak jsem si vybral 
>I2C timing register (I2C_TIMINGR) Address offset: 0x10  kde nastavenim Bits 31:28 PRESC[3:0]: Timing prescaler
>(This field is used to prescale I2CCLK in order to generate the clock period tPRESC used for data setup and hold counters)
> 
>kde nastavenim 1111 pro vsechny 4 bity bych cekal zpomaleni I2C_CLK...
>to nezabralo (frekvence stale 250kHz), tak jsem zkusil jeste vypinat-zapinat tu periferii, viz nize.
> 
>#define I2C1_TIMINGR (*((volatile unsigned int*)0x40005410))
>#define I2C1_CR1 (*((volatile unsigned int*)0x40005400))
> 
>I2C1_CR1 &= 0xFFFFFFFE;
>I2C1_TIMINGR |= 0xF0000000;
>I2C1_CR1 |= 0x01;
> 
>samozrejme je mozne ze funkce i2c.write toho mbedu si to zase pro jistotu prenastavi, ale uplne bych to necekal...  ok, ne podle cteni registru tam zustane co jsem nastavil...
> 
>tak jsem zkusil jeste zpomalit SYSCLK ze ktereho je ten I2C1 podle dat v registru ziveny, pomoci RCC_CFGR a MCOPRE[2:0]
>nastavenych na 100: MCO is divided by 16
>(In Run mode, the speed of the system clocks (SYSCLK, HCLK, PCLK) can be reduced by programming the prescaler registers)
> 
>take beze zmeny...
> 
>netusite prosim nekdo co delam blbe?
> 
>dik
>v,
> 
>



Další informace o konferenci Hw-list