2015-07-10 09:03 AM
Hello,
I received my STM32F746G-DISCO board 2 days ago, and I am trying to get the TFT-LCD module work, but I am having difficulties with the configuration of the FMC.I am struggling with the timing configuration for the SDRAM. I think I got it right for the most part, but I still can't access the memory. My FMC initialization function is the following:void
MX_FMC_Init(
void
)
{
FMC_SDRAM_TimingTypeDef SdramTiming;
/** Perform the SDRAM1 memory initialization sequence
*/
hsdram1.Instance = FMC_SDRAM_DEVICE;
/* hsdram1.Init */
hsdram1.Init.SDBank = FMC_SDRAM_BANK1;
hsdram1.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_8;
hsdram1.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_11;
hsdram1.Init.MemoryDataWidth = FMC_SDRAM_MEM_BUS_WIDTH_16;
hsdram1.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4;
hsdram1.Init.CASLatency = FMC_SDRAM_CAS_LATENCY_2;
hsdram1.Init.WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE;
hsdram1.Init.SDClockPeriod = FMC_SDRAM_CLOCK_PERIOD_2;
hsdram1.Init.ReadBurst = FMC_SDRAM_RBURST_ENABLE;
hsdram1.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_0;
/* SdramTiming */
SdramTiming.LoadToActiveDelay = 2;
SdramTiming.ExitSelfRefreshDelay = 7;
SdramTiming.SelfRefreshTime = 7;
SdramTiming.RowCycleDelay = 16;
//???
SdramTiming.WriteRecoveryTime = 1;
SdramTiming.RPDelay = 12;
SdramTiming.RCDDelay = 2;
HAL_SDRAM_Init(&hsdram1, &SdramTiming);
}
Ultimatly I would like to use also the TFT-LCD, and I think I found the model there:
http://www.rocktech.com.hk/Tpadb.aspx
However, I couldn't find the exact datasheet for the capacitive touch screen controller. I could only find datasheets for controllers from the same familly. Does anyone has the correct one?
Regards
#sdram #fmc #stm32f7 #emwin #discovery #stm32f7-lcd
2015-07-10 12:51 PM
Why wouldn't you review stm32746g_discovery_sdram.c ?
You might have to goose the timings slightly if running >100 MHz, but not by much./**
* @brief Initializes the SDRAM device.
* @retval SDRAM status
*/
uint8_t BSP_SDRAM_Init(void)
{
static uint8_t sdramstatus = SDRAM_ERROR;
/* SDRAM device configuration */
sdramHandle.Instance = FMC_SDRAM_DEVICE;
/* Timing configuration for 100Mhz as SD clock frequency (System clock is up to 200Mhz) */
Timing.LoadToActiveDelay = 2;
Timing.ExitSelfRefreshDelay = 7;
Timing.SelfRefreshTime = 4;
Timing.RowCycleDelay = 7;
Timing.WriteRecoveryTime = 2;
Timing.RPDelay = 2;
Timing.RCDDelay = 2;
sdramHandle.Init.SDBank = FMC_SDRAM_BANK1;
sdramHandle.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_8;
sdramHandle.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_12;
sdramHandle.Init.MemoryDataWidth = SDRAM_MEMORY_WIDTH;
sdramHandle.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4;
sdramHandle.Init.CASLatency = FMC_SDRAM_CAS_LATENCY_2;
sdramHandle.Init.WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE;
sdramHandle.Init.SDClockPeriod = SDCLOCK_PERIOD;
sdramHandle.Init.ReadBurst = FMC_SDRAM_RBURST_ENABLE;
sdramHandle.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_0;
/* SDRAM controller initialization */
BSP_SDRAM_MspInit(&sdramHandle, NULL); /* __weak function can be rewritten by the application */
if(HAL_SDRAM_Init(&sdramHandle, &Timing) != HAL_OK)
{
sdramstatus = SDRAM_ERROR;
}
else
{
sdramstatus = SDRAM_OK;
}
/* SDRAM initialization sequence */
BSP_SDRAM_Initialization_sequence(REFRESH_COUNT);
return sdramstatus;
}
2015-07-10 01:10 PM
Thanks for the tip, I actually didn't see this file -_-'
However, it seems that (in debug mode, with uVision) it manages to write in few memory locations before failing. My guess is that the FIFO might be filling up too fast? Should I check if the device is busy before writing?I will try that.Thanks2015-07-10 01:30 PM
I guess I'd try rebuilding, or reviewing the demo, and confirm if the SDRAM works from that.
STM32Cube_FW_F7_V1.1.0\Projects\STM32746G-Discovery\Demonstration\MDK-ARMSimpler use caseSTM32Cube_FW_F7_V1.1.0\Projects\STM32746G-Discovery\Examples\BSP\Src\main.cOr review the mechanics of SystemInit_ExtMemCtl()STM32Cube_FW_F7_V1.1.0\Projects\STM32746G-Discovery\Examples\DMA2D\DMA2D_MemToMemWithBlending\Src\system_stm32f7xx.c2015-07-10 01:34 PM
STM32Cube_FW_F7_V1.1.0\Projects\STM32746G-Discovery\Examples\FMC\FMC_SDRAM\Src\main.c
2015-07-10 02:01 PM
Ok, so I basically copies the function BSP_SDRAM_Initialization_Sequence(&hsdram, &command); and that did the trick.
There was way more things to configure!I will try to use the TFT-LCD now, but with the original program available it shouldn't be too hard. I couldn't see it at the beginning because I had the version 1.0.0 instead of 1.1.0!Thanks2016-04-04 05:50 AM
Hi
I am trying to make a Qwerty Touch keypad in STM32F746-Disco. From the Segger sample i downloaded the notepad.c file https://www.segger.com/cms/admin/uploads/userfiles/file/emWin/samples/src/SKINNING_Notepad.zipi included notepad.c file in STM32Cube_FW_F7_V1.1.0 Demonstration and fire the event to open notepad GUI from gardencontrol.c button click.I changed some lines of Maintask() as below . as per the code Notepad will display and go off after 500ms. The PROBLEM after the Notepad GUI goes off , again i click the button to show it. Like this after 14 times my displaygets hangup. How to tackle it?void Qwertypad(){ WM_HWIN hKeypad; WM_HWIN hFrame; WM_HWIN hMulti; WM_HWIN hAnim; hMulti = 0; // // Initialize emWin // //WM_SetCreateFlags(WM_CF_MEMDEV); //WM_SetCallback(WM_HBKWIN, _cbBk); //GUI_CURSOR_Show(); // // Set widget default settings for keypad // BUTTON_SetDefaultSkin(_DrawSkinFlex_BUTTON); // // Create keypad // hKeypad = WM_CreateWindowAsChild(0, 120, 320, 120, WM_HBKWIN, WM_CF_SHOW | WM_CF_STAYONTOP, _cbKeyPad, 0); //hKeypad=WM_CreateWindow(0,120,320, 140, WM_CF_SHOW, _cbKeyPad, 0); hFrame = 0; if(hFrame==0) { //BUTTON_SetDefaultSkin(BUTTON_SKIN_FLEX); BUTTON_SetDefaultSkin(_BUTTON_DrawSkinFlex); FRAMEWIN_SetDefaultSkin(FRAMEWIN_SKIN_FLEX); FRAMEWIN_SetDefaultTextAlign(GUI_TA_HCENTER); // // Create frame window // hFrame = FRAMEWIN_CreateEx(0, 0, 320, 240, WM_HBKWIN, WM_CF_SHOW, 0, 0, ''Notepad'', 0); FRAMEWIN_SetTextColor(hFrame, GUI_BLACK); FRAMEWIN_SetFont(hFrame, &GUI_Font20_AA4); FRAMEWIN_SetClientColor(hFrame, GUI_WHITE); FRAMEWIN_AddCloseButton(hFrame, FRAMEWIN_BUTTON_RIGHT, 0); // // Create multi edit widget // hMulti = MULTIEDIT_CreateEx(0, 0, 0, 0, WM_GetClientWindow(hFrame), WM_CF_SHOW, 0, GUI_ID_MULTIEDIT0, 100, NULL); MULTIEDIT_SetWrapWord(hMulti); MULTIEDIT_SetFont(hMulti, GUI_FONT_16B_ASCII); WM_SetFocus(hMulti); }// // Use animation functions to make editor and keypad visible// //// GUI_MEMDEV_ShiftInWindow(hFrame, 500, GUI_MEMDEV_EDGE_LEFT);// GUI_MEMDEV_ShiftInWindow(hKeypad, 500, GUI_MEMDEV_EDGE_BOTTOM); GUI_Delay(500);// // GUI_MEMDEV_ShiftOutWindow(hKeypad, 500, GUI_MEMDEV_EDGE_BOTTOM); if (WM_IsWindow(hFrame)) { GUI_MEMDEV_ShiftOutWindow(hFrame, 500, GUI_MEMDEV_EDGE_RIGHT); MULTIEDIT_SetText(hMulti, ''''); } else { hFrame = 0; } //GUI_Delay(50);}[i posted here because i couldnt create new discussion]2016-09-21 11:10 AM
Hi FearedSpark,
You can refer to this -Hannibal-