SPI使用DMA1发送无法进入进入DMA中断

2019-08-14 04:50发布

本帖最后由 不死鸟 于 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]






友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
16条回答
不死鸟
2019-08-14 22:18
本帖最后由 不死鸟 于 2016-12-30 10:16 编辑

另外还发现一个问题,我的DMA数据位宽设置为   DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;        //     DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //,
但在代码执行时,发现地址自增是以4Bytes为单位自增的,而不是以1Byte自增的,请问问题在哪里,如何让地址按照1Byte自增呢?

一周热门 更多>