本帖最后由 不死鸟 于 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]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
另外还发现一个问题,我的DMA数据位宽设置为 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; // DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; //,
但在代码执行时,发现地址自增是以4Bytes为单位自增的,而不是以1Byte自增的,请问问题在哪里,如何让地址按照1Byte自增呢?
我用的就是这个啊,函数名是从.s文件中拷贝出来的,就怕自己写手滑出错。。
你看看DMA储存/外设地址寄存器就明白了
地址增量的问题是:
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word; //
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;
改为:
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//外设数据长度:8位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//存储器数据长度:8位
因为字节数配置问题,导致你的数据量没有发完,所以不进入完成中断。
一周热门 更多>