Fórum témák

» Több friss téma
Fórum » ARM - Miértek hogyanok
 
Témaindító: gtk, idő: Jún 26, 2007
Lapozás: OK   147 / 147
(#) cross51 válasza gtk hozzászólására (») Dec 13, 2019 /
 
Én most bele néztem a hal forráskódjába elvileg nem kell írnod semmi custom function-t mert a hal_spi tudja magától a 16 bitet, ha úgy initeled.
Annyit kell tenned, hogy az uint16_t* ptr-et átcastolod uint8_t* ra és HAL_SPI_Transmit size paraméterének a sizeof(uint16Tomb)/sizeof(uint16Tomb[0]) értéket adod meg.
(és persze arra figyelned kell, ha uint8_t* tömböt akarsz átvinni 16 bit-el akkor ennek a tömbnek 2 byte-os align-al kell lennie)

Amúgy én olyan aprócska eltérést találtam a HAL-hoz képest, hogy ott a TXDR-helyett DR-t használnak (de gondolom nem ez a ludas), és nem cast-olják a register-t 16 bites pointer-re hanem 32 bitesként írják, talán ez okozhatja a galibát.
(#) artur60 hozzászólása Feb 5, 2020 /
 
Sziasztok!

Nucleo L031K6-on próbálok am vevőről jeleket feldolgozni timer2 ch1-en.
Tesztnek gondoltam, hogy az egyik lábon csinálok 400us-os négyszög jeleket.
A timer2 ch1-en mérem időt Inputcatpure módban.
Megszakításban mőködik is rendesen, de ha DMA-val szeretném megoldani, akkor nem generálódik megszakítás élváltásra.
A kódot CubeMX-el generáltam.

timer2 init:
  1. TIM_ClockConfigTypeDef sClockSourceConfig = {0};
  2.   TIM_MasterConfigTypeDef sMasterConfig = {0};
  3.   TIM_IC_InitTypeDef sConfigIC = {0};
  4.  
  5.   htim2.Instance = TIM2;
  6.   htim2.Init.Prescaler = 0;
  7.   htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  8.   htim2.Init.Period = 0xFFFF;
  9.   htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  10.   htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  11.   if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
  12.   {
  13.     Error_Handler();
  14.   }
  15.   sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL;
  16.   if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK)
  17.   {
  18.     Error_Handler();
  19.   }
  20.   if (HAL_TIM_IC_Init(&htim2) != HAL_OK)
  21.   {
  22.     Error_Handler();
  23.   }
  24.   sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  25.   sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  26.   if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK)
  27.   {
  28.     Error_Handler();
  29.   }
  30.   sConfigIC.ICPolarity = TIM_INPUTCHANNELPOLARITY_BOTHEDGE;
  31.   sConfigIC.ICSelection = TIM_ICSELECTION_DIRECTTI;
  32.   sConfigIC.ICPrescaler = TIM_ICPSC_DIV1;
  33.   sConfigIC.ICFilter = 0;
  34.   if (HAL_TIM_IC_ConfigChannel(&htim2, &sConfigIC, TIM_CHANNEL_1) != HAL_OK)
  35.   {
  36.     Error_Handler();
  37.   }

timer2 gpio és dma init
  1. /**TIM2 GPIO Configuration   
  2.     PA0-CK_IN     ------> TIM2_CH1
  3.     */
  4.     GPIO_InitStruct.Pin = RADIORX_Pin;
  5.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  6.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  7.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  8.     GPIO_InitStruct.Alternate = GPIO_AF2_TIM2;
  9.     HAL_GPIO_Init(RADIORX_GPIO_Port, &GPIO_InitStruct);
  10.  
  11.     /* TIM2 DMA Init */
  12.     /* TIM2_CH1 Init */
  13.     hdma_tim2_ch1.Instance = DMA1_Channel5;
  14.     hdma_tim2_ch1.Init.Request = DMA_REQUEST_8;
  15.     hdma_tim2_ch1.Init.Direction = DMA_PERIPH_TO_MEMORY;
  16.     hdma_tim2_ch1.Init.PeriphInc = DMA_PINC_DISABLE;
  17.     hdma_tim2_ch1.Init.MemInc = DMA_MINC_ENABLE;
  18.     hdma_tim2_ch1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
  19.     hdma_tim2_ch1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
  20.     hdma_tim2_ch1.Init.Mode = DMA_CIRCULAR;
  21.     hdma_tim2_ch1.Init.Priority = DMA_PRIORITY_LOW;
  22.     if (HAL_DMA_Init(&hdma_tim2_ch1) != HAL_OK)
  23.     {
  24.       Error_Handler();
  25.     }


main-ben dma start:
  1. if(HAL_TIM_IC_Start_DMA(&htim2, TIM_CHANNEL_1, (uint32_t*) captures, 2) != HAL_OK)
  2. {
  3.         Error_Handler();
  4. }


