Easyelectronics.ru

Электроника для всех
Текущее время: 27 сен 2022, 16:33

Часовой пояс: UTC + 5 часов




Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
 Заголовок сообщения: stm8l USART DMA
СообщениеДобавлено: 27 апр 2021, 12:36 
Здравствуйте!

Зарегистрирован: 27 апр 2021, 12:29
Сообщения: 2
Добрый день.

Пытаюсь получать данные с передатчика SBUS черед USART1 и DMA.
Но в итоге прерывание DMA срабатывает только раз и далее молчит.. при этом проц работает - вечный луп крутится..
Еще странность какая то - если делаю просто через прерывания, то после получения пары байт uart начинает глючить и читает постоянно предыдущий один байт и все...
Что может быть не так? Может ему скорость не нравится 100000 или еще чего?

Вот часть кода -

Код:
#define USART_DMA_CHANNEL_RX   DMA1_Channel2
#define USART_DMA_CHANNEL_TX   DMA1_Channel1
#define USART_DMA_FLAG_TCRX    (uint16_t)DMA1_FLAG_TC2
#define USART_DMA_FLAG_TCTX    (uint16_t)DMA1_FLAG_TC1
#define USART_DR_ADDRESS       (uint16_t)0x5231  /* USART1 Data register Address */
#define USART_TX_BUF_ADDR (uint32_t)(&dma_pack)

#define SBUS_PACKET_SIZE            25

uint8_t dma_pack[40];

static void USART_Config( void )
{
    CLK_PeripheralClockConfig( CLK_Peripheral_USART1, ENABLE );

    SYSCFG_REMAPPinConfig( REMAP_Pin_USART1TxRxPortA, ENABLE );

    GPIO_ExternalPullUpConfig( GPIOA, GPIO_Pin_3, ENABLE );
    GPIO_ExternalPullUpConfig( GPIOA, GPIO_Pin_2, ENABLE );

    USART_Init( USART1, ( uint32_t )100000, USART_WordLength_9b, USART_StopBits_2,
                USART_Parity_Even, ( USART_Mode_TypeDef )( USART_Mode_Rx ) );

    USART_Cmd( USART1, ENABLE);
}

static void DMA_Config( void )
{
    DMA_GlobalDeInit();

    DMA_DeInit( USART_DMA_CHANNEL_TX );
    DMA_DeInit( USART_DMA_CHANNEL_RX );

    CLK_PeripheralClockConfig( CLK_Peripheral_DMA1, ENABLE );

    DMA_Init( USART_DMA_CHANNEL_RX, USART_TX_BUF_ADDR, USART_DR_ADDRESS,
    SBUS_PACKET_SIZE,  DMA_DIR_PeripheralToMemory, DMA_Mode_Normal,
    DMA_MemoryIncMode_Inc, DMA_Priority_Low, DMA_MemoryDataSize_Byte );

    DMA_ITConfig( USART_DMA_CHANNEL_RX, DMA_ITx_TC, ENABLE );
    DMA_Cmd( USART_DMA_CHANNEL_RX, ENABLE );
    USART_DMACmd( USART1, USART_DMAReq_RX, ENABLE );

    DMA_GlobalCmd( ENABLE );

}


INTERRUPT_HANDLER( DMA1_CHANNEL2_3_IRQHandler, 3 )
{
    if ( DMA_GetFlagStatus( DMA1_FLAG_TC2 ) != RESET )

        DMA_Cmd( DMA1_Channel2, DISABLE );
        DMA_SetCurrDataCounter( DMA1_Channel2, 25 );
        DMA_Cmd( DMA1_Channel2, ENABLE );
        DMA_ClearFlag( DMA1_FLAG_TC2 );
       
    }
}

main()
{
CLK_SYSCLKDivConfig( CLK_SYSCLKDiv_1 );
USART_Config();
DMA_Config();
while(1);
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: stm8l USART DMA
СообщениеДобавлено: 27 апр 2021, 15:31 
Здравствуйте!

Зарегистрирован: 27 апр 2021, 12:29
Сообщения: 2
Выяснил что изза overrun error - но как так, dma не успевает что ли


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB