سلام
احسنت بر تو رفیق چه اراده ای داری دوس داشتم
منم بعد یه عمری یه آموزش آماده کردم میذارم:
راه اندازی رم فروشگاه با استفاده از توابع HAL
خوب اوضاع از این قراره که باید طبق عکس زیر تنظیمات مربوط به FMC میکرومون رو که من از STM32F429ZET6 استفاده کردم انجام بدیم
بر اساس دیتاشیت رم، 13 بیت آدرس داریم و باس داده هم که 16 بیتی می باشد 4 بانک داده داریم اون تیک bit byte enable رو هم میذاریم که مپرس:
و سپس در بخش canfiguration / FMC / SDRAM 1 تنظیمات ذیل رو لحاظ می کنیم
سطر و ستون کلاک و فلان و فلان:
خب تنظیمات CubeMX به پایان رسید پروژه رو ایجاد کنید و بریم تو keil
باید به تابع برای تنظیم سرعت ریفرش SDRAM بنویسیم که به این صورت می باشد:
کد:
#define SDRAM_MODEREG_BURST_LENGTH_1 ((uint16_t)0x0000)
#define SDRAM_MODEREG_BURST_LENGTH_2 ((uint16_t)0x0001)
#define SDRAM_MODEREG_BURST_LENGTH_4 ((uint16_t)0x0002)
#define SDRAM_MODEREG_BURST_LENGTH_8 ((uint16_t)0x0004)
#define SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL ((uint16_t)0x0000)
#define SDRAM_MODEREG_BURST_TYPE_INTERLEAVED ((uint16_t)0x0008)
#define SDRAM_MODEREG_CAS_LATENCY_2 ((uint16_t)0x0020)
#define SDRAM_MODEREG_CAS_LATENCY_3 ((uint16_t)0x0030)
#define SDRAM_MODEREG_OPERATING_MODE_STANDARD ((uint16_t)0x0000)
#define SDRAM_MODEREG_WRITEBURST_MODE_PROGRAMMED ((uint16_t)0x0000)
#define SDRAM_MODEREG_WRITEBURST_MODE_SINGLE ((uint16_t)0x0200)
#define REFRESH_COUNT ((uint32_t)0x0569) /* SDRAM refresh counter (90MHz SD clock) */
static void SDRAM_Initialization_Sequence(SDRAM_HandleTypeDef *hsdram, FMC_SDRAM_CommandTypeDef *Command)
{
__IO uint32_t tmpmrd =0;
/* Step 3: Configure a clock configuration enable command */
Command->CommandMode = FMC_SDRAM_CMD_CLK_ENABLE;
Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;
Command->AutoRefreshNumber = 1;
Command->ModeRegisterDefinition = 0;
/* Send the command */
HAL_SDRAM_SendCommand(hsdram, Command, 0x1000);
/* Step 4: Insert 100 ms delay */
HAL_Delay(100);
/* Step 5: Configure a PALL (precharge all) command */
Command->CommandMode = FMC_SDRAM_CMD_PALL;
Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;
Command->AutoRefreshNumber = 1;
Command->ModeRegisterDefinition = 0;
/* Send the command */
HAL_SDRAM_SendCommand(hsdram, Command, 0x1000);
/* Step 6 : Configure a Auto-Refresh command */
Command->CommandMode = FMC_SDRAM_CMD_AUTOREFRESH_MODE;
Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;
Command->AutoRefreshNumber = 8;
Command->ModeRegisterDefinition = 0;
/* Send the command */
HAL_SDRAM_SendCommand(hsdram, Command, 0x1000);
/* Step 7: Program the external memory mode register */
tmpmrd = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_2 |
SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL |
SDRAM_MODEREG_CAS_LATENCY_3 |
SDRAM_MODEREG_OPERATING_MODE_STANDARD |
SDRAM_MODEREG_WRITEBURST_MODE_SINGLE;
Command->CommandMode = FMC_SDRAM_CMD_LOAD_MODE;
Command->CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;
Command->AutoRefreshNumber = 1;
Command->ModeRegisterDefinition = 0x0220;
/* Send the command */
HAL_SDRAM_SendCommand(hsdram, Command, 0x1000);
/* Step 8: Set the refresh rate counter */
/* (15.62 us x Freq) - 20 */
/* Set the device refresh counter */
HAL_SDRAM_ProgramRefreshRate(hsdram, REFRESH_COUNT);
}
این تابع بعد از فراخوانی توابع MX باید براخوانی شه در نهایت با استفاده از این توابع می تونیم تو رم بنویسیم و از رم بخونیم:
کد:
HAL_StatusTypeDef |
HAL_SDRAM_Read_8b (SDRAM_HandleTypeDef *hsdram, uint32_t *pAddress, uint8_t *pDstBuffer, uint32_t BufferSize) |
|
Reads 8-bit data buffer from the SDRAM memory. More... |
|
HAL_StatusTypeDef |
HAL_SDRAM_Write_8b (SDRAM_HandleTypeDef *hsdram, uint32_t *pAddress, uint8_t *pSrcBuffer, uint32_t BufferSize) |
|
Writes 8-bit data buffer to SDRAM memory. More... |
|
HAL_StatusTypeDef |
HAL_SDRAM_Read_16b (SDRAM_HandleTypeDef *hsdram, uint32_t *pAddress, uint16_t *pDstBuffer, uint32_t BufferSize) |
|
Reads 16-bit data buffer from the SDRAM memory. More... |
|
HAL_StatusTypeDef |
HAL_SDRAM_Write_16b (SDRAM_HandleTypeDef *hsdram, uint32_t *pAddress, uint16_t *pSrcBuffer, uint32_t BufferSize) |
|
Writes 16-bit data buffer to SDRAM memory. More... |
|
HAL_StatusTypeDef |
HAL_SDRAM_Read_32b (SDRAM_HandleTypeDef *hsdram, uint32_t *pAddress, uint32_t *pDstBuffer, uint32_t BufferSize) |
|
Reads 32-bit data buffer from the SDRAM memory. More... |
|
HAL_StatusTypeDef |
HAL_SDRAM_Write_32b (SDRAM_HandleTypeDef *hsdram, uint32_t *pAddress, uint32_t *pSrcBuffer, uint32_t BufferSize) |
|
Writes 32-bit data buffer to SDRAM memory. More... |
دیگر توابع SDRAM HAL
اینم شماتیک سخت افزارمون که عینا همینه:
پروژه و دیتاشیت رو هم که آپلود کردم موفق و همیشه پیروز باشید
راستی یادتون باشه آدرس بانک 1 :0xC0000000
و بانک 2 : 0xD0000000 می باشد