本帖最后由 xsq5360 于 2010-6-7 10:26 编辑
在《STM32F10x常见应用解析》中提到普通模式下重新启动DMA传输的方法,照此调试了下,利用DMA接收USART3接收到的18个数据,接收完毕后清除DMA接收完毕标志位,并回发数据给PC机,然后重新启动DMA,这时发现有个问题,在串口调试助手第二次发送18个数据后,程序就一直给串口调试助手发送此前收到的数据?仿佛DMA1_FLAG_TC3一直是1?但是如果注释掉重新使能DMA的代码,则运行结果是正常的,DMA传输一次后自动关闭,不再接收串口数据。
不知怎解?
另改为循环模式,并注释掉主程序中的重新使能DMA的代码,则运行正常,串口发送一次,STM32回发一次。
主函数如下:
int main(void)
{
#ifdef DEBUG
debug();
#endif
/* 初始化系统时钟,倍频到72MHz*/
RCC_Configuration();
/* 初始化LED,状态调试用*/
GPIO_Configuration();
/* 初始化中断向量表的初始位置*/
NVIC_Configuration();
/* 初始化时钟节拍,为得到精确的延时时间*/
SysTick_Configuration();
DMA_Configuration();
/* 初始化USART3,通讯调试用*/
USART3_Configuration();
while (1)
{
/* Wait until DMA1_Channel 3 Transfer Complete */
while(DMA_GetFlagStatus(DMA1_FLAG_TC3) == RESET)
{
}
DMA_ClearFlag(DMA1_FLAG_TC3);
for(TxCounter=0;TxCounter<18;TxCounter++ )
{
USART_SendData(USART3, RxBuffer_DMA[TxCounter]);
//测试不加以下代码亦可,但为了安全起见仍要加上
while (USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET)
{
}
}
//1.关闭DMA通道
DMA_Cmd(DMA1_Channel3, DISABLE);
//如果DMA中的外设地址是递增的,重新设置外设地址
//如果DMA中的存储器地址是递增的,重新设置存储器地址
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)RxBuffer_DMA;
//重新设置数据传输数目
DMA_InitStructure.DMA_BufferSize = 18;
DMA_Init(DMA1_Channel3, &DMA_InitStructure);
//重新使能DMA
DMA_Cmd(DMA1_Channel3, ENABLE);
}
} |