OpenEdv-开源电子网

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

新手求问几个关于AD和DMA的问题

[复制链接]

24

主题

66

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
358
金钱
358
注册时间
2015-11-4
在线时间
124 小时
发表于 2016-6-14 18:32:29 | 显示全部楼层 |阅读模式
10金钱
由于自己学得还不够深,应用得不够多,所有有些问题遇到了不知道怎么去理解,先说说我想问的问题吧,麻烦各路好友知道的告知一下,深表感谢:
1:ADC初始化那里有个可以设置为软件触发模式,假如我设置为定时器中断触发。是不是在定时器中断函数里运行一次ADC_GetValue()就可以了;
  例:
                void timeIRQ ()
       {......
                 ADC_GetValue();
        .........}

  我也在论坛说下了某个人的工程,可是看到他工程里面没有定时中断函数这部分,可他也是写着用到了定时中断,AD采样。
  请问:具体的是怎么回事,是两者都对吗还是其中一个才是正确的。

2:我想问问USART_SendData()和DMA发送数据有什么区别,我只知道是在时间上,可能DMA的比串口的快。
   现在自己在弄一个传数据的东西,在定时器中断里每中断一次采样一次AD(采样率为1200),采样够100次就靠串口发送出去,可是现在我发现这样做,串口把数据发送完所需要的时间比采样率的时间长得多,所以那个数据会产生丢失,这个要怎么弄能够把时间的补上使数据不会丢失:
  我现在的实现发现如下
void TIM3_IRQHandler(void){
      int i;//待发送数据个数
     int sum1=50;
     int n1=10;
     if(TIM3->SR&0X0001)//Overflow
      {
          if(num<sum1)
          {

    adcbuff[num]=Get_Adc(ADC_CH1);

                num++;
                num2++;
           }
         //收集满了,开始发送数据
                if(num2==sum1)
                {        
                        USART_SendData(USART1,0x0d);  //发送
                                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
                        USART_SendData(USART1,sum1*2);  //发送
                                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
                        
                  for(i=0;i<sum1;i++)
                        {                                
                         USART_SendData(USART1,(adcbuff)&0xFF);  //发送低8位
                                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
                        USART_SendData(USART1,(adcbuff)>>8);    //发送高8位
                                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);        

                       }
                                       
                        USART_SendData(USART1,0x20);  //发送CRC
                                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
                        USART_SendData(USART1,0x41);  //发送
                                while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);
                        num2=0;
                        num=0;
                                       

                }

}               

        TIM3->SR&=~(1<<0);//Clear the interrupt flag            
}


补充个问题,我的num,num2定义了全局变量,我弄过把num去掉,可是去掉后输出的数据完全错了,是不是我的逻辑存在问题






最佳答案

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

1,你的方法是在定时器里面读取ADC。网友那个估计是用定时器触发ADC转换。不一样概念哦 2,USART_SendData是单个字符发送。DMA则可以一次性发送一批的数据。DMA可以释放CPU,提高效率。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-6-14 18:32:30 | 显示全部楼层
1,你的方法是在定时器里面读取ADC。网友那个估计是用定时器触发ADC转换。不一样概念哦
2,USART_SendData是单个字符发送。DMA则可以一次性发送一批的数据。DMA可以释放CPU,提高效率。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

24

主题

66

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
358
金钱
358
注册时间
2015-11-4
在线时间
124 小时
 楼主| 发表于 2016-6-20 10:09:16 | 显示全部楼层
正点原子 发表于 2016-6-14 18:32
1,你的方法是在定时器里面读取ADC。网友那个估计是用定时器触发ADC转换。不一样概念哦
2,USART_SendData ...

原子哥你好,假如我一次性发送50个数出去,我只要配置好标志位,到50个就启动DMA吗,还是说我这边一边采样,DMA就实时发送出去了,还有DMA在发送的过程中还会不会受定时器中断的影响,因为我现在用示波器查了一下我现在的程序,用USART_Senddata发送的时间较长(比定时器里采样够50个数的时间长),所以导致我发的数据有漏掉。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 13:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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