اموزش راه اندازی spi در نرم افزار cubemx
سلام مجدد خدمت همه دوستان عزیزم امشب قصد دارم اموزش مقدماتی قسمت spi را در نرمافزار cubemx در اختیار شما دوستان عزیز قرار بدم در برنامه ای که قرار میدم میتونید یک شیفت رجیستر سریال را طبق شماتیک به میکرو متصل کنید و خروجیهاتون را قطع و وصل کنید فقط لازم هست من یک مقدار در مورد برنامه توضیح بدم
کد:
HAL_SPI_Transmit (&hspi3, (uint8_t*)aTxBuffer, 1, 5000);
در این خط از برنامه aTxBuffer همان بافری است که اطلاعات ان را ارسال میکنیم و عدد 1 همان تعداد بایت هست که میخواهیم ارسال کنیم و 5000 هم به معنی حداکثر 5000 میلی ثانیه این فرمان طول بکشد و اگر بیشتر شد عملیات متوقف و برنامه به خط بعد منتقل شود به همین راحتی اگر توجه کنید خیلی شبیه UART شد حتی اگر خواستید از DMA هم استفاده کنید خیلی راحته درست مثل همون UART میتونید تو کیوب ام ایکس تو همون جدول مربوط به را بط DMA مربوط به رابط SPI میایم DMA مربوط به ارسال یا دریافت را انتخاب میکنیم و با فرمانهای
کد:
HAL_SPI_Transmit_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)
کد:
HAL_SPI_Receive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)
به تعدادی که لازم داریم بایت ارسال یا دریافت میکنیم البته باز فکر کنم برای اینکه همه متوجه بشن یک پروژه تو این زمینه هم بگذارم که همه شیر فهم بشن در پایان این نکته رو هم بگم که ما هنوز اول کار هستیم و هنوز وارد برنامه نویسی بصورت حرفه ای نشدیم این هم بشما بگم در ازمایشهای متعدد من عملا متوجه شدم واقعا کیفیت کد IAR از کیل یک مقداری بیشتره باید سعی کنیم در اینده بیشتر با این نرم افزار کار کنیم تا ایندتون درخشان بشه :018: در هر صورت التماس دعا داریم یا علی مدد:125:
[Dear Guest/Member you can't see link before replyclick here to register]
5 فایل پیوست
راه اندازی SDRAM K4S561632C با استفاده از CubeMX و Keil ARM
سلام :hi:
احسنت بر تو رفیق چه اراده ای داری :roll: دوس داشتم
منم بعد یه عمری یه آموزش آماده کردم میذارم:
راه اندازی رم فروشگاه با استفاده از توابع HAL
خوب اوضاع از این قراره که باید طبق عکس زیر تنظیمات مربوط به FMC میکرومون رو که من از STM32F429ZET6 استفاده کردم انجام بدیم
بر اساس دیتاشیت رم، 13 بیت آدرس داریم و باس داده هم که 16 بیتی می باشد 4 بانک داده داریم اون تیک bit byte enable رو هم میذاریم که مپرس:
[Dear Guest/Member you can't see link before replyclick here to register]
و سپس در بخش canfiguration / FMC / SDRAM 1 تنظیمات ذیل رو لحاظ می کنیم
سطر و ستون کلاک و فلان و فلان:
[Dear Guest/Member you can't see link before replyclick here to register]
خب تنظیمات 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 باید براخوانی شه در نهایت با استفاده از این توابع می تونیم تو رم بنویسیم و از رم بخونیم:
کد:
[Dear Guest/Member you can't see link before replyclick here to register] |
[Dear Guest/Member you can't see link before replyclick here to register] ([Dear Guest/Member you can't see link before replyclick here to register] *hsdram, uint32_t *pAddress, uint8_t *pDstBuffer, uint32_t BufferSize) |
|
Reads 8-bit data buffer from the SDRAM memory. [Dear Guest/Member you can't see link before replyclick here to register] |
|
[Dear Guest/Member you can't see link before replyclick here to register] |
[Dear Guest/Member you can't see link before replyclick here to register] ([Dear Guest/Member you can't see link before replyclick here to register] *hsdram, uint32_t *pAddress, uint8_t *pSrcBuffer, uint32_t BufferSize) |
|
Writes 8-bit data buffer to SDRAM memory. [Dear Guest/Member you can't see link before replyclick here to register] |
|
[Dear Guest/Member you can't see link before replyclick here to register] |
[Dear Guest/Member you can't see link before replyclick here to register] ([Dear Guest/Member you can't see link before replyclick here to register] *hsdram, uint32_t *pAddress, uint16_t *pDstBuffer, uint32_t BufferSize) |
|
Reads 16-bit data buffer from the SDRAM memory. [Dear Guest/Member you can't see link before replyclick here to register] |
|
[Dear Guest/Member you can't see link before replyclick here to register] |
[Dear Guest/Member you can't see link before replyclick here to register] ([Dear Guest/Member you can't see link before replyclick here to register] *hsdram, uint32_t *pAddress, uint16_t *pSrcBuffer, uint32_t BufferSize) |
|
Writes 16-bit data buffer to SDRAM memory. [Dear Guest/Member you can't see link before replyclick here to register] |
|
[Dear Guest/Member you can't see link before replyclick here to register] |
[Dear Guest/Member you can't see link before replyclick here to register] ([Dear Guest/Member you can't see link before replyclick here to register] *hsdram, uint32_t *pAddress, uint32_t *pDstBuffer, uint32_t BufferSize) |
|
Reads 32-bit data buffer from the SDRAM memory. [Dear Guest/Member you can't see link before replyclick here to register] |
|
[Dear Guest/Member you can't see link before replyclick here to register] |
[Dear Guest/Member you can't see link before replyclick here to register] ([Dear Guest/Member you can't see link before replyclick here to register] *hsdram, uint32_t *pAddress, uint32_t *pSrcBuffer, uint32_t BufferSize) |
|
Writes 32-bit data buffer to SDRAM memory. [Dear Guest/Member you can't see link before replyclick here to register] |
[Dear Guest/Member you can't see link before replyclick here to register]
اینم شماتیک سخت افزارمون که عینا همینه:
[Dear Guest/Member you can't see link before replyclick here to register]
پروژه و دیتاشیت رو هم که آپلود کردم موفق و همیشه پیروز باشید :hi:
راستی یادتون باشه آدرس بانک 1 :0xC0000000
و بانک 2 : 0xD0000000 می باشد
راه اندازی وقفه تایمر بکمک کیوب ام ایکس
سلام مجدد به همه دوستان طبق قولی که به یکی از دوستان داده بودم قرار بر این شد که یک نمونه مثال در مورد راه اندازی وقفه تایمر قرار بدم اگر توجه کنید در عکسها توضیحات را بطور کامل قرار دادم باز هم اگر سوالی پیش اومد در خدمت هست یا علی مدد البته در پایان یک نکته را بگم تا فراموش نکردم روتین وقفه ما طبق منوال گذشته از همون توابع CALLBACK هست که در اینجا برای وقفه سریز تایمر این است
کد:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)