реклама на сайте
подробности

 
 
> stm32 DMA в режиме DMA_Mode_Normal, как перезапустить запись?
klen
сообщение Jul 6 2011, 07:43
Сообщение #1


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



здравствуйте.
столькнулся с тем что не понимаю как это работает.
настроенный dma канал читает данные с уарта в буффер озу в режиме DMA_Mode_Normal.
после заполнения буфера как и положено становится как вкопаный. указатель позиции соответствует размеру буфера.
как сказать ему чтоб он повторил действие. сброс указателя позиции и включение и выключение уарта и самого канала dma не приводит к началу записи в буфер.
он явно чтото друго ждет от меня

спасибо
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
prm
сообщение Jul 6 2011, 08:26
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 43
Регистрация: 4-04-07
Пользователь №: 26 760



Понял. Я подобным образом работаю с DS18b20. Вот рабочий кусок кода(лишнее можно выбросить, я подстраховался):

Код
    USART_Cmd(USART_DS18B20, DISABLE);
    //USART_DS18B20
    USART_InitTypeDef USART_InitStructure;
    USART_InitStructure.USART_BaudRate            = 115200;
    USART_InitStructure.USART_WordLength          = USART_WordLength_8b;
    USART_InitStructure.USART_StopBits            = USART_StopBits_1;
    USART_InitStructure.USART_Parity              = USART_Parity_No;
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    USART_InitStructure.USART_Mode                = USART_Mode_Rx | USART_Mode_Tx;
    USART_Init(USART_DS18B20, &USART_InitStructure);

    // конфигурирую DMA
    DMA_InitTypeDef DMA_InitStructure;

    DMA_DeInit(USART_DS18B20_Rx_DMA_Ch);
    DMA_InitStructure.DMA_PeripheralBaseAddr    = (uint32_t)&USART_DS18B20_DR_Base;
    DMA_InitStructure.DMA_MemoryBaseAddr        = (uint32_t)rx_data_buf;
    DMA_InitStructure.DMA_DIR                   = DMA_DIR_PeripheralSRC;
    DMA_InitStructure.DMA_BufferSize            = 1000;
    DMA_InitStructure.DMA_PeripheralInc         = DMA_PeripheralInc_Disable;
    DMA_InitStructure.DMA_MemoryInc             = DMA_MemoryInc_Enable;
    DMA_InitStructure.DMA_PeripheralDataSize    = DMA_PeripheralDataSize_Byte;
    DMA_InitStructure.DMA_MemoryDataSize        = DMA_MemoryDataSize_Byte;
    DMA_InitStructure.DMA_Mode                  = DMA_Mode_Normal;
    DMA_InitStructure.DMA_Priority              = DMA_Priority_VeryHigh;
    DMA_InitStructure.DMA_M2M                   = DMA_M2M_Disable;
    DMA_Init(USART_DS18B20_Rx_DMA_Ch, &DMA_InitStructure);

    DMA_DeInit(USART_DS18B20_Tx_DMA_Ch);
    DMA_InitStructure.DMA_PeripheralBaseAddr   = (uint32_t)&USART_DS18B20_DR_Base;
    DMA_InitStructure.DMA_MemoryBaseAddr       = (uint32_t)tx_data_buf;
    DMA_InitStructure.DMA_DIR                  = DMA_DIR_PeripheralDST;
    DMA_InitStructure.DMA_BufferSize           = cnt;
    DMA_InitStructure.DMA_PeripheralInc        = DMA_PeripheralInc_Disable;
    DMA_InitStructure.DMA_MemoryInc            = DMA_MemoryInc_Enable;
    DMA_InitStructure.DMA_PeripheralDataSize   = DMA_PeripheralDataSize_Byte;
    DMA_InitStructure.DMA_MemoryDataSize       = DMA_MemoryDataSize_Byte;
    DMA_InitStructure.DMA_Mode                 = DMA_Mode_Normal;
    DMA_InitStructure.DMA_Priority             = DMA_Priority_VeryHigh;
    DMA_InitStructure.DMA_M2M                  = DMA_M2M_Disable;
    DMA_Init(USART_DS18B20_Tx_DMA_Ch, &DMA_InitStructure);

    USART_ClearFlag(USART_DBG,USART_IT_TC);
    USART_Cmd(USART_DS18B20, ENABLE);
    USART_DMACmd(USART_DS18B20,           USART_DMAReq_Tx | USART_DMAReq_Rx, ENABLE);
    DMA_ITConfig(USART_DS18B20_Tx_DMA_Ch, DMA_IT_TC | DMA_IT_TE,             ENABLE);
    DMA_ITConfig(USART_DS18B20_Rx_DMA_Ch, DMA_IT_HT | DMA_IT_TC | DMA_IT_TE, DISABLE);

    // запускаю передачу
    DMA_Cmd(USART_DS18B20_Rx_DMA_Ch, ENABLE);
    DMA_Cmd(USART_DS18B20_Tx_DMA_Ch, ENABLE);

    // засыпаю до завершения передачи

    USART_Cmd(USART_DS18B20, DISABLE);
    DMA_Cmd(USART_DS18B20_Rx_DMA_Ch, DISABLE);
    DMA_Cmd(USART_DS18B20_Tx_DMA_Ch, DISABLE);

    DMA_ClearITPendingBit(DMA1_IT_GL2);
    DMA_ClearITPendingBit(DMA1_IT_GL3);
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 14:28
Рейтинг@Mail.ru


Страница сгенерированна за 0.01378 секунд с 7
ELECTRONIX ©2004-2016