Категории:

  • Программирование


  • Изобразительное искусство


  • Программирование встраиваемых систем


  • Компьютерная графика


  • WEB Разработка


  • Музыка


  • Инженерия


  • iVARIOUS


  • Mobil App


  • STM32. DMA USART

    В даном примере мы рассмотрим передачу USART через DMA , на компьютер. Как обсуждалось в статье по передачи данных USART , использовался переходник RS-232->USB , а также терминал в компьютере (скачать который без труда можно в интернете) симулирующий работу COM порта. Сложного в работе связки USART->DMA ничего нет, все тоже самое как в обычной передаче USART , но нужно будет еще провести иннициализацию DMA. Традиционно в примере не будут использоваться библиотеки типа StdPeriph , от которых код только увеличивается, гораздо лаконичнее и очевиднее число установленное в соответствующий регистр.
    Программа следующая: светодиоды мигают, и паралельно идет передача DMA. Процессор вмешивается только когда вызывается прерывание.

    Адреса регистров DMA1
    Адреса регистров DMA2


    void SystemInit(void)
    {
    }

    char buffer[]={"iVARIOUS.COM"};// Строка, которую будем передавать


    void GPIOD_ini(void) //Процессор занят миганием светодиодов, в то время как DMA передает данные
    {
    RCC_GPIO|=0x8;
    GPIOD_MODER=0x55000000;
    GPIOD_PUPDR=0x55000000;
    }


    void USART2_ini(void)// иннициализация USART2
    {
    RCC_GPIO|=0x1;// Тактирование порта A, на котором ножки USART2
    GPIOA_MODER|=0xA0;
    GPIOA_AFRL|=0x7700;
    RCC_UART2|=0x20000;
    USART2_BRR=0x683; //BaudRate=9600
    USART2_CR3|=0x80;
    USART2_CR1|=0xC;// включаем передачу и прием
    NVIC_ISER1|=0x40;//Прерывание
    USART2_CR1|=0x2000;//Запуск USART2
    }


    void DMA_ini(void)
    {

    DMA1_RCC|=0x200000;

    DMA_S6CR= 0x08000000; //DMA_Channel_4;
    DMA_S6PAR=0x40004404;
    DMA_S6M0AR= (uint32_t)buffer;
    DMA_S6CR|= 0x40; //DMA_DIR_MemoryToPeripheral;
    DMA_S6NDTR=sizeof(buffer);
    DMA_S6CR|=0x400;
    DMA_S6CR|=0x10000;
    DMA_S6CR|=0x100;
    NVIC_ISER0=0x20000;
    DMA_S6CR|=0x10;
    }
    //------------------
    void DMA1_Stream6_IRQHandler(void)
    {
    if ((DMA_HISR&0x200000) == 0x200000)
    {
    DMA_HIFCR=0x200000;//DMA_ClearITPendingBit(DMA1_Stream6, DMA_IT_TCIF6);
    }
    }
    //------------------
    int main(void)
    { uint32_t i=0;

    USART2_ini();
    DMA_ini();
    GPIOD_ini();

    DMA_S6CR|=0x1;

    while(1)
    {
    GPIOD_ODR=0xA000;
    for(i=0;i<1000000;i++){};
    GPIOD_ODR=0;
    for(i=0;i<1000000;i++){};

    }
    }



    Читайте больше в категории: Программирование встраиваемых систем

    2016-04-14 16:06:45



    Другие статьи:

    Рисунок. Портрет

    Android. HttpURLConnection. Чтение WEB HTML

    Maya. Операция Fill Hole

    Maya. Сглаживание Smooth и по нормалям

    Инженерия

    Java. Интерфейсы

    Android. Thread - потоки

    UNGVAR 3D. Ужгород в паралельному вимірі

    STM32. Регистры портов GPIO

    PHP. Введение