STM32 LL SPI DMA收发完成中断未触发,求解决方法
STM32 LL驱动SPI DMA收发正常但传输完成中断无法触发
基于STM32低级别(LL)驱动实现了SPI DMA收发功能,目前收发正常,但DMA通道2的传输完成(TC)中断始终无法触发。
SPI初始化代码
// Note: called only once because the address of the peripheral does never change // Configure RX // LL_DMA_ConfigAddresses(DMA, DMA Channel, Source Addr, Dest Addr, Direction) LL_DMA_ConfigAddresses( DMA1, LL_DMA_CHANNEL_2, LL_SPI_DMA_GetRegAddr(SPI1), (uint32_t)RXdata, LL_DMA_GetDataTransferDirection(DMA1, LL_DMA_CHANNEL_2)); // Configure Tx LL_DMA_ConfigAddresses( DMA1, LL_DMA_CHANNEL_3, (uint32_t)TXdata, LL_SPI_DMA_GetRegAddr(SPI1), LL_DMA_GetDataTransferDirection(DMA1, LL_DMA_CHANNEL_3));
重复启动传输的代码
// set RX LL_DMA_SetMemoryAddress(DMA1, LL_DMA_CHANNEL_2, (uint32_t)pRXdata); LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_2, BufSz); LL_SPI_EnableDMAReq_RX(SPI1); LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_2); LL_DMA_EnableIT_TC(DMA1, LL_DMA_CHANNEL_2); LL_DMA_EnableIT_TE(DMA1, LL_DMA_CHANNEL_2); // set TX LL_DMA_SetMemoryAddress(DMA1, LL_DMA_CHANNEL_3, (uint32_t)pTXdata); LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_3, BufSz); LL_SPI_EnableDMAReq_TX(SPI1); LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_3); // Start SPI LL_SPI_Enable(SPI1);
DMA初始化配置(自动生成)
void MX_DMA_Init(void) { /* DMA controller clock enable */ __HAL_RCC_DMA1_CLK_ENABLE(); /* DMA interrupt init */ /* DMA1_Channel2_IRQn interrupt configuration */ NVIC_SetPriority(DMA1_Channel2_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),4, 0)); NVIC_EnableIRQ(DMA1_Channel2_IRQn); /* DMA1_Channel3_IRQn interrupt configuration */ NVIC_SetPriority(DMA1_Channel3_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),5, 0)); NVIC_EnableIRQ(DMA1_Channel3_IRQn); }
补充配置信息
- 已将传输完成(TC)和传输错误(TE)中断绑定到RX的DMA通道2(与HAL做法一致)
- CubeMX中已启用DMA通道2和3的中断,中断向量表中存在对应函数
- 系统全局中断正常:SysTick中断可触发,定时器中断可触发SPI传输
- 在
DMA1_Channel2_IRQHandler中添加了调试计数器,其值始终为0,说明中断从未执行
请问如何让DMA通道2的传输完成中断正常触发?
内容的提问来源于stack exchange,提问作者Chris_B
相关产品推荐
相关产品推荐

