请问下各位: DMA的中断完成标志位问题??
总体描述: DMA存储来自SPI的500个数据,我检测中断传输完成标志位,然后再到中断服务函数中,打印出这500个数据;
问题是:是DMA将500个完全缓存到内存中后,然后中断完成标志位置1,再进入中断服务函数,打印出500个数据?还是DMA接收1个数据后,就进入中断函数打印这个数据,然后循环进行直到取满500个数据呢?
程序例子如下:
while (1)
{
GPIO_ResetBits(AD_CS_GPIO_PORT,AD_CS_PIN); //CS置0
Delay(5);
SPI_Cmd(AD_SPI, ENABLE); //SPI开启
data=SPIx_ReadWriteByte(); //产生16个周期的读取数据
SPI_Cmd(AD_SPI, DISABLE); //SPI关闭
Delay(140);
GPIO_SetBits(AD_CS_GPIO_PORT,AD_CS_PIN); //CS置1
Delay(5);
}
///////////////////////////中断服务函数//////////////////////////////////
void DMA1_Stream0_IRQHandler(void)
{
for (j=500;j>1;j--)
{
printf("%d
",ADC_ConvertedValue[j]);
}
DMA_ClearITPendingBit(DMA1_Stream0,DMA_IT_TCIF0); //清除完成中断标志位
}
程序调试过程中,使能SPI后,再执行 data=SPIx_ReadWriteByte(); 不管你缓存的数据再多,都马上进入DMA传输完成中断服务函数。所以我疑惑,到底是采集完整个数据后进入中断服务函数,还是采集一个数据就进入中断函数。所以
仿真不出来效果。
元老同学的编程习惯很好呀....
PS:楼主,为什么不用cubeMx呢?为什么不用cubeMx呢?为什么不用cubeMx呢?
我已经下好了,cubeMx了,只不过还没有去学习呢;难道使用不同的编程方式,这个会不会有所改善呢;
确实呢,不管如何,也要去试试
首先谢谢您的指点啊疑问代码:
while (1)
{
GPIO_ResetBits(AD_CS_GPIO_PORT,AD_CS_PIN); //CS置0
Delay(5);
SPI_Cmd(AD_SPI, ENABLE); //SPI开启
data=SPIx_ReadWriteByte(); //产生16个周期的读取数据
SPI_Cmd(AD_SPI, DISABLE); //SPI关闭
Delay(140); //延时时间稍长,为的是让CS=1前,关闭SPI,否则CS=1与sck有重合
GPIO_SetBits(AD_CS_GPIO_PORT,AD_CS_PIN); //CS置1
i--;
Delay(5);
}
先前也稍稍尝试过,不用data=SPIx_ReadWriteByte(); 但是狗血的是我这款AD7357它需要满足:cs=0,16个周期SCLK,cs=1这个循环的过程,才能有输出数据,不能够将CS拉低后AD一直出数据;所以采用这样的方式,
请问下@黑皮男 ,有没有更好的解决方法呢,谢谢你啦
本帖最后由 黑皮男 于 2018-3-9 11:26 编辑
这个需要用到定时器了,使用pwm来驱动cs,pwm溢出事件触发dma的数据传输,这个我没试过,理论上是可行的
一周热门 更多>