NOTICE توجه: این یک موضوع قدیمی است که آخرین پست ارسالی آن مربوط به 2505 روز قبل است . لطفا فقط پاسخ ها ، سوالات و درخواست های 100 درصد مرتبط را به آن ارسال کنید و برای درخواست ها و سوالات جدید موضوع جدیدی را ایجاد کنید
نمایش نتایج: از 1 به 12 از 12

موضوع: واحد dma2d و Chrom-ART Accelerator

  1. #1
    کاربر علاقه مند
    تاریخ عضویت
    May 2017
    نوشته ها
    23
    تشکر
    2
    تشکر شده 7 بار در 3 پست

    پیش فرض واحد dma2d و Chrom-ART Accelerator

    سلام
    بنده در میکروکنترلر ها دست و پا شکسته کار کرده ام و چند روزی است روی میکروی stm32f407 دارم کار می کنم
    تا به حال با واحد dma کار نکردم ولی توضیحی که شنیدم از اطرافیان این بوده که یه جور دسترسی مستقیم واحدها با ram میکرو هست
    حالا می خوام بدونم واحد DMA2D چی هست و چه کار بردی در بخش به خصوص راه اندازی LCD داره و از طرفی معنی و مفهموم Chrom-ART Accelerator در بخش DMA2D چی هست ؟؟

    و اینکه راه انداز lcdدر این میکرو زیر مجموعه واحد دیگری به نام FSMC قرار گرفته که ظاهرا برای راه اندازی آی سی های LCD کنترلر مانند SSD ها استفاده می شه درست فهمیدم ؟؟ اگر این طور هست این واحد کاملا می تونه نیازهای مارو روی LCD مرتفع کنه مثلا اگه بخواهیم تصویری رو وسط نمایش بدیم

  2. # ADS
    Circuit advertisement
    تاریخ عضویت
    Always
    نوشته ها
    Many
     

  3. #2
    مدیر انجمن mzarkoob آواتار ها
    تاریخ عضویت
    Jun 2011
    نام
    مهدی زرکوب
    نوشته ها
    2,902
    تشکر
    1,202
    تشکر شده 2,317 بار در 1,273 پست

    پیش فرض

    سلام
    بله با واحد FSMC می توان کنترل ال سی دی را انجام داد بدین صورت که تمام پایه های خروجی و کنترلی روی مد مربوطه(Alternate) قرار میگیره و بعد اینیشیالیز این واحد، برای ارسال فقط کافیه دیتا بره در محل مشخص از رم. کل روال ارسال انجام خودش دیگه انجام میشه! البته بازم درایور کار کنترل ال سی دی را انجام می دهد.
    این ویژگی در میکرویی مانند stm32f103VE هم وجود دارد.

  4. تشکرها از این نوشته :


  5. #3
    کاربر علاقه مند
    تاریخ عضویت
    May 2017
    نوشته ها
    23
    تشکر
    2
    تشکر شده 7 بار در 3 پست

    پیش فرض

    سلام
    در مورد اون دو بخش دیگه که در سوالم بود نظری ندارید ؟؟؟

    در مورد راه اندازی lcd با واحد fsmc

    #define LCD_RAM *(__IO uint16_t *) ((uint32_t)0x60020000) //disp Data ADDR
    #define LCD_REG *(__IO uint16_t *) ((uint32_t)0x60000000) //disp Reg ADDR
    این دو خط در تمام پروژه هایی که دانلود کردم مشترک بود
    تنها چیزی که فهمیدم این بود که برای فرستادن مقادیر در رم یا رجیستر lcd ازشون استفاده میشه ولی طریقه ارسالشون رو نفهمیدم
    البته اون اعداد هگز در پروژه ها با هم متفاوت بودند اول فکر می کردم این واحد fsmc وقتی مقادیری رو در اون آدرس ها می گذاریم با هر بار ریخته شدن مقادیر اینتراپت درونی داره که میفهمه اعداد جدید برای ارسال وجود داره و فکر می کردم اون اعداد هگز که آدرس یه جایی هستند مربوط به این واحد هست و همیشه مقدارش همینه ولی با توجه به اینکه مقدارش در پروژه های مختلف متفاوت بود فهمیدم که باید طریقه ارسال و دریافت به شکل دیگه ای باشه
    چه طور اطلاعات تبادل می شن
    من فقط دیدم که fsmc پیکر بندی شده و هر جا چیزی می خوان دریافت یا ارسال کنند مقدار LCD_REG یا LCD_RAM را تغییر می دهند
    ویرایش توسط seyed saeed : 31-05-2017 در ساعت 10:17

  6. #4
    کاربر فعال
    تاریخ عضویت
    Mar 2010
    نوشته ها
    236
    تشکر
    101
    تشکر شده 246 بار در 163 پست

    پیش فرض

    ببینید وظیفه واحد FMC و FSMC
    تبدیل ( یا MAP ) کردن یه حافظه بیرونی داخل رنج حافظه خود میکروکنترلر هست.
    FSMC چهار تا بانک داره که هرکدوم یک رنج حافظه دارن بسته با اینکه شما کدوم بانک رو فعال کنید ( هر بانک وظیقه خاصی رو داره ) اون ادرس ها فرق میکنه.
    مثلا ای سی SSD1963 خدود یک مگابایت حافظه sram داره که این حافظه نسبت به سایز ال سی دی تعیین میشه.
    حالا شما این حافظه رو مپ میکنید روی حافظه خود میکرو.زمانی که شما داخل این حافظه مینویسید واحل FSMC به طور اتوماتیک مقادیر رو بر میداره و داخل حافظه ssd1963 قرار میده.
    و در اخر راه ارتباطی میکرو و کنترلر ال سی دی میتونه 8086 و یا 6800 باشه .

  7. کاربران : 2 تشکر کرده اند از شما mrm برای ارسال این پست سودمند:


  8. #5
    کاربر علاقه مند
    تاریخ عضویت
    May 2017
    نوشته ها
    23
    تشکر
    2
    تشکر شده 7 بار در 3 پست

    پیش فرض

    نقل قول نوشته اصلی توسط mrm نمایش پست ها
    ببینید وظیفه واحد FMC و FSMC
    تبدیل ( یا MAP ) کردن یه حافظه بیرونی داخل رنج حافظه خود میکروکنترلر هست.
    FSMC چهار تا بانک داره که هرکدوم یک رنج حافظه دارن بسته با اینکه شما کدوم بانک رو فعال کنید ( هر بانک وظیقه خاصی رو داره ) اون ادرس ها فرق میکنه.
    مثلا ای سی SSD1963 خدود یک مگابایت حافظه sram داره که این حافظه نسبت به سایز ال سی دی تعیین میشه.
    حالا شما این حافظه رو مپ میکنید روی حافظه خود میکرو.زمانی که شما داخل این حافظه مینویسید واحل FSMC به طور اتوماتیک مقادیر رو بر میداره و داخل حافظه ssd1963 قرار میده.
    و در اخر راه ارتباطی میکرو و کنترلر ال سی دی میتونه 8086 و یا 6800 باشه .
    منظورتون اینه که وقتی این واحد پیکربندی میشه دیگه رجیستری به صورت مستقیم وجود نداره که ما مقادیر رو از روش بخونیم و در واقع ما آدرسی از رم میکرو رو داریم به صورت دستوری می خونیم
    یعنی این واحد هیچ بافری مثل واحد های دیگه مثل spi نداره مقادیر بین fsmc و ram میکرو کنترلر جابه جا می شن درسته ؟؟
    خب حالا این map کردن کجا اتفاق میفته ؟؟ موقع تنظیم اولیه fsmc یا جای دیگه
    چون من پروژه رو با stmcube ساختم و تازه کار هم هستم و هر چی تو پروژه ها سرچ کردم نمی فهمم اون اعداد چه طوری باید انتخاب بشن همین طوری که نمیشه یه عددی داد که چون باید تو این واحد شناسایی بشه

  9. #6
    کاربر علاقه مند
    تاریخ عضویت
    May 2017
    نوشته ها
    23
    تشکر
    2
    تشکر شده 7 بار در 3 پست

    پیش فرض

    فهمیدم پیدا کردم آدرس ها رو
    فایل پیوست 9472
    فقط میشه توضیح بدید این عملیات چه طور خودکار انجام میشه
    از طرفی این bank ها مقادیرشون به چه معنایی است ؟؟ چون مقادیر خیلی بالایی داره می پرسم
    و چرا در پروژه هایی که دیدم تفاوت دو عدد تنظیم شده در حدود 20000هگز هست
    ویرایش توسط seyed saeed : 31-05-2017 در ساعت 14:04

  10. #7
    کاربر علاقه مند
    تاریخ عضویت
    May 2017
    نوشته ها
    23
    تشکر
    2
    تشکر شده 7 بار در 3 پست

    پیش فرض

    تنظیمات این بخش چه طوری هست ؟؟
    من فعلا ssd1289 رو می خوام راه بندازم
    فایل پیوست 9474
    البته دو تا سوال اولم به قوت خودش باقی هستند

  11. #8
    مدیر انجمن mzarkoob آواتار ها
    تاریخ عضویت
    Jun 2011
    نام
    مهدی زرکوب
    نوشته ها
    2,902
    تشکر
    1,202
    تشکر شده 2,317 بار در 1,273 پست

    پیش فرض

    در تابع LCD_Init(); که پیکر بندی اولیه ال سی دی را انجام می دهد دو تابع استفاده شده :
    کد:
    FSMC_GPIO_Configuration();
        FSMC_LCD_Init();
    در تابع اول همه پایه ها در حالت GPIO_Mode_AF_PP قرار می گیرد و در تابع بعدی تنظیمات رجیسترهای واحد FSMC_Bank1 انجام می شود.

  12. #9
    کاربر علاقه مند
    تاریخ عضویت
    May 2017
    نوشته ها
    23
    تشکر
    2
    تشکر شده 7 بار در 3 پست

    پیش فرض

    سلام
    من fsmc رو با stmcube تنظیم کردم
    و می خوام باهاش ssd1289 راه اندازی کنم ولی نمی دونم کجای کارم اشتباهه که کار نمی کنه و فقط در دیباگ device code رو می تونم از روی ssd بخونم نمی دونم بقیه مقادیر درست هستند یا نه

  13. #10
    کاربر علاقه مند
    تاریخ عضویت
    May 2017
    نوشته ها
    23
    تشکر
    2
    تشکر شده 7 بار در 3 پست

    پیش فرض

    #include <stm32f4xx.h>
    static unsigned short DeviceCode;

    /* LCD RGB color definitions */
    #define Black 0x0000 /* 0, 0, 0 */
    #define Navy 0x000F /* 0, 0, 128 */
    #define DarkGreen 0x03E0 /* 0, 128, 0 */
    #define DarkCyan 0x03EF /* 0, 128, 128 */
    #define Maroon 0x7800 /* 128, 0, 0 */
    #define Purple 0x780F /* 128, 0, 128 */
    #define Olive 0x7BE0 /* 128, 128, 0 */
    #define LightGrey 0xC618 /* 192, 192, 192 */
    #define DarkGrey 0x7BEF /* 128, 128, 128 */
    #define Blue 0x001F /* 0, 0, 255 */
    #define Green 0x07E0 /* 0, 255, 0 */
    #define Cyan 0x07FF /* 0, 255, 255 */
    #define Red 0xF800 /* 255, 0, 0 */
    #define Magenta 0xF81F /* 255, 0, 255 */
    #define Yellow 0xFFE0 /* 255, 255, 0 */
    #define White 0xFFFF /* 255, 255, 255 */
    #define WHITE 0XFFFF /* 255, 255, 255 */
    #define RED 0xF800 /* 255, 0, 0 */
    #define BLUE 0x001F /* 0, 0, 255 */

    #define WIDTH 320 /* Screen Width (in pixels) */
    #define HEIGHT 240 /* Screen Hight (in pixels) */


    #define LCD_RAM *(__IO uint16_t *) ((uint32_t)0x60020000) //disp Data ADDR
    #define LCD_REG *(__IO uint16_t *) ((uint32_t)0x60000000) //disp Reg ADDR
    /************************************************** ***************************/
    void LCD_WriteCOM(uint16_t RGB_Code)
    {
    /* Write 16-bit GRAM Reg */
    LCD_REG = RGB_Code;
    }
    /************************************************** ***************************/
    void LCD_WriteRAM(uint16_t RGB_Code)
    {
    /* Write 16-bit GRAM Reg */
    LCD_REG = 0x22;
    LCD_RAM = RGB_Code;
    }

    /************************************************** ***************************/
    uint16_t LCD_ReadRAM(void)
    {

    LCD_REG = 0x22; /* Select GRAM Reg */

    return LCD_RAM;
    }

    /************************************************** ***************************/
    void LCD_WriteReg(uint16_t LCD_Reg,uint16_t LCD_RegValue)
    {

    LCD_REG= LCD_Reg;

    LCD_RAM= LCD_RegValue;
    }

    /************************************************** ***************************/
    uint16_t LCD_ReadReg(uint8_t LCD_Reg)
    {
    uint16_t temp;


    LCD_REG= LCD_Reg;

    temp= LCD_RAM;


    return temp;
    }

    /************************************************** ***************************/
    void LCD_WriteRAM_Prepare(void)
    {
    LCD_REG= 0X22;
    }
    /************************************************** **************************/
    void LCD_Init (void)
    {

    DeviceCode = LCD_ReadReg(0x00);


    if(DeviceCode==0x8989)
    {

    LCD_WriteReg(0x0007,0x0021);
    LCD_WriteReg(0x0000,0x0001);
    LCD_WriteReg(0x0007,0x0023);
    LCD_WriteReg(0x0010,0x0000);
    //delay(5);
    LCD_WriteReg(0x0007,0x0033);
    LCD_WriteReg(0x0011,0x6070);
    LCD_WriteReg(0x0002,0x0600);
    LCD_WriteReg(0x0003,0x0804);
    LCD_WriteReg(0x000C,0x0000);
    LCD_WriteReg(0x000D,0x0808);
    LCD_WriteReg(0x000E,0x2900);
    LCD_WriteReg(0x001E,0x00B8);
    LCD_WriteReg(0x0001,0x2B3F);
    LCD_WriteReg(0x0010,0x0000);
    LCD_WriteReg(0x0005,0x0000);
    LCD_WriteReg(0x0006,0x0000);
    LCD_WriteReg(0x0016,0xEF1C);
    LCD_WriteReg(0x0017,0x0003);
    LCD_WriteReg(0x0007,0x0233);
    LCD_WriteReg(0x000B,0x01C0);
    LCD_WriteReg(0x000F,0x0000);
    LCD_WriteReg(0x0041,0x0000);
    LCD_WriteReg(0x0042,0x0000);
    LCD_WriteReg(0x0048,0x0000);
    LCD_WriteReg(0x0049,0x013F);
    LCD_WriteReg(0x004A,0x0000);
    LCD_WriteReg(0x004B,0x0000);
    LCD_WriteReg(0x0044,0xEF00);
    LCD_WriteReg(0x0045,0x0000);
    LCD_WriteReg(0x0046,0x013F);
    LCD_WriteReg(0x0030,0x0707);
    LCD_WriteReg(0x0031,0x0204);
    LCD_WriteReg(0x0032,0x0204);
    LCD_WriteReg(0x0033,0x0502);
    LCD_WriteReg(0x0034,0x0507);
    LCD_WriteReg(0x0035,0x0204);
    LCD_WriteReg(0x0036,0x0204);
    LCD_WriteReg(0x0037,0x0502);
    LCD_WriteReg(0x003A,0x0302);
    LCD_WriteReg(0x003B,0x0302);
    LCD_WriteReg(0x0023,0x0000);
    LCD_WriteReg(0x0024,0x0000);
    LCD_WriteReg(0x0025,0x8000);
    LCD_WriteReg(0x004f,0x0000);
    LCD_WriteReg(0x004e,0x0000);
    }

    }

    /************************************************** *****************************/

    void LCD_WindowMax (void)
    {
    LCD_WriteReg(0x48, 0); /* Horizontal GRAM Start Address */
    LCD_WriteReg(0x49, 239); /* Horizontal GRAM End Address (-1) */
    LCD_WriteReg(0x4A, 0); /* Vertical GRAM Start Address */
    LCD_WriteReg(0x4B, 319); /* Vertical GRAM End Address (-1) */
    }
    /************************************************** ********************************/

    void LCD_SetCursor(unsigned char Xpos, unsigned short Ypos)
    {

    LCD_WriteReg(0x004E, Xpos);
    LCD_WriteReg(0X004F, Ypos);


    }
    /************************************************** *****************************
    * Clear display *
    * Parameter: color: display clearing color *
    * Return: *
    ************************************************** *****************************/

    void LCD_Clear (unsigned short color)
    {
    register unsigned int i;

    //LCD_WindowMax();

    //LCD_SetCursor(0,0);

    //LCD_WriteCOM(0x22);

    for(i = 0; i < (WIDTH*HEIGHT); i++){
    LCD_WriteRAM(color);}

    }


    - - - Updated - - -

    این برنامه ای هست که نوشتم
    البته باید بگم که fsmc در main برنامه پیکربندی میشه و بعد از اون LCD_Init فراخوانی میشه
    من می خواستم رنگ قرمز رو نمایش بدم که نشد
    ویرایش توسط seyed saeed : 06-06-2017 در ساعت 15:00

  14. #11
    کاربر علاقه مند
    تاریخ عضویت
    May 2017
    نوشته ها
    23
    تشکر
    2
    تشکر شده 7 بار در 3 پست

    پیش فرض

    فکر می کنم اشکال از این جا باشه که ماژول lcd روی 6800 باشه

  15. #12
    کاربر علاقه مند
    تاریخ عضویت
    May 2017
    نوشته ها
    23
    تشکر
    2
    تشکر شده 7 بار در 3 پست

    پیش فرض

    lcd 7 اینچ را راه اندازی کردم
    البته سرعت های مربوط به fsmc رو نفهمیدم چه طور تنظیم کنم و دستی باهاشون کلنجار می رم و سرعت رو زیاد می کنم ولی اصولش رو نمی دونم چیه
    البته pdf های سایت st رو دیدم ولی بعضی مواردش نامفهومه

    Write/Read access = ((ADDSET + 1) + (DATAST + 1)) × HCLK = tCYC
    The DATAST parameter is measured between the falling edge and the rising edge of the
    write signal in a write operation:
    Write Enable signal low to high = DATAST × HCLK
    To make sure of the correct timing configuration of the FSMC, the timings have to take into
    consideration:
    ● the maximun write/read access time
    ● The different internal memory delays.
    Hence, we have the following equations:
    ((ADDSET + 1) + (DATAST + 1)) × HCLK = max(tCYC, tCYC(READ))
    DATAST × HCLK = tWRLW
    DATAST must verify:
    DATAST = (((tACC + tAS ) + (tsu(Data_NE)+ tv(A_NE)))/HCLK) – ADDSET – 4
    Where:
    ● t
    su(Data_NE): FSMC_NEx low to data valid
    ● t
    v(A_NE): FSMC_NEx low to FSMC_A valid
    ● (tsu(Data_NE)+ tv(A_NE)) = 36 ns

  16. تشکرها از این نوشته :


کلمات کلیدی این موضوع

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •