OpenEdv-开源电子网

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

DMA传输的问题

[复制链接]

38

主题

109

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2014-8-1
在线时间
6 小时
发表于 2014-11-10 21:03:09 | 显示全部楼层 |阅读模式
5金钱
              本想今晚把我项目的DMA想法分享给群里,结果出现一些问题。
            1. 串口初始化
            2. DMA初始化
              void MYDMA_Config()
               { 
                    DMA_InitTypeDef  DMA_InitStructure;
                    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);
                    DMA_DeInit(DMA2_Stream7);
                    while (DMA_GetCmdStatus(DMA2_Stream7) != DISABLE){}
                    DMA_InitStructure.DMA_Channel = DMA_Channel_4; 
                    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)USART1_DR_ADDRESS;
                    DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)Buffer;
                    DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
                    DMA_InitStructure.DMA_BufferSize = 5;
                    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_Medium;
                    DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
                    DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
                    DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
                    DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
                    DMA_Init(DMA2_Stream7, &DMA_InitStructure);
                    DMA_Cmd(DMA2_Stream7, ENABLE);                  
               } 
          3.主函数
              int main(void)
             {
                     int i;
                     rintf_Init();
                    for(i=0;i<5;i++)            (1)
                    {
                         Buffer=i+1;
                    }
                    MYDMA_Config();         (2)
                   USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);    (3)
                   return(0);
              }
          串口打印的数据是 : 



主函数
                    MYDMA_Config();         (2)


                    for(i=0;i<5;i++)           (1)
                    {
                         Buffer=i+1;
                    }
                   这样的结果就丢失了第一个字节,

                   搞了一晚上貌似没有网友碰到这样的问题?

我还有一个想法就是   Buffer[] 数组DMA传输的,     每次可以传输数量可以改变]   ,也就是
            DMA_SetCurrDataCounter(DMA_Streamx,ndtr);          //来改变传输量  原子哥例程里的

两个发送函数
void VIEWTECH_79 (u8 On_Time)
{
int i;
i=0;
Buffer[i++]=0xAA;
Buffer[i++]=0x79;
Buffer[i++]=On_Time;
Buffer[i++]=0xCC;
Buffer[i++]=0x33;
Buffer[i++]=0xC3;
Buffer[i++]=0x3C;
MYDMA_Enable(DMA2_Stream7, 7);
}
void VIEWTECH_52(void)
{
u8 i=0;
Buffer[i++]=0xAA;
Buffer[i++]=0x52;
Buffer[i++]=0xCC;
Buffer[i++]=0x33;
Buffer[i++]=0xC3;
Buffer[i++]=0x3C;
MYDMA_Enable(DMA2_Stream7, 6);
}

int main(void)
{
int i;
Printf_Init();
MYDMA_Config();
USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);  //?????®??1??DMA·???  
 
 VIEWTECH_79(100);  (1)
VIEWTECH_52();           (2)

return(0);
}

这样运行的结果:


期待结果是:  AA 79 64 CC 33 C3 3C  AA 52 CC 33 C3 3C 

要是把(2)注释掉,运行结果是正确的:


我的想法是我要把我最新的buffer[]数据发出去,大神们帮忙看看,谢谢,估计以后有人也会遇到这样的问题!

最佳答案

查看完整内容[请看2#楼]

回复【2楼】正点原子: --------------------------------- 解决方案是:                               DMA_Cmd(DMA2_Stream7, ENABLE);    这条语句不能放在DMA初始化函数里,只要放在你构建好的数组后面就不会 int i; Printf_Init() ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

38

主题

109

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2014-8-1
在线时间
6 小时
 楼主| 发表于 2014-11-10 21:03:10 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
解决方案是:
                              DMA_Cmd(DMA2_Stream7, ENABLE);    这条语句不能放在DMA初始化函数里,只要放在你构建好的数组后面就不会
int i;
Printf_Init();

MYDMA_Config();
for(i=0;i<5;i++)      
{
 Buffer=i+1;
}

USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);  

DMA_Cmd(DMA2_Stream7, ENABLE);    //放在数组前就会丢失首字节
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-11-11 00:11:48 | 显示全部楼层
第一个数据丢失的问题,你在串口初始化完成后,发送一个无意义的数据,再去设置dma,试试。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

38

主题

109

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2014-8-1
在线时间
6 小时
 楼主| 发表于 2014-11-11 14:13:49 | 显示全部楼层
回复【3楼】静:
---------------------------------
想买个jtag,要好的,质量能保证的,现在这个项目调试时总是找不到,原子哥有推荐么
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-11-11 15:44:55 | 显示全部楼层
回复【4楼】静:
---------------------------------
我们店铺就有。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-23 04:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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