|
stm32f411 spi1+DMA, непрерывная выдача данных |
|
|
|
Aug 31 2017, 12:24
|
Частый гость
 
Группа: Участник
Сообщений: 121
Регистрация: 27-04-09
Из: Украина
Пользователь №: 48 342

|
Привожу код что и как делаю, вопрос в том, что в прерывание ДМА входит, а вот уже в обработчике прерывания в if не входити ессно нет переключения между массивами, что не так?Надеюсь на конструктивный диалог, заранее спасибо. Код void DMA2_Stream5_IRQHandler ( void ) { uart2_putcharPoll ( 'I' );//, xNoBlock );
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
if ( DMA_GetITStatus ( SPI_DMA_MASTER_Tx_DMA_Stream, DMA_IT_TCIF5 ) == SET ) { uart2_putcharPoll ( 'F' );//, xNoBlock );
// Clear DMA Stream Transfer Complete interrupt pending bit
if ( CurrentBufSPI1 == buf1 ) { CurrentBufSPI1 = buf2; uart2_putcharPoll ( '2' );//, xNoBlock ); }
if ( CurrentBufSPI1 == buf2 ) { CurrentBufSPI1 = buf1; uart2_putcharPoll ( '1' );//, xNoBlock ); } DMA_Cmd ( SPI_DMA_MASTER_Tx_DMA_Stream, DISABLE ); DMA_ClearITPendingBit ( SPI_DMA_MASTER_Tx_DMA_Stream, DMA_IT_TCIF5 ); } xSemaphoreGiveFromISR ( xSemaphore_spi1, &xHigherPriorityTaskWoken ); xTaskResumeFromISR (&xHandleSPI1); uart2_putcharPoll ( 'E' );//, xNoBlock ); portEND_SWITCHING_ISR ( xHigherPriorityTaskWoken ); } Код void Task_SPI1 ( void *pvParameters ) { xSemaphoreTake ( xSemaphore_spi1, portMAX_DELAY );
for (;; ) { if ( CurrentBufSPI1 == buf1 ) { ukladkabufTXSPI1 ( Buffer1TX_SPI1 );
DMA_Config ( Buffer1TX_SPI1, indexTX*8 ); } if ( CurrentBufSPI1 == buf2 ) { ukladkabufTXSPI1 ( Buffer2TX_SPI1 );
DMA_Config ( Buffer2TX_SPI1, indexTX*8 ); } vTaskSuspend ( &xHandleSPI1 );
} } Код [/code]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_Normal; 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 = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init ( &NVIC_InitStructure );
SPI_I2S_ITConfig ( SPIx, SPI_I2S_IT_TXE, ENABLE );
DMA_ClearITPendingBit ( SPI_DMA_MASTER_Tx_DMA_Stream, SPI_DMA_MASTER_Tx_DMA_IT ); DMA_ClearFlag ( SPI_DMA_MASTER_Tx_DMA_Stream, SPI_DMA_MASTER_Tx_DMA_FLAG );
SPI_I2S_DMACmd ( SPI_DMA_MASTER, SPI_I2S_DMAReq_Tx, ENABLE ); DMA_ITConfig ( SPI_DMA_MASTER_Tx_DMA_Stream, DMA_IT_TC, ENABLE ); DMA_Cmd ( SPI_DMA_MASTER_Tx_DMA_Stream, ENABLE ); } знаю есть режим дабл-буфер в f411, но как его заюзать на SPL? дефайны: Код #define SPI_DMA_MASTER SPI1 #define SPI_DMA_MASTER_DMA DMA2 #define SPI_DMA_MASTER_DMA_CLK RCC_AHB1Periph_DMA2 #define SPI_DMA_MASTER_Tx_DMA_Stream DMA2_Stream5 #define SPI_DMA_MASTER_Tx_DMA_Channel DMA_Channel_3 #define SPI_DMA_MASTER_Tx_DMA_FLAG DMA_FLAG_TCIF5 #define SPI_DMA_MASTER_Tx_DMA_IT DMA_IT_TCIF5 #define DMAx_Streamx_IRQn DMA2_Stream5_IRQn
#define SPIx_DMA DMA2 #define SPIx_DMA_CLK RCC_AHB1Periph_DMA2 #define SPIx_TX_DMA_CHANNEL DMA_Channel_3 #define SPIx_TX_DMA_STREAM DMA2_Stream5 #define SPIx_TX_DMA_FLAG_TCIF DMA_FLAG_TCIF5
Сообщение отредактировал Volldemar - Aug 31 2017, 12:53
|
|
|
|
Сообщений в этой теме
Volldemar stm32f411 spi1+DMA Aug 31 2017, 12:24 AHTOXA После
if ( CurrentBufSPI1 == buf1 )
нужен else. Ин... Aug 31 2017, 17:59 Volldemar Цитата(AHTOXA @ Aug 31 2017, 20:59) После... Sep 1 2017, 06:06  AHTOXA Код#define SPI_DMA_MASTER_Tx_DMA_Channel DMA_Chann... Sep 1 2017, 15:07   Сергей Борщ QUOTE (AHTOXA @ Sep 1 2017, 18:07) Вы зап... Sep 1 2017, 15:43    AHTOXA А, точно, забыл уже, что там ещё один уровень доба... Sep 1 2017, 19:47 adnega Цитата(Volldemar @ Aug 31 2017, 15:24) На... Sep 1 2017, 19:56 Volldemar Цитата(adnega @ Sep 1 2017, 22:56) Похоже... Sep 4 2017, 05:58  adnega Цитата(Volldemar @ Sep 4 2017, 08:58) я о... Sep 4 2017, 06:12   Volldemar Цитата(adnega @ Sep 4 2017, 09:12) А как ... Sep 4 2017, 06:15    adnega Цитата(Volldemar @ Sep 4 2017, 09:15) нич... Sep 4 2017, 06:58     Volldemar Цитата(adnega @ Sep 4 2017, 09:58) Вы исп... Sep 4 2017, 07:19      adnega Цитата(Volldemar @ Sep 4 2017, 10:19) как... Sep 4 2017, 08:29       Volldemar Цитата(adnega @ Sep 4 2017, 11:29) О, я р... Sep 4 2017, 09:17 Hold У себя делал так, на STM32F4x9:
CODE
#include ... Sep 4 2017, 10:32 Volldemar [quote]
Т.к. Stream автоматически выключается посл... Sep 4 2017, 12:01 Сергей Борщ QUOTE (Hold @ Sep 4 2017, 13:32) Для одно... Sep 4 2017, 12:02  Volldemar Цитата(Сергей Борщ @ Sep 4 2017, 15:02) Н... Sep 4 2017, 12:09   jcxz Цитата(Volldemar @ Sep 4 2017, 15:09) это... Sep 4 2017, 16:54  Hold Цитата(Сергей Борщ @ Sep 4 2017, 19:02) Н... Sep 5 2017, 04:09   Сергей Борщ QUOTE (Hold @ Sep 5 2017, 07:09) Была уже... Sep 5 2017, 06:13 Hold SPI, по сравнению с I2C, еще относительно безглючн... Sep 5 2017, 06:29 adnega Цитата(Hold @ Sep 5 2017, 09:29) какой-то... Sep 5 2017, 06:37 jcxz Цитата(Hold @ Sep 5 2017, 09:29) SPI, по ... Sep 5 2017, 06:58  Hold Цитата(jcxz @ Sep 5 2017, 13:58) При отсу... Sep 5 2017, 08:18 Volldemar Ребят, канешна спасибо за инфу, очень пригодится в... Sep 5 2017, 07:23 adnega Цитата(Volldemar @ Sep 5 2017, 10:23) Вот... Sep 5 2017, 07:56  Volldemar Цитата(adnega @ Sep 5 2017, 10:56) Значит... Sep 5 2017, 08:12   adnega Цитата(Volldemar @ Sep 5 2017, 11:12) в F... Sep 5 2017, 08:41    Volldemar Цитата(adnega @ Sep 5 2017, 11:41) Вам ну... Sep 5 2017, 08:48     adnega Цитата(Volldemar @ Sep 5 2017, 11:48) DMA... Sep 5 2017, 09:44 Сергей Борщ QUOTE (Volldemar @ Sep 5 2017, 10:23) т.е... Sep 5 2017, 08:41  jcxz Цитата(Сергей Борщ @ Sep 5 2017, 11:41) К... Sep 5 2017, 12:58 Volldemar Инит ДМА вот такой:
Кодvoid DMA_Config ( uint8... Sep 5 2017, 11:22 Hold Как минимум, в функцию DMA_DoubleBufferModeConfig(... Sep 5 2017, 12:18 Volldemar Цитата(Hold @ Sep 5 2017, 15:18) Как мини... Sep 5 2017, 12:20  Сергей Борщ QUOTE (Volldemar @ Sep 5 2017, 15:20) выв... Sep 5 2017, 12:26 Volldemar даже если прописать:
КодDMA_DoubleBufferModeConfig... Sep 5 2017, 12:35 Сергей Борщ QUOTE (Volldemar @ Sep 5 2017, 15:35) даж... Sep 5 2017, 13:04 Aleksandr Baranov Цитата(Volldemar @ Sep 5 2017, 08:35) так... Sep 5 2017, 16:39  Volldemar Цитата(Aleksandr Baranov @ Sep 5 2017, 19... Sep 6 2017, 08:02 Volldemar Сергей Борщ - спасибо, внял вашему совету!... Sep 5 2017, 13:10 Volldemar Вроде зашевелилось!!!
Появилась выдача... Sep 6 2017, 11:43 Aleksandr Baranov Цитата(Volldemar @ Sep 6 2017, 07:43) Поя... Sep 6 2017, 12:14 jcxz Цитата(Volldemar @ Sep 6 2017, 14:43) Поя... Sep 7 2017, 19:36  Volldemar Цитата(jcxz @ Sep 7 2017, 22:36) Если воп... Sep 8 2017, 13:29   jcxz Цитата(Volldemar @ Sep 8 2017, 20:29) как... Sep 8 2017, 15:27
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|