Jump to content

    

ur5cuj

Участник
  • Content Count

    121
  • Joined

  • Last visited

Community Reputation

0 Обычный

About ur5cuj

  • Rank
    Частый гость
  • Birthday 12/26/1970

Информация

  • Город
    Украина
  1. stm32f411 spi1+DMA

    Цитата(jcxz @ Sep 7 2017, 22:36) Если вопрос именно о непрерывной передаче, то когда "мнфа из одного из массивов уже ушла полностью", готовить 2-ой уже поздно. как тогда организовать процесс? если есть мысли, буду благодарен!!!
  2. stm32f411 spi1+DMA

    Вроде зашевелилось!!! Появилась выдача в SPI, но тут подкралось НО! как теперь определять, что мнфа из одного из массивов уже ушла полностью и пора готовить второй массив с данными?
  3. stm32f411 spi1+DMA

    Цитата(Aleksandr Baranov @ Sep 5 2017, 19:39) Buffer1TX_SPI1[0] - это не указатель. Его нельзя передавать. Можно так, например: &Buffer1TX_SPI1[0] или так Buffer1TX_SPI1 Вопрос о правильной передаче параметра - решен!
  4. stm32f411 spi1+DMA

    Сергей Борщ - спасибо, внял вашему совету!!! (uintptr_t)Buffer1TX_SPI1 - полечило варнинг
  5. stm32f411 spi1+DMA

    даже если прописать: КодDMA_DoubleBufferModeConfig(DMA2_Stream5, Buffer1TX_SPI1, DMA_Memory_0); что собственно не является ошибкой, получается такой же варнинг: Код warning: passing argument 2 of 'DMA_DoubleBufferModeConfig' makes integer from pointer without a cast [-Wint-conversion] так что только так передавать: КодBuffer1TX_SPI1[0]
  6. stm32f411 spi1+DMA

    Цитата(Hold @ Sep 5 2017, 15:18) Как минимум, в функцию DMA_DoubleBufferModeConfig(DMA2_Stream5, Buffer1TX_SPI1[0], DMA_Memory_0); необходимо давать адрес буфера, а него его первое значение. Функция то всё съест, на входе просто uint32_t. Улетает небось в hardFault, т.е. лезете в непонятную область данных. если прописать: КодDMA_DoubleBufferModeConfig(DMA2_Stream5, &Buffer1TX_SPI1, DMA_Memory_0); вываливает варнинг: Кодwarning: passing argument 2 of 'DMA_DoubleBufferModeConfig' makes integer from pointer without a cast [-Wint-conversion]
  7. stm32f411 spi1+DMA

    Инит ДМА вот такой: Кодvoid DMA_Config ( uint8_t * Memory0BaseAddr, uint16_t size ) {     DMA_InitTypeDef        DMA_InitStructure;     NVIC_InitTypeDef    NVIC_InitStructure;     // Сброс настроек DMA каналов     DMA_DeInit ( SPI_DMA_MASTER_Tx_DMA_Stream );     RCC_AHB1PeriphClockCmd ( SPI_DMA_MASTER_DMA_CLK, ENABLE );     DMA_DeInit(SPIx_TX_DMA_STREAM);     /* Configure DMA Initialization Structure */       DMA_InitStructure.DMA_BufferSize = size;       DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;       DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull;       DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;       DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;       DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;       DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;       DMA_InitStructure.DMA_PeripheralBaseAddr =(uint32_t) (&(SPIx->DR));       DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;       DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;       DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;       DMA_InitStructure.DMA_Priority = DMA_Priority_High;       /* Configure TX DMA */       DMA_InitStructure.DMA_Channel = SPIx_TX_DMA_CHANNEL;       DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;       DMA_InitStructure.DMA_Memory0BaseAddr =(uint32_t)Memory0BaseAddr;       DMA_Init(SPIx_TX_DMA_STREAM, &DMA_InitStructure);     // Configure the DMA interrupt priority     NVIC_InitStructure.NVIC_IRQChannel = DMAx_Streamx_IRQn;     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = (uint8_t)(configKERNEL_INTERRUPT_PRIORITY >> 4);     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;     NVIC_Init ( &NVIC_InitStructure );     SPI_I2S_ITConfig ( SPIx, SPI_I2S_IT_TXE, ENABLE );     DMA_DoubleBufferModeConfig(DMA2_Stream5, Buffer1TX_SPI1[0], DMA_Memory_0); //первый массив для выдачи     DMA_DoubleBufferModeConfig(DMA2_Stream5, Buffer2TX_SPI1[0], DMA_Memory_1); //второй массив для выдачи     DMA_DoubleBufferModeCmd ( DMA2_Stream5, ENABLE );     SPI_I2S_DMACmd ( SPI_DMA_MASTER, SPI_I2S_DMAReq_Tx, ENABLE );     DMA_ITConfig ( SPI_DMA_MASTER_Tx_DMA_Stream, DMA_IT_TC, ENABLE ); } обработчик прерывания: Кодvoid DMA2_Stream5_IRQHandler ( void ) {     portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;   // Stream3 transfer complete interrupt?   if(DMA_GetITStatus (SPIx_TX_DMA_STREAM,SPI_DMA_MASTER_Tx_DMA_IT))   {     // clear pending interrupt     DMA_ClearITPendingBit (SPIx_TX_DMA_STREAM,SPI_DMA_MASTER_Tx_DMA_IT);     if(DMA_GetCurrentMemoryTarget (SPIx_TX_DMA_STREAM))     {       // Memory 1 is current target       DMA_MemoryTargetConfig (SPIx_TX_DMA_STREAM,Buffer2TX_SPI1[0],DMA_Memory_0);     }     else     {       // Memory 0 is current target       DMA_MemoryTargetConfig(SPIx_TX_DMA_STREAM,Buffer1TX_SPI1[0],DMA_Memory_1);      }   }   xSemaphoreGiveFromISR ( xSemaphore_spi1, &xHigherPriorityTaskWoken );       xTaskResumeFromISR (&xHandleSPI1);       portEND_SWITCHING_ISR ( xHigherPriorityTaskWoken ); } ну а запускается всё вот так: Код        ukladkabufTXSPI1 ( Buffer1TX_SPI1 );//заполнение первого массива инфой         ukladkabufTXSPI1 ( Buffer2TX_SPI1 );//заполнение второго массива инфой         DMA_Cmd ( SPI_DMA_MASTER_Tx_DMA_Stream, ENABLE ); и всё это Не работает, ЧЯДНТ?
  8. stm32f411 spi1+DMA

    Цитата(adnega @ Sep 5 2017, 11:41) Вам нужно DMA_Mode_Circular. DMA_Mode_Circular у меня работает, но это чисто для отладки Вч части, так как постоянно выдаётся таблица из флеши, а мне нужно готовить данные т.е. модулировать исходные данные процессором для подачи в ВЧ модулятор, где уже будет этот поток модулироваться несущей для излучения в антенну.
  9. stm32f411 spi1+DMA

    Цитата(adnega @ Sep 5 2017, 10:56) Значит поток у вас непрерывный. Тут все просто - делаете кольцевой буфер на DMA и забываете вообще про SPI. Готовите в прерываниях DMA HT и TC новую половину данных. SPI лучше сделать 16 бит, если выдаете с частотой не сильно меньше AHB. Я делал на стареньком STM32F103 вывод на VGA-монитор - очень похожая задачка. у меня данные байтовые, т.е. и выдача в SPI байтовая и строго выдержанная тактовая в 1 МГц, но это уже в настройках самого SPI реализовано. в F411 есть интереный момент Double Buffer mode DMA, вот только примеров как это заюзать нет, а у меня не хочет работать
  10. stm32f411 spi1+DMA

    Ребят, канешна спасибо за инфу, очень пригодится в будущем, но тема про SPI+DMA, точнее double buffer DMA+SPI, задача- необходимо реализовать непрерывный вывод в TX SPI потока данных, которые потом поступают на ВЧ модулятор и ессно потом на антенну, т.е. своеобразный передатчик, а непрерывная выдача необходима для того, что бы небыло так называемой "разрыва фазы", что бы приемник мог принять и демодулировать инфу. Вот помогли бы мне с этим, буду премного благодарен!
  11. stm32f411 spi1+DMA

    Цитата(Сергей Борщ @ Sep 4 2017, 15:02) Несомненным достижением инженеров ST можно назвать отсутствие прерывания на этот флаг. А разве прерывание: КодSPI_I2S_IT_TXE: Tx buffer empty interrupt mask это не оно? т.е. по опустошению передающего буфера генерится прерывание и сраюатывает этотфлаг
  12. stm32f411 spi1+DMA

    [quote] Т.к. Stream автоматически выключается после окончания передачи, что явно указано в ДШ: [attachment=108643:STM32F40...9_439_RM.jpg] Из-за этого незаходит в иф? Кодif ( DMA_GetITStatus ( SPI_DMA_MASTER_Tx_DMA_Stream, DMA_IT_TCIF5 ) == SET )
  13. stm32f411 spi1+DMA

    Цитата(adnega @ Sep 4 2017, 11:29) О, я рекомендую почитать. Очень хорошие статьи у Курница. На странице 40 раздел "Вложенность прерываний" и далее. Еще обсуждали тут. Есть на английском тут. По Вашим ссылкам на обсуждение: - из Вашего кода: КодNVIC_InitStructure.NVIC_IRQChannelPreemptionPriority  = (uint8_t)(configKERNEL_INTERRUPT_PRIORITY >> 4); это обкатано?
  14. stm32f411 spi1+DMA

    Цитата(adnega @ Sep 4 2017, 09:58) Вы используете функции ОС в прерывании, у которого приоритет выше системного. какой уровень посоветуете установить? Имею ввиду конкретную цифру.
  15. stm32f411 spi1+DMA

    Цитата(adnega @ Sep 4 2017, 09:12) А как же это в конце обработчика? Код   xSemaphoreGiveFromISR ( xSemaphore_spi1, &xHigherPriorityTaskWoken );     xTaskResumeFromISR (&xHandleSPI1);     uart2_putcharPoll ( 'E' );//, xNoBlock );     portEND_SWITCHING_ISR ( xHigherPriorityTaskWoken ); ничего криминального не вижу, увы если что то есть, подскажите плиз.