Van valakinek ötlete mi lehet a hiba?
(#) kapu48 válasza artur60 hozzászólására (») Márc 7, 2020 /
 
A látott kódból ötlet nincsen.
De ha a CubeMX-el generált *.ioc kódot ide tennéd, hátha tudnánk ötletelni.
(#) kapu48 hozzászólása Márc 7, 2020 /
 
Sziasztok!

Nekem is kellene kevés segítség!
Az idézet kódrészlet végén, hogyan kapom meg helyesen az SD kártya méretét?
  1. void Get_SD_Card_Info(void)
  2. {
  3.         HAL_SD_CardInfoTypeDef cardInfo;
  4.        
  5.         printf("\nGet SD Card Info:\n");
  6.         uint8_t err = BSP_SD_Init();
  7.     BSP_SD_GetCardInfo(&cardInfo);
  8.  
  9.         printf("cardType        = %u\n", (unsigned int)cardInfo.CardType);
  10.         printf("cardVersion     = %u\n", (unsigned int)cardInfo.CardVersion);
  11.         printf("infoClass       = %u\n", (unsigned int)cardInfo.Class);
  12.         printf("relCardAdd      = %u\n", (unsigned int)cardInfo.RelCardAdd);
  13.         printf("blockNbr        = %u\n", (unsigned int)cardInfo.BlockNbr);
  14.         printf("blockSize       = %u\n", (unsigned int)cardInfo.BlockSize);
  15.         printf("logBlockNbr     = %u\n", (unsigned int)cardInfo.LogBlockNbr);
  16.         printf("logBlockSize = %u\n", (unsigned int)cardInfo.LogBlockSize);
  17.         printf("cardSize        = %u Byte, %u Kbyte\n\n", cardInfo.LogBlockSize * cardInfo.LogBlockNbr, (unsigned int)(cardInfo.LogBlockSize * cardInfo.LogBlockNbr) / 1023);
  18.  
  19. }
(#) benjami válasza kapu48 hozzászólására (») Márc 9, 2020 / 1
 
Hasonlítsd össze valami PC-s program által megmutatott értékkel melyik van összhangban (pl. a WinHex / open disk / phisical storage devices - t megnyitva bájtban kiírja a fizikai kapacitást). Arra is figyelj, hogy ha nagyobb a kártyád 4GB--nál ki fogsz futni a 32 bites értékből. A kByte kiíráshoz miért 1023-al osztottál?
(#) kapu48 válasza benjami hozzászólására (») Márc 13, 2020 /
 
Szia!
Köszi, a választ!
Idézet:
„A kByte kiíráshoz miért 1023-al osztottál?”

Mert nem tudtam eldönteni mi a jó osztó?
1024, vagy 1024-1? Ez volt tulajdonképen a kérdés.

A Total Commander-el próbáltam hasonlítani, de nagyon vad számok jöttek ki.
A hozzászólás módosítva: Márc 13, 2020
(#) benjami válasza kapu48 hozzászólására (») Márc 15, 2020 /
 
A tc nem a fizikai méretet mondja, hanem a rajta levő partíció területén levő felhasználói adattal megtölthető területet. Még arra is lenne lehetőség, hogy több partícióra osszuk az SD kártyát, bár ezt ritkán szokták alkalmazni. Ott akkor mit írton a tc? Azért mondtam a winhex-et, mert az képes fizikai eszközként megnyitni a kártyát, ott meg csak szektorok vannak 0-tól n-ig.
Mivel a váltószám 1024 a bájt és a kilobájt között, annyival kellene osztani (a fordító jó esetben ezt 10 bitnyi shiftelésnek fogja fordítani).
(#) cross51 hozzászólása Kedd, 23:02 /
 
Sziasztok!

Egy kis segítséget szeretnék kérni olyantól aki használ CubeMx-et és altiumot, mert írtam egy software-t ami a Cube adatbázisából tud altium-hoz symbol-t generálni.
Valaki ki próbálná, hogy működik-e nála?
Csatolok egy egyszerű doksit is mi merre van benne. (Magától keresi a Cube-ot a software)

Az altium-os oldal nincs annyira leírva doksiban a program-ban controller kiválaszt->Run Generator->Copy To Clipboard altium-on belül panels->SCH Lib List->Az SCH Lib List-en belül bal felül View-t át kell állítani edit-re->Jobb klikk Smart Grid Insert->A felugró ablakban Automatically Determinate Paste->Ok és a symbol megjelenik.

A kód nyílt forrású lesz meg osztom majd azt is csak először szeretnék egy tesztet, hogy ne kerüljön fel hülyeség.

Bármi észrevételt szívesen veszek a dologgal kapcsolatban.
Köszi a segítséget!
Következő: »»   147 / 147
Bejelentkezés

Belépés

Hirdetés
Lapoda.hu     XDT.hu     HEStore.hu