打印

请教DMA接收串口数据的重新启动问题

[复制链接]
2814|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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);
}
}
沙发
xsq5360|  楼主 | 2010-6-5 14:42 | 只看该作者
本帖最后由 xsq5360 于 2010-6-5 14:44 编辑

已解决
问题出在DMA_Init函数上,在该函数中首先对CCR的相关寄存器进行了复位操作造成DMA配置错误。
因此在使用DMA_Init函数时需注意设置好所有的DMA寄存器参数

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

57

帖子

1

粉丝