本帖最后由 不死鸟 于 2016-12-30 10:23 编辑
使用STM32F103VET,在调试SPI,使用DMA1Channel3进行发送,启用了DMA结束中断和DMA错误中断,但是发现无法进入中断,但是数据发送正常而且正确的,哪位大侠可以帮忙看看么,多谢了![mw_shl_code=c,true]DMA中断配置
NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 4;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
DMA配置
DMA_Cmd(SPI_DMA_TX_CH, DISABLE);//关闭DMA通道
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&SPI1->DR; //DMA 的目的地址为SPI的DR
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; //传输方向是向外设写 外设为目的地
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //外设的地址不自增
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //内存地址自增
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; //不循环
DMA_InitStructure.DMA_Priority = DMA_Priority_High; //通道优先级高
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //非存储器至存储器模式
DMA_Init(SPI_DMA_TX_CH, &DMA_InitStructure); //配置DMA1CH3
DMA_ITConfig(SPI_DMA_TX_CH,DMA1_IT_TC3 | DMA1_IT_TE3,ENABLE); //开启完成中断和传输错误中断呢
SPI_I2S_DMACmd(SPI1,SPI_I2S_DMAReq_Tx,ENABLE); //使能SPI的 DMA
DMA发送函数
int drv_SPI_DMA_Send_Data(u8 *BufferSRC, uint32_t BufferSize)
{
//SPI_DMA_Send_TX_Cfg(BufferSRC, BufferSize);
DMA_Cmd(SPI_DMA_TX_CH, DISABLE);
DMA_ITConfig(SPI_DMA_TX_CH,DMA1_IT_TC3 | DMA1_IT_TE3,ENABLE); //开启完成中断和传输错误中断呢
DMA1_Channel3->CNDTR=BufferSize; //设置要传输的数据长度
DMA1_Channel3->CMAR=(uint32_t)BufferSRC; //设置RAM缓冲区地址
DMA_Cmd(SPI_DMA_TX_CH, ENABLE);
//while(!DMA_GetFlagStatus(DMA1_FLAG_TC3)); //等待DMA通道5传输完成
//DMA_ClearFlag(DMA1_FLAG_TC3); //清除通道5传输完成状态标记
//DMA_Cmd(DMA1_Channel3,DISABLE); //
}
DMA中断处理函数
void DMA1_Channel3_IRQHandler(void)
{
if(DMA_GetITStatus(DMA1_IT_TE3))
{
iiii++;
DMA_ClearITPendingBit(DMA1_IT_TE3);
DMA_ClearFlag(DMA1_FLAG_TE3); //清除通道5传输完成状态标记
DMA_Cmd(DMA1_Channel3,DISABLE); //
}
if(DMA_GetITStatus(DMA1_IT_TC3))
{
jjjj++;
DMA_ClearITPendingBit(DMA1_IT_TC3);
DMA_ClearFlag(DMA1_FLAG_TC3); //清除通道5传输完成状态标记
DMA_Cmd(DMA1_Channel3,DISABLE); //
}
}
[/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
我说的代码指的是看看你调用SPI发送数据部分,因为你发送的数据有可能没有达到DMB的发送完成量,所以不会产生发送完成中断请求。
数据量发送完 也不应该是进入DMA的中断吧??难道不是应该是由SPI管吗?
SPI的DMA通信 是把SPI的数据通过DMA进行搬运,还是通过SPI把DMA搬运的数据发送出去呢??
一周热门 更多>