OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 15643|回复: 4

DMA+USART发送错误

[复制链接]

4

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2011-3-17
在线时间
1 小时
发表于 2011-3-24 09:25:05 | 显示全部楼层 |阅读模式

望大家帮我看看:DMA+USART1时,接收没问题,为什么发送老是掉倒数第二字节,倒数第一字节总是传在第一个字节上来了?具体配置如下:
USART配置
  USART_InitTypeDef USART_InitStructure;
  USART_InitStructure.USART_BaudRate = 128000;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

  USART_InitStructure.USART_Clock = USART_Clock_Disable;
  USART_InitStructure.USART_CPOL = USART_CPOL_Low;
  USART_InitStructure.USART_CPHA = USART_CPHA_1Edge;
  USART_InitStructure.USART_LastBit = USART_LastBit_Disable;

  USART_Init(USART1, &USART_InitStructure);                                        
//  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
//  USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
  USART_Cmd(USART1, DISABLE);
DMA配置
 DMA_InitTypeDef DMA_InitStructure;
 DMA_DeInit(DMA1_Channel4);
 DMA_InitStructure.DMA_PeripheralBaseAddr = (UINT32)&(USART1->DR);
 DMA_InitStructure.DMA_MemoryBaseAddr = (UINT32)SoundDataBuffer;
 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;
 DMA_InitStructure.DMA_BufferSize = 512;
 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
 DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;  
 DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
 DMA_Init(DMA1_Channel4, &DMA_InitStructure);
 DMA_ITConfig(DMA1_Channel4, DMA_IT_TC, ENABLE);     
 USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);

 DMA_DeInit(DMA1_Channel5);
 DMA_InitStructure.DMA_PeripheralBaseAddr = (UINT32)&(USART1->DR);
 DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SoundDataBuffer;
 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
 DMA_InitStructure.DMA_BufferSize = 512;
 DMA_Init(DMA1_Channel5, &DMA_InitStructure); 
 DMA_ITConfig(DMA1_Channel5, DMA_IT_TC, ENABLE);     
 USART_DMACmd(USART1, USART_DMAReq_Rx, ENABLE);
在主程序中启动第一次,然后在结束中断中将发送与接收交替开启:
void DMA1_Channel4_IRQHandler(void)
{
 DMA1->IFCR = DMA1_FLAG_TC4; 
 DMA1_Channel4->CCR &= ((u32)0xFFFFFFFE);
 *((PUINT32)0x40020064) = (UINT32)SoundDataBuffer;
 DMA1_Channel5->CNDTR = 512;  
   DMA1_Channel5->CCR |= ((u32)0x00000001);
 *((PUINT32)0x4001380c) = (UINT32)0x00002004;
}

/*******************************************************************************
* Function Name : DMA1_Channel5_IRQHandler
* Description   : This function handles DMA Stream 5 interrupt request.
* Input         : None
* Return        : None
* Created By: 何宣见(hexuanjian2005@126.com)  
* Created date: 2011.02.11
*-------------------------------------------------------------------------------
*******************************************************************************/
void DMA1_Channel5_IRQHandler(void)      
{
 DMA1->IFCR = DMA1_FLAG_TC5; 
 DMA1_Channel5->CCR &= ((u32)0xFFFFFFFE);

 *((PUINT32)0x40020064) = (UINT32)SoundDataBuffer;
 DMA1_Channel4->CNDTR = 512;  
 DMA1_Channel4->CCR |= ((u32)0x00000001);
 *((PUINT32)0x4001380c) = (UINT32)0x00002008;
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164897
金钱
164897
注册时间
2010-12-1
在线时间
2100 小时
发表于 2011-3-24 09:30:42 | 显示全部楼层
回复【楼主位】hexuanjian:
-------------------------------
可以参考下我的DMA实验,也是DMA串口,没有你说的问题.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

4

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2011-3-17
在线时间
1 小时
 楼主| 发表于 2011-3-24 09:40:57 | 显示全部楼层
回复【2楼】正点原子:
-------------------------------
他只是接收,没发送啊,我接受完全没问题,就发送有问题
回复 支持 反对

使用道具 举报

4

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
59
金钱
59
注册时间
2011-3-17
在线时间
1 小时
 楼主| 发表于 2011-3-24 10:54:42 | 显示全部楼层

问题已发现,先开串口,再开DMA就对了

回复 支持 反对

使用道具 举报

558

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
164897
金钱
164897
注册时间
2010-12-1
在线时间
2100 小时
发表于 2011-3-24 11:23:53 | 显示全部楼层
 
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-5-29 10:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表