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

موضوع: ارسال دیتا از طریق usart با استفاده از واحد dma میکروکنترولر stm32f4

  1. #1
    کاربر فعال sajjad_AD آواتار ها
    تاریخ عضویت
    Aug 2009
    نام
    سجاد
    نوشته ها
    307
    تشکر
    336
    تشکر شده 471 بار در 181 پست

    پیش فرض ارسال دیتا از طریق usart با استفاده از واحد dma میکروکنترولر stm32f4

    سلام

    دوستان MikroC کار میدونن که برای واحد DMA لایبرری نداریم این کد رو که برای ارسال دیتا بوسیله DMA هست میزارم که خیلی کاربردیه :

    میکرو : STM32F4
    کامپایلر : MikroC ARM

    روی میکروی STM32F407VGT6 تست کردم و کاملا کار می کنه.
    لینک منبع که هم برای ارسال و هم برای دریافت برنامه رو به زبان بیسیک نوشته که من فقط ارسالش رو تبدیل کردم

    کد برنامه :

    کد:
    void DMA_USART2_TX() iv IVT_INT_DMA1_Stream6 ics ICS_AUTO {
    
      DMA1_HIFCR.CTCIF6 = 1;    //clear the int or it will not restart again!
    
    }
    
    //Main Function ----------------------------------------------------------------
    void main() {
        
      char rec[4] = "QWER";
    
      UART2_Init_Advanced(9600, _UART_8_BIT_DATA, _UART_NOPARITY, _UART_ONE_STOPBIT, &_GPIO_MODULE_USART2_PA23);
      
      RCC_AHB1ENR.DMA1EN = 1;   //Enable DMA1 CLOCK
    
      DMA1_S6CR = 0;            //Disable the DMA Stream by resetting EN bit to be able to change bit registers
      while(DMA1_S6CR.EN);      //wait until EN == 0 to make sure DMA is stopped
      DMA1_HIFCR.CTCIF6 = 1;    //All Stream Status dedicated registers to be cleared
    
      DMA1_S6PAR = &USART2_DR;  //Set peripheral port register address ; USART2 addr=40004400 and USART2_DR is at offset 0x4
      DMA1_S6M0AR = rec;        //Set memory address
      DMA1_S6NDTR = 4;          //total number of data items (in this case, send out 4 bytes)
    
      DMA1_S6FCR.DMDIS = 0;     //Direct mode
      
      //Select DMA channel request number (CH4 for USART2)
      DMA1_S6CR.CHSEL2 = 1;
      DMA1_S6CR.CHSEL1 = 0;
      DMA1_S6CR.CHSEL0 = 0;
      //Config the stream priority (to Very High)
      DMA1_S6CR.PL1 = 1;
      DMA1_S6CR.PL0 = 1;
      //Memory data size to 8 bit
      DMA1_S6CR.MSIZE1 = 0;
      DMA1_S6CR.MSIZE0 = 0;
      //Peripheral data size to 8 bit
      DMA1_S6CR.PSIZE1 = 0;
      DMA1_S6CR.PSIZE0 = 0;
      
      DMA1_S6CR.MINC = 1;       //Memory increment mode
      DMA1_S6CR.PINC = 0;       //Peripheral increment mode
      
      //Burst mode PERIPHERAL
      DMA1_S6CR.PBURST1 = 0;
      DMA1_S6CR.PBURST0 = 0;
      //Burst mode Memory
      DMA1_S6CR.MBURST1 = 0;
      DMA1_S6CR.MBURST0 = 0;
      //Data transfer direction (memory to peripheral)
      DMA1_S6CR.DIR1 = 0;
      DMA1_S6CR.DIR0 = 1;
      
      DMA1_S6CR.PFCTRL = 0;     //peripheral flow controller ,DMA flow
      DMA1_S6CR.TCIE = 1;       //Transfer complete interrupt enable
      
      //DMA mode is enabled for transmission
      USART2_CR3.DMAT = 1;
      USART2_SR.TC = 0;
      
      EnableInterrupts();
      NVIC_IntEnable(IVT_INT_DMA1_Stream6);
    
      //Stream enable (start the DMA Stream6)
      DMA1_S6CR.EN = 1;
    
      while(1);
    
    }
    آدرس مبدأ و آدرس مقصد و طول بافر با این سه دستور مشخص می شه:

    کد:
      DMA1_S6PAR = &USART2_DR;  //Set peripheral port register address ; USART2 addr=40004400 and USART2_DR is at offset 0x4
      DMA1_S6M0AR = rec;        //Set memory address
      DMA1_S6NDTR = 4;          //total number of data items (in this case, send out 4 bytes)
    و با این دستور عملیات ارسال آغاز می شه:

    کد:
      //Stream enable (start the DMA Stream6)
      DMA1_S6CR.EN = 1;
    در نهایت پس از اتمام ارسال DMA وقفه میزند و در بردار وقفه با دستور زیر واحد DMA را آماده برای ارسال بعدی می کنیم:

    کد:
      DMA1_HIFCR.CTCIF6 = 1;    //clear the int or it will not restart again!
    موفق باشید

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

  3. #2
    کاربر فعال
    تاریخ عضویت
    Jul 2007
    نوشته ها
    320
    تشکر
    48
    تشکر شده 39 بار در 33 پست

    پیش فرض

    برای keil چی؟

  4. #3
    کاربر فعال sajjad_AD آواتار ها
    تاریخ عضویت
    Aug 2009
    نام
    سجاد
    نوشته ها
    307
    تشکر
    336
    تشکر شده 471 بار در 181 پست

    پیش فرض

    نقل قول نوشته اصلی توسط gbg نمایش پست ها
    برای keil چی؟
    keil که براش مثال زیاد هست
    فکنم cmsis توابعی براش در نظر گرفته باشه
    ویرایش توسط sajjad_AD : 12-02-2015 در ساعت 11:27

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

    gbg

  6. #4
    کاربر فعال
    تاریخ عضویت
    Jul 2007
    نوشته ها
    320
    تشکر
    48
    تشکر شده 39 بار در 33 پست

    پیش فرض

    متاسفانه ندیدم
    من تو stm تازه کارم

موضوعات مشابه

  1. پاسخ: 1
    آخرين نوشته: 10-07-2014, 14:03
  2. مشکل در استفاده همزمان spi و usart
    توسط ahmadigonabad در انجمن AT91 series (ATMEL)
    پاسخ: 4
    آخرين نوشته: 14-05-2013, 16:18
  3. تبذیل ولوم های آنالوگ یک دستگاه به کلید های دیجیتالی
    توسط joojoo0065 در انجمن میکروکنترلرهای 8و16 بیتی
    پاسخ: 4
    آخرين نوشته: 02-01-2013, 00:44
  4. مشكل در استفاده از usart و lcd
    توسط alimohammad_s در انجمن میکرو کنترلر های 32 بیتی(arm)
    پاسخ: 4
    آخرين نوشته: 19-09-2011, 01:55
  5. استفاده‌ی همزمان از هر دو پورت سریالusart
    توسط fatemehjml در انجمن میکرو کنترلر های 32 بیتی(arm)
    پاسخ: 10
    آخرين نوشته: 31-03-2011, 01:07

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

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