STM32 har allt - Utom trådlöshet
- JimmyAndersson
- Inlägg: 26547
- Blev medlem: 6 augusti 2005, 21:23:33
- Ort: Oskarshamn (En bit utanför)
- Kontakt:
Re: STM32 har allt - Utom trådlöshet
FSMC har jag tänkt sätta mig in i, men har inte blivit av än.
DCMI har jag gjort flera projekt med. Men i C#, Python och assembler. (Språkval beroende på typ av projekt.)
I Python använde jag färdig library. Till de andra gjorde jag allt från grunden, mest för att jag inte hade lust att sätta mig in i färdig kod. (Att använda någon annans kod tar ibland längre tid och är mer förvirrande än att göra från grunden, tycker jag. Beror nog mycket på dokumentationen.)
En pdf som verkar bra:
https://www.st.com/resource/en/applicat ... ronics.pdf
DCMI har jag gjort flera projekt med. Men i C#, Python och assembler. (Språkval beroende på typ av projekt.)
I Python använde jag färdig library. Till de andra gjorde jag allt från grunden, mest för att jag inte hade lust att sätta mig in i färdig kod. (Att använda någon annans kod tar ibland längre tid och är mer förvirrande än att göra från grunden, tycker jag. Beror nog mycket på dokumentationen.)
En pdf som verkar bra:
https://www.st.com/resource/en/applicat ... ronics.pdf
Re: STM32 har allt - Utom trådlöshet
Jag tänkte köpa en LCD med taffs som jag aldrig har kommit i kontakt med förut. En ILI9341 3.2" versionen med parallell-bus. Jag har bara använt ILI9341 2.8" med SPI + färdigt bibliotek. Det fungerade och gjorde sin sak.
Men här tänker jag använda: https://www.banggood.com/3_2-Inch-ILI93 ... &rmmds=buy
Denna har 16-bit paralllell-bus, D0 -> D15.
Jag börjar med att skapa en slumpmässig konfiguering för LCD med FSMC. När jag gör denna konfiguering så får jag följande pinnar på min STM32:
På LCD:n så finns det följande pinnar Här har vi pinnarna
I STM32 när man ska läsa eller skriva till LCD:n så använder man följande.
Så om jag vill skriva till register 0xA3 så sätter jag då pAddress = 0xA3 och då ändras FSMC_A18 för mig? Varför valde jag just FSMC_A18 och inte FSMC_A17? Det kanske inte skiljer något mellan dom, förutom pin-placeringen på STM32 uC.
Men här tänker jag använda: https://www.banggood.com/3_2-Inch-ILI93 ... &rmmds=buy
Denna har 16-bit paralllell-bus, D0 -> D15.
Jag börjar med att skapa en slumpmässig konfiguering för LCD med FSMC. När jag gör denna konfiguering så får jag följande pinnar på min STM32:
- FSMC_NE1 - Chip select
- FSMC_NWE - Write enable
- FSMC_NOE - Output enable
- FSMC_D0->FSMC_D15 - Parallell databus
- FSMC_A18 - Adress-bussen
På LCD:n så finns det följande pinnar Här har vi pinnarna
- CS - Chip select (Kopplas ihop med FSMC_NE1)
- RS - Data register (Kopplas ihop med FSMC_A18)
- WR - Write control (Kopplas ihop med FSMC_NWE)
- RD - Read control (Kopplas ihop med FSMC_NOE)
- RST - Reset pin (Antar att denna blir en extern pinne där man sätt den hög hela tiden?)
- DB0->DB15 - Parallell databus (Kopplas ihop med FSMC_D0->FSMC_D15)
I STM32 när man ska läsa eller skriva till LCD:n så använder man följande.
Mer än så här vet jag inte. Vadå pAddress? Vadå pDestionationBuffer/pSourceBuffer?HAL_SRAM_Write_16b(&hsram1, pAddress, pSrcBuffer, BufferSize);
HAL_SRAM_Read_16b(&hsram1, pAddress, pDstBuffer, BufferSize);
Så om jag vill skriva till register 0xA3 så sätter jag då pAddress = 0xA3 och då ändras FSMC_A18 för mig? Varför valde jag just FSMC_A18 och inte FSMC_A17? Det kanske inte skiljer något mellan dom, förutom pin-placeringen på STM32 uC.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Re: STM32 har allt - Utom trådlöshet
Jag har använt FMSCbussen, men var ett tag sen.
Du har ju kopplat RS till A18 så nog därför den ändras.
Du måste ju ange pAddress för att processorn ska veta till vilken adress den ska skriva/läsa datat. Vilken adress du ska skriva till får du kolla i datablad på LCD.
Du har ju kopplat RS till A18 så nog därför den ändras.
Du måste ju ange pAddress för att processorn ska veta till vilken adress den ska skriva/läsa datat. Vilken adress du ska skriva till får du kolla i datablad på LCD.
Re: STM32 har allt - Utom trådlöshet
Okej!
Så det spelar ingen roll om jag använder A17 eller A18. Det är bara flyttningen av pinnen som sker?
Reset kan man väll koppla till VDD?
En annan fråga!
Vad tyckte ni om mitt val av en 4 MHz extern hög-kristall?
Jag beräknade med dessa formler, där sista formeln så testade jag Gm mot Gmcrit + externa resistansen R. Jag var tvungen att välja F = 4 för annars kunde jag varken uppfylla.
Så det spelar ingen roll om jag använder A17 eller A18. Det är bara flyttningen av pinnen som sker?
Reset kan man väll koppla till VDD?
En annan fråga!
Vad tyckte ni om mitt val av en 4 MHz extern hög-kristall?
Jag beräknade med dessa formler, där sista formeln så testade jag Gm mot Gmcrit + externa resistansen R. Jag var tvungen att välja F = 4 för annars kunde jag varken uppfylla.
Kod: Markera allt
Gmargin = Gm/Gmcrit % Denna måste vara över 5
Gm > (4*(ESR+R)*(2*pi*F*10^6)^2*(C0*10^(-12) + CL*10^(-12))^2*1000) % Gm måste vara större
Kod: Markera allt
% This follows the document AN2867
ESR = 130; % Crystall resistance
C0 = 7; % Shunt
CL = 12; % Crystall load capacitance
Cs = 5; % Capacitance between the board
F = 4; % Crystall frequency
Gm = 5; % Minimum gain for F4
% Gmcrit need to be less than 1 for a F4 according to the data sheet
Gmcrit = (4*ESR*(2*pi*F*10^6)^2*(C0*10^(-12) + CL*10^(-12))^2*1000)
% Gmargin need to be over 5 according to
Gmargin = Gm/Gmcrit
% Find the capacitors for the crystal
X = 2*(CL-Cs)
% External load
R = 1/(2*pi*F*10^6*X*10^(-12))
% Final check with the external load
Gm > (4*(ESR+R)*(2*pi*F*10^6)^2*(C0*10^(-12) + CL*10^(-12))^2*1000)
Re: STM32 har allt - Utom trådlöshet
Det är ganska komplext sätta upp en FMSC buss då den har MÅNGA inställningar beroende på vad den används till. Om du inte läst datablad noggrant rekommenderar jag dig följa exempelkoden istället för "göra en slumpmässig konfiguration i CubeMX" då det kan bli väldigt svårt debugga när data inte tas emot som det du tror du skickar.
Jag brukar köra intern oscillator i STM32 och sedan ev 32.768 kHz kristall till RTC om jag behöver det. Men visst behöver du väldigt noggrann CPU klocka är ju en kristall givetvis noggrannare.
Jag brukar köra intern oscillator i STM32 och sedan ev 32.768 kHz kristall till RTC om jag behöver det. Men visst behöver du väldigt noggrann CPU klocka är ju en kristall givetvis noggrannare.
Re: STM32 har allt - Utom trådlöshet
Men är inte en FMSC buss bara digitala utgångar som sägs antingen låg eller hög beroende på vad man skriver för register?
Alltså jag kunde lika gärna använda vanliga GPIO's. Typ som han har gjort här.
https://github.com/LonelyWolf/stm32/blo ... /ssd1289.c
Jag skulle kunna skriva om hans bibliotek så det passar FSMC bussen?
Hmm..
Smart idé!
Jag tror jag ska testa utan extern kristall. Bara för att jag aldrig har gjort det förut.
Alltså jag kunde lika gärna använda vanliga GPIO's. Typ som han har gjort här.
https://github.com/LonelyWolf/stm32/blo ... /ssd1289.c
Jag skulle kunna skriva om hans bibliotek så det passar FSMC bussen?
Hmm..
Smart idé!
Jag tror jag ska testa utan extern kristall. Bara för att jag aldrig har gjort det förut.
Re: STM32 har allt - Utom trådlöshet
Det är WiFi jag vill ha, dvs koppla upp en STM32 på internet. 

Re: STM32 har allt - Utom trådlöshet
Okej!
Nu har jag forskat lite kring DCMI. Ni får gärna rätta mig.
Jag har valt denna konfiguering. När jag valde denna konfiguering så fick jag
Här väljer jag circular för att om jag ska fylla på en array med DMA, så vill jag börja på index 0 för varje påfyllning. Tack varje STM32CubeIDE så genereras denna C-kod. Denna kod startar upp begynnelsen av att ta emot signaler från CMOS cameran och fylla på i DMA.
För att fylla på i DMA, så måste jag aktivera den. Här väljer jag DCMI_MODE_CONTINUOUS för jag vill att STM32 ska fylla på hos arrayen hela tiden.
pData är en array som jag fyller på med. Length är längden på arrayen. Datatypen hos pData ska vara uint32_t, men för en vanlig CMOS kamera så går det att använda uint8_t.
Det går även att klippa i bilden.
Och man kan stoppa kameran. Denna stoppar även DMA. För att starta igen så börjar man att anropa HAL_DCMI_Start_DMA.
Så om vi tittar lite i databladet.
Så måste jag ha denna konfiguering. Jag ändrade från 8-bit till 10-bit.
Så nu är det bara ställa in inställningen för CMOS cameran igenom I2C, t.ex. gamma, färg osv.
Nu har jag forskat lite kring DCMI. Ni får gärna rätta mig.
Jag har valt denna konfiguering. När jag valde denna konfiguering så fick jag
- DCMI_HSYNC
- DCMI_VSYNC
- DCMI_PIXCLK
- DCMI0->DCMI7
- Pixel clock polarity (DCMI_PIXCLK): Denna avgör om clockan på CMOS cameran börjar med hög signal eller låg signal
- Vertical synchronization polarity(DCMI_VSYNC): Har ingen aning vad denna gör, men det är väll också någon signallina som börjar angingen hög eller låg
- Horizontal synchronization polarity(DCMI_HSYNC): Samma sak här också. Koppla in den bara!
- Frequency of frame capture: Här får jag välja om jag vill att "logga" alla bilder som skickas till STM32, eller varannan, eller varje 4:e.
- JPEG mode: JPEG är alltså ett format för att komprimera bilder. Här har jag valt att jag vill använda JPEG för att komprimera bilden som jag får av kameran. Detta gör så att jag behöver använda mindre minne.
Här väljer jag circular för att om jag ska fylla på en array med DMA, så vill jag börja på index 0 för varje påfyllning. Tack varje STM32CubeIDE så genereras denna C-kod. Denna kod startar upp begynnelsen av att ta emot signaler från CMOS cameran och fylla på i DMA.
Kod: Markera allt
static void MX_DCMI_Init(void)
{
/* USER CODE BEGIN DCMI_Init 0 */
/* USER CODE END DCMI_Init 0 */
/* USER CODE BEGIN DCMI_Init 1 */
/* USER CODE END DCMI_Init 1 */
hdcmi.Instance = DCMI;
hdcmi.Init.SynchroMode = DCMI_SYNCHRO_HARDWARE;
hdcmi.Init.PCKPolarity = DCMI_PCKPOLARITY_FALLING;
hdcmi.Init.VSPolarity = DCMI_VSPOLARITY_LOW;
hdcmi.Init.HSPolarity = DCMI_HSPOLARITY_LOW;
hdcmi.Init.CaptureRate = DCMI_CR_ALL_FRAME;
hdcmi.Init.ExtendedDataMode = DCMI_EXTEND_DATA_8B;
hdcmi.Init.JPEGMode = DCMI_JPEG_ENABLE;
if (HAL_DCMI_Init(&hdcmi) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN DCMI_Init 2 */
/* USER CODE END DCMI_Init 2 */
}
pData är en array som jag fyller på med. Length är längden på arrayen. Datatypen hos pData ska vara uint32_t, men för en vanlig CMOS kamera så går det att använda uint8_t.
Kod: Markera allt
HAL_DCMI_Start_DMA(&hdcmi, DCMI_MODE_CONTINUOUS, pData, Length);
Kod: Markera allt
HAL_DCMI_EnableCrop(&hdcmi);
HAL_DCMI_ConfigCrop(&hdcmi, X0, Y0, XSize, YSize);
HAL_DCMI_DisableCrop(&hdcmi);
Kod: Markera allt
HAL_DCMI_Stop(&hdcmi);
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Re: STM32 har allt - Utom trådlöshet
Jag har valt att välja en OV7670 för att jag litar inte på vad Banggood säljer angående OV2640. Dessutom ger OV7670 en mindre data-array tillbaka. Lite sämre kamera, men den ger en bild iallfall.JimmyAndersson skrev: ↑28 januari 2021, 20:54:09 FSMC har jag tänkt sätta mig in i, men har inte blivit av än.
DCMI har jag gjort flera projekt med. Men i C#, Python och assembler. (Språkval beroende på typ av projekt.)
I Python använde jag färdig library. Till de andra gjorde jag allt från grunden, mest för att jag inte hade lust att sätta mig in i färdig kod. (Att använda någon annans kod tar ibland längre tid och är mer förvirrande än att göra från grunden, tycker jag. Beror nog mycket på dokumentationen.)
En pdf som verkar bra:
https://www.st.com/resource/en/applicat ... ronics.pdf
Tittar jag på denna bild

och sedan tittar jag på denna bild. Då ser vi att DCMI_HSYNC inte finns med i första bilden och att HREF har dykt upp men finns inte med i andra bilden. Hur löser jag detta? Ska den ens vara med?
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
- Klas-Kenny
- Inlägg: 11830
- Blev medlem: 17 maj 2010, 19:06:14
- Ort: Växjö/Alvesta
Re: STM32 har allt - Utom trådlöshet
Kollar du i databladet för kameran ser du att det finns en inställning i ett register, för att göra om HREF till HSYNC.
HREF och HSYNC verkar bara vara lite olika sätt att göra samma sak.
HREF och HSYNC verkar bara vara lite olika sätt att göra samma sak.
Re: STM32 har allt - Utom trådlöshet
Okej. Jag ska leta upp detta register!
En annan fråga som bygger på erfarenhet. Är det bättre att ha en kristall eller en PWM utgång om man vill driva en extern enhet som kräver XCLK in?
En annan fråga som bygger på erfarenhet. Är det bättre att ha en kristall eller en PWM utgång om man vill driva en extern enhet som kräver XCLK in?
Re: STM32 har allt - Utom trådlöshet
PWM och kristall är olika saker.
Kristall används till en oscillator för att få bra noggranhet.
Du kan använda PWM istället för en extern oscillator.
Så frågan är om du har en klockingång eller om du har inbyggd oscillator?
Kristall används till en oscillator för att få bra noggranhet.
Du kan använda PWM istället för en extern oscillator.
Så frågan är om du har en klockingång eller om du har inbyggd oscillator?