Категории:

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


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


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


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


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


  • Музыка


  • Инженерия


  • iVARIOUS


  • Mobil App


  • STM32. DMA - SPI - акселерометр

    Ниже приведен пример кода работы DMA в связке с SPI, USART и акселерометром MEMS платы DISCOVERY. Процесс работы прост - считывается значения регистров акселерометра, и передается через DMA на периферию USART2, которая отправляет данные через переходник RS-232- >USB на компьютер, и визуализируется в виде графика на дисплее. Чтоб не загружать страницу, сюда небыли помещены #defin-ы с указателями на адреса регистров STM32F407VG, но по названиям думаю тут все понятно, какие регистры используются. О том как определять адреса регистров по документации читайте в начальных статьях по программированию STM32.

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


    void SysTick_Handler(void)
    {
    GPIOE_BSRR|=0x80000;
    DMA2_S3CR|=0x1;
    }

    void USART_TX(uint32_t y)
    {
    USART2_DR=y-127;// центрируем график с осей по центру экрана
    while (!(USART2_SR&0x80)==0x80){}
    }

    void SystemInit(void)
    {
    }

    uint8_t x[] ={0xA9,0};//Адрес регистров осей акселерометра которые будут считываться.
    uint8_t y[2];
    uint8_t z;
    uint32_t i;

    void USART_ini(void)
    {
    RCC_GPIO|=0x1;
    GPIOA_MODER|=0xA0;
    GPIOA_AFRL|=0x7700;
    RCC_UART2|=0x20000;
    USART2_BRR=0x683;
    USART2_CR3|=0x80;
    USART2_CR1|=0x8;
    NVIC_ISER1|=0x40;
    USART2_CR1|=0x2000;
    }

    void SPI_ini(void)
    {
    RCC_GPIO|=0x19;

    GPIOA_MODER|=0xA800;
    GPIOA_AFRL|=0x55500000;

    GPIOE_MODER|=0x40;
    GPIOE_PUPDR|=0x40;
    GPIOE_BSRR|=0x8;

    RCC_SPI1|=0x1000;

    SPI1_CR1 |= 0x0002 |0x0001;
    SPI1_CR1 |=0x0300|0x0028;
    SPI1_CR1 |=0x04;
    SPI1_CRCPR=7;
    SPI1_CR2|=0x3;
    SPI1_CR1|=0x0040;

    GPIOE_BSRR=0x80000;
    SPI1_DR=0x20;
    while (!(SPI1_SR&0x1)==0x1){};
    z=SPI1_DR;
    SPI1_DR=0x97;
    while (!(SPI1_SR&0x1)==0x01){}
    z=SPI1_DR;
    GPIOE_BSRR=0x8;
    }

    void DMA_ini(void)
    {
    DMA1_RCC|=0x200000;
    DMA2_RCC|=0x400000;
    //.....................TX
    DMA2_S3CR= 0x06000000;//DMA_Channel_3;
    DMA2_S3PAR=0x4001300C;//SPI->DR
    DMA2_S3M0AR= (uint32_t)x;
    DMA2_S3CR|= 0x40;//DMA_DIR_MemoryToPeripheral;
    DMA2_S3NDTR=2;
    DMA2_S3CR|=0x0400;
    DMA2_S3CR|=0x10000;
    //DMA2_S3CR|=0x8;
    //DMA2_S3CR|=0x100;//DMA_CIRCULAR
    DMA2_S3CR|=0x10;

    NVIC_ISER1=0x8000000;
    DMA2_S3CR|=0x10;
    //....................RX
    DMA2_S0CR= 0x06000000;//DMA_Channel_3;
    DMA2_S0PAR=0x4001300C;//SPI->DR
    DMA2_S0M0AR=(uint32_t)y;
    DMA2_S0CR|= 0;//peripheralToMemory
    DMA2_S0NDTR=2;
    DMA2_S0CR|=0x400;
    DMA2_S0CR|=0x10000;
    //DMA2_S0CR|=0x100;
    DMA2_S0CR|=0x10;

    NVIC_ISER1=0x1000000;
    DMA2_S0CR|=0x10;
    } void DMA2_Stream0_IRQHandler(void)//...........SPI->RX
    {
    GPIOE_BSRR=0x8;
    DMA2_LIFCR=0x20;
    USART_TX(y[1]);
    }

    void DMA2_Stream3_IRQHandler(void)//...........SPI->TX
    {
    GPIOE_BSRR=0x80000;
    if((DMA2_LISR&0x8000000)==0x8000000)
    {DMA2_LIFCR=0x8000000;
    DMA2_S0CR|=0x1;}
    }
    void DMA1_Stream6_IRQHandler(void)
    {

    if((DMA_HISR&0x200000)==0x200000)
    DMA_HIFCR=0x200000;
    }

    int main(void)
    {
    USART_ini();
    SPI_ini();
    DMA_ini();
    GPIOD_MODER|=0x55000000;
    GPIOD_OTYPER|=0x55000000;
    SysTic_RVR=0xFFF;
    SysTic_CVR=0x0;
    SysTic_CTRL_Status=0x10007;
    while(1)
    {
    GPIOD_ODR=0xF000;
    for(i=0;i<1000000;i++){};
    GPIOD_ODR=0x0;
    for(i=0;i<1000000;i++){};
    }
    }



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

    2016-04-15 08:05:31



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

    Maya. Операции Booleans

    Maya. Split, Extrude, Merge

    STM32. ADC (АЦП). Пример кода

    PHP. Типовые команды MySQL

    STM32. Регистры DMA

    STM32. регистры таймеров TIM6 TIM7

    3D Моделирование

    JavaScript. Введение

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

    Java