Monthly Archives: December 2022

STM32F103 ir SD SDIO kortelė

Straipsnis skirtas tiems MCU kurie turi SDIO geležį.

Visur yra straipsniai apie SPI SD kortelės pajungimą arba kur jau rimtesnė techniką, tai SDIO su keturiais duomenų kanalais. Tačiau nebūtina naudoti visus kanalus, galima jungti ir per vieną. Todėl, kad prijungti SD kortelę užtenka 5 laidų: Vcc ir žemė, lieka trys duomenims. Reikia SDIO_SC (clock), SDIO_CMD ir SDIO_D0. Jei norim greitesnio skaitymo- D1, D2, D3.

Surašysiu ką aš dariau, kad šios dienos (2022.12.23) STM32CubeMX pagimdytų veikiantį kodą. Seniau reikėdavo naudoti išorinę biblioteką (dažniausiai FatFS iš elm-chan), dabar šią biblioteką kubikas automatiškai įkelia ir sukonfiguruoja. Dar karta pabrėžių – viską padaro. Nereikia rašyti jokių disk-io paprogramių. Nieko nereikia rašyti.

Pradedam nuo SDIO modulio aktyvavimo:
SDIO
Režimas – 1 bitas, būtinai reikalingas pertraukimas. Nors sako, kad veikia be jo. Man neveikė. DMA galima jungti, bet nepastebėjau ko nors. Kitas parametras: SDIOCLK clock divide factor – pasididinkit, nes ant pilno greičio ne visos SD kortelės gali dirbti (ypač pajungtos ant snarglių). Aš parašiau -4, prie 72MHz SDIO clock.
Continue reading →

STM32F103 ir “tikras” CRC32

STM32F103 (bent jau mano naudojamas) turi hardwarinį CRC32 skaičiuotuvą. Tačiau bėda- kažko tai suskaičiuotas CRC32 neatitinka kokio nors online kalkuliatoriaus rezultatui. Internetas prirašytas visko, bet niekur dorai nepaaiškinta kodėl nesutampa.
Atsakymas labai paprastas- big ar little endian skaičiuoja mūsų MCU ir dar kokia bitų seka.
CRC32 pas STM32 skaičiuojasi 32 bitų skaičiais. Todėl kokį nors baitų (ar raidžių) masyvą reikia papildyti iki kartotinio 4 dydžio. Jei masyvas sudarytas iš 32bitų elementų, reikia pasitikrinti tą “endian”. Poto imti masyvą po 4 baitus, sukuisti bitų seką (gerai, kad yra komanda RBIT, Reverse the bit order in a 32-bit word.), suskaičiuoti su hardware CRC32 rezultatą ir vėl sukuisti bitus su ta pačia komanda. Jei reikia, rezultatą invertuoti.

/* tekstines eilutes CRC skaiciavimas. Kartotinis 4. Netilpe baitai ignoruojami */
uint32_t RealCRC32txt(char * buf)
{
uint32_t len=strlen(buf)/4;
return RealCRC32((uint32_t *) buf, len);
}
 
 
/* CRC skaiciavimas naudojant 32 bitu masyva. Jei tikras masyvas, tai svarbu baitu seka, jei konversija is char/byte masyvo, tada nesvarbu */
uint32_t RealCRC32(uint32_t * buf, uint32_t len) //demesio, kas 4 baitai!
{
uint32_t crc,tmp,i;
 
	  hcrc.State = HAL_CRC_STATE_BUSY;
	__HAL_CRC_DR_RESET(&hcrc);
 
	for(i=0;i<len;i++)
	{
		tmp=buf[i];
		//tmp = ((tmp>>24)&0xff) | ((tmp<<8)&0xff0000) | ((tmp>>8)&0xff00) |  ((tmp<<24)&0xff000000); //baitu sekos konverteris
		tmp = __RBIT(tmp);
		hcrc.Instance->DR = tmp;
	}
	crc = __RBIT(hcrc.Instance->DR);
	hcrc.State = HAL_CRC_STATE_READY;
	return crc;
}

Užkomentuota ilga eilutė atkomentuojama, jei reikia skaičiuoti CRC tikram 32 bitų masyvui.

Teksto “00010002” CRC32= 1366C59F