Easyelectronics.ru

Электроника для всех
Текущее время: 29 янв 2022, 15:43

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



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 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 часов


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

Сейчас этот форум просматривают: Google [Bot], kvn234


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

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

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