Сама передача происходит, поллинг окончания цикла DMA работает, другие прерывания(в частности Compare/Capture TIM3) функционируют
инициализация NVIC:
/* Enable DMA1 channel5 IRQ Channel */
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel5_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
инициализация DMA:
DMA_DeInit(DMA1_Channel5);
DMA_InitStructure5.DMA_PeripheralBaseAddr = (uint32_t)_SPI2_DR;
DMA_InitStructure5.DMA_MemoryBaseAddr = (uint32_t)SPI2_TxBuf;
DMA_InitStructure5.DMA_DIR = DMA_DIR_PeripheralDST;
DMA_InitStructure5.DMA_BufferSize = TX_BUF_SIZE;
DMA_InitStructure5.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure5.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure5.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure5.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure5.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure5.DMA_Priority = DMA_Priority_High;
DMA_InitStructure5.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel5, &DMA_InitStructure5);
DMA_ITConfig(DMA1_Channel5, DMA_IT_TC, ENABLE);
DMA_ClearITPendingBit(DMA1_IT_GL5);
процедура обработки:
#define PORT_ABIT(GPIO_BASE, BIT) *((volatile unsigned long *)(PERIPH_BB_BASE + 0x20*((GPIO_BASE + 0x0C - PERIPH_BASE))+(4*BIT)))
#define SPI_NSS PORT_ABIT(GPIOB_BASE, 12)
void DMAChannel5_IRQHandler(void)
{
/* Test on DMA1 Channel5 Transfer Complete interrupt */
if(DMA_GetITStatus(DMA1_IT_TC5))
{
SPI2_NSS = 1;
/* Clear DMA1 Channel5 Half Transfer, Transfer Complete and Global interrupt pending bits */
DMA_ClearITPendingBit(DMA1_IT_GL5);
}
}