本帖最后由 mrhw 于 2014-12-3 20:09 编辑
GONGO 发表于 2014-12-1 16:56
有这样的现象,应该是因为 SPI 的分频造成的, 和 DMA、中断、TIM3 都没有关系。
所以分频值越小,一致性越 ...
按GONGO大拿的解决方法: 我将代码调整为
void EXTI2_3_IRQHandler(void)
{
EXTI_ClearITPendingBit(EXTI_Line2);
TIM_Cmd(TIM3, ENABLE); //开启TIM3,TIM3优级抢占优先级较高,计算任何还没有完成时就会进入TIM3中断,
DMA_Cmd(DMA1_Channel3, DISABLE);
SPI_DMA_InitStructure.DMA_BufferSize = 18;
SPI_DMA_InitStructure.DMA_MemoryBaseAddr = data[0];
DMA_Init(DMA1_Channel3, &SPI_DMA_InitStructure);
RCC_APB2PeriphResetCmd(RCC_APB2Periph_SPI1,ENABLE);
//SPI_Re_init();
RCC_APB2PeriphClockCmd( RCC_AHBPeriph_GPIOB, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource3, GPIO_AF_0);
GPIO_PinAFConfig(GPIOB, GPIO_PinSource5, GPIO_AF_0);
GPIO_Init(GPIOB, &SPI_GPIO_InitStructure);
SPI_I2S_DeInit(SPI1);
SPI_Init(SPI1, &SPI_InitStructure);
SPI_NSSInternalSoftwareConfig(SPI1, SPI_NSSInternalSoft_Set);
SPI_Cmd(SPI1, ENABLE);
SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Tx, ENABLE);
{
//计算任务
//每次的计算任务都会顺利完成
}
}
经过这样的处理在TIM中使能SPI_DMA_TX ,发出数据的时间对齐性已经较好了,72M下比48M下对齐程序更好。
但48M下有一个缺点:
RCC_APB2PeriphReset 到 SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Tx, ENABLE)即从复位到再次配置好SPI,用的时间太久了(可能不是代码太多,也许是复位配置SPI外设需要时间),当TIM中断已经使能SPI_DMA_TX时,并不能立即发出数据,这时SPI的复位和配置还没有完成呢,待完成时发出完整的数据,发出时间上的对齐性较好,使用这种方式受到的限制是延时比较大。
为解决延时比较大的问题,另一种方式是先发送数据,发送完成时,执行复位和重新配置SPI,以便于下次立即可以发送数据,经过实际测试这种方式不如在数据发送之前复位和重新配置SPI的时间对齐性好。
目前总结出的最佳方式为:工作在72M下,在发送数据前复位和重新配置SPI,在72M下复位和配置SPI的速度大大加快,从复位开始8us的延时就可以发送出数据了(时间对齐性较好).
为工作在72M下,只有将GD32F130替换为GD32F150了,GD32F130超频到72M暂时没发现问题, 不同工作环境怕是不稳定!
|