精华内容
下载资源
问答
  • DMA模式

    2014-12-18 23:23:32
    DMA模式下,CPU只须向DMA控制器下达指令,让DMA控制器来处理数据的传送,数据传送完毕再把信息反馈给CPU,这样就很大程度上减轻了CPU资源占有率,可以大大节省系统资源。DMA模式又可以分为Single-Word DMA(单字节...
    DMA的英文拼写是“Direct Memory Access”,汉语的意思就是直接内存访问,是一种不经过CPU而直接从内存存取数据的数据交换模式。在DMA模式下,CPU只须向DMA控制器下达指令,让DMA控制器来处理数据的传送,数据传送完毕再把信息反馈给CPU,这样就很大程度上减轻了CPU资源占有率,可以大大节省系统资源。DMA模式又可以分为Single-Word DMA(单字节DMA)和Multi-Word
     DMA(多字节DMA)两种,其中所能达到的最大传输速率也只有16.6MB/s。

    直接存储器存取方式,主要用于快速设备和主存储器成批交换数据的场合。在这种应用中,处理问题的出发点集中到两点:一是不能丢失快速设备提供出来的数据,二是进一步减少快速设备入出操作过程中对CPU的打扰。这可以通过把这批数据的传输过程交由一块专用的接口卡(DMA接口)来控制,让DMA卡代替CPU控制在快速设备与主存储器之间直接传输数据,此时每传输一个数据只需一个总线周期即可。从共同使用总线的角度看,DMA和CPU成为竞争对手关系。当完成一批数据传输之后,快速设备还是要向CPU发一次中断请求,报告本次传输结束的同时,"请示"下一步的操作要求。
     
    PIO模式下硬盘和内存之间的数据传输是由CPU来控制的;而在DMA模式下,CPU只须向DMA控制器下达指令,让DMA控制器来处理数据的传送,数据传送完毕再把信息反馈给CPU,这样就很大程度上减轻了CPU资源占有率。DMA模式与PIO模式的区别就在于,DMA模式不过分依赖CPU,可以大大节省系统资源,二者在传输速度上的差异并不十分明显。DMA模式又可以分为Single-Word DMA(单字节DMA)和Multi-Word DMA(多字节DMA)两种,其中所能达到的最大传输速率也只有16.6MB/s。   DMA 传送方式的优先级高于程序中断,两者的区别主要表现在对CPU的干扰程度不同。中断请求不但使CPU停下来,而且要CPU执行中断服务程序为中断请求服务,这个请求包括了对断点和现场的处理以及CPU与外设的传送,所以CPU付出了很多的代价;DMA请求仅仅使CPU暂停一下,不需要对断点和现场的处理,并且是由DMA控制外设与主存之间的数据传送,无需CPU的干预,DMA只是借用了一点CPU的时间而已。还有一个区别就是,CPU对这两个请求的响应时间不同,对中断请求一般都在执行完一条指令的时钟周期末尾响应,而对DMA的请求,由于考虑它的高效性,CPU在每条指令执行的各个阶段之中都可以让给DMA使用,是立即响应。  DMA主要由硬件来实现,此时高速外设和内存之间进行数据交换不通过CPU的控制,而是利用系统总线。DMA方式是I/O系统与主机交换数据的主要方式之一,另外还有程序查询方式和中断方式。 
    展开全文
  • STM32 ADC多通道转换DMA模式与非DMA模式两种方法(HAL库)
    展开全文
  • 一、非DMA模式(转)  说明:这个是自己刚做的时候百度出来的,不是我自己做出来的,因为感觉有用就保存下来做学习用,原文链接:https://blog.csdn.net/qq_24815615/article/details/70227385,下面第二部分我会...

     

    一、非DMA模式(转)

      说明:这个是自己刚做的时候百度出来的,不是我自己做出来的,因为感觉有用就保存下来做学习用,原文链接:https://blog.csdn.net/qq_24815615/article/details/70227385,下面第二部分我会补充自己的DMA模式的方法。

      Stm32 ADC 的转换模式还是很灵活,很强大,模式种类很多,那么这也导致很多人使用的时候没细心研究参考手册的情况下容易混淆。不知道该用哪种方式来实现自己想要的功能。网上也可以搜到很多资料,但是大部分是针对之前老版本的标准库的。昨天帮客户解决这个问题,正好做个总结:使用stm32cubeMX配置生成多通道采集的例子。

    软件:STM32Cumebx  MDK

    硬件:eemaker板(基于stm32F103c8的)

    在百度搜索ADC多通道采集,大部分的都是基于采用dma模式才实现的。而我讲的使用非dma方法。首先有几个概念要搞清楚:

      扫描模式(想采集多通道必须开启):是一次对所选中的通道进行转换,比如开了ch0,ch1,ch4,ch5。Ch0转换完以后就会自动转换通道0,1,4,5直到转换完。但是这种连续性并不是不能被打断。这就引入了间断模式,可以说是对扫描模式的一种补充。它可以把0,1,4,5这四个通道进行分组。可以分成0,1一组,4,5一组。也可以每个通道配置为一组。这样每一组转换之前都需要先触发一次。

      Stm32 ADC的单次模式和连续模式。这两中模式的概念是相对应的。这里的单次模式并不是指一个通道。假如你同时开了ch0,ch1,ch4,ch5这四个通道。单次模式转换模式下会把这四个通道采集一边就停止了。而连续模式就是这四个通道转换完以后再循环过来再从ch0开始。

      另外还有规则组和注入组的概念,因为我这个例程只用到了规则组,就不多介绍这两个概念,想要弄清楚请自行查阅手册。

    下面进入正题,配置stm32cubeMX。

    Stm32cubeMx配置ADC多通道采集

    先使能几个通道,我这里设置为0、1、4、5.

    然后就要配置ADC的参数:

    Stm32cubeMx配置ADC多通道采集

      目前经过我的测试,要想用非dma和中断模式只有这样配置可以正确进行多通道转换:扫描模式+单次转换模式+间断转换模式(每个间断组一个通道)。

      分析配置成这样的模式,扫描模式是在配置为多个通道必须打开的,stm32cubeMX上也默认好了,只能enable。单次转换模式是我不需要不停的去采集每个通道值,而是把四个通道采集完以后就让它停止。这里间断配置是关键,间断模式可以让扫描的四个通道进行分成四个组,stm32cubeMX参数里面number of Discontinous Conversions是配置间断组每个组有几个通道的,这里必须配置为1(否则在获取ad值得时候只能读取到每个间断组最后一个通道)。

    生成mdk工程代码。这时候还没有完成,只是实现了ADC的初始化,需要采集这四个通道值得函数还要自己写。下面这个是我main函数的while循环:

    for(i=1;i<5;i++)
    
    {
    
    HAL_ADC_Start(&hadc1);
    
    HAL_ADC_PollForConversion(&hadc1,0xffff);//等待ADC转换完成
    
    adcBuf[i]=HAL_ADC_GetValue(&hadc1);
    
    printf("------ch:%d--%d-------\r\n",i,adcBuf[i]);
    
    }
    
    HAL_ADC_Stop(&hadc1);
    
    HAL_Delay(1000);

      调用hal库接口函数也需要注意,HAL_ADC_Start一定要放在for里面,即每一个通道都要触发。四个通道都采集完了,再去调用HAL_ADC_Stop(&hadc1);结束本次ADC采集。

     

    二、DMA模式

      下面就是我自己的DMA模式的ADC多通道转换了。

      先配置一些ADC的基本配置:

      引脚

     

      时钟

      这个时钟可以结合ADC设置里配置的采样时间结合计算出ADC转换的时间,进而换算出频率。

      接着配置DMA

      ADC是12位的,其实DMA只需要用Half Word就可以了,但实际中HAL_ADC_Start_DMA(ADC_HandleTypeDef* hadc, uint32_t* pData, uint32_t Length);
    该函数中pData为32位的,也就是DMA必须配置为Word才可以。

     配置ADC基本设置 

      这里要注意选择对不同的通道,一开始我就是没留意到这个问题,就只有一个通道 Channel10 在转换,后来查看就是Rank1、2、3全配置成  Channel10 了,所以只有这个通道在转换,这里这个提醒大家注意一下。

      中断配置

      最后在main文件的main函数里的while循环里加入下面代码

    HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&AD_DMA, 5); //启用DMA的ADC转换,AD_DMA 0~3 对应ADC 0~3,这里注意最后一个参数的大小
    printf("AD_DMA_0 = %d\r\n",AD_DMA[0]);
    printf("AD_DMA_1 = %d\r\n",AD_DMA[1]);
    printf("AD_DMA_2 = %d\r\n",AD_DMA[2]);
    HAL_Delay(500);

      注意:在while循环前要加ADC校准

        HAL_ADCEx_Calibration_Start(&hadc1);    //AD校准

      串口打印结果如下,至于怎样串口打印这里就不多说了,想知道的可以看https://www.cnblogs.com/xingboy/p/9522940.html

       

    补充:使用定时器与DMA中断定时采集

      上面只是单纯的一直采集的,如果想要用到中断的话就可以按下面的方式来,ADC配置跟上面说的DMA模式一样:

      先配置定时器中断,怎么配置可以参考我的另一个文章https://www.cnblogs.com/xingboy/p/9897500.html

      接着在 main 函数的 while 循环前打开定时器中断

        HAL_TIM_Base_Start_IT(&htim3); //启动定时器中断

      然后重写定时器中断回调函数

    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    {
        HAL_ADC_Start_DMA(&hadc1, (uint32_t*)&AD_DMA, 5); //启用DMA的ADC转换,AD_DMA 0~3 对应ADC 0~3,这里注意最后一个参数的大小
    }

      这里要注意了,我调试的时候发现HAL_ADC_Start_DMA()函数中最后一个参数的大小起码要比你定义的AD_DMA数组大2,不过不能大于2倍,前面的使用这个函数的时候也是要这样,数据太小,会导致后面的AD通道采集不了数据,大于2倍程序会一直卡住,至于为什么这样子我也还没搞懂,知道的可以告诉我一声。【补充:关于这个参数大小的问题,我查了一些资料,一般ADC每次读进来的数据都是2个字节大小的半字,所以3个通道读进来的一般一次6个字节这样,4个通道类似,而这里的最后一个参数代表的就是要传输的字节数,所以这个参数要根据通道个数设置,通常ADC读入一个半字,也就是uint16_t,你设为Word,那么会去读一个uint32_t是4个字节,其实这个我也还不是很懂,不知道对不对的欢迎大家指出

      最后写DMA中断服务函数

    void DMA1_Channel1_IRQHandler(void)
    {
      /* USER CODE BEGIN DMA1_Channel1_IRQn 0 */
        
        /*自己添加代码部分*/
        HAL_ADC_Stop_DMA(&hadc1); //停止DMA的ADC转换,AD_DMA 0~3 对应ADC 0~3
        HAL_TIM_Base_Stop_IT(&htim3);//关闭定时器
        printf("AD_DMA_0 = %d\r\n",AD_DMA[0]);
        printf("AD_DMA_1 = %d\r\n",AD_DMA[1]);
        printf("AD_DMA_2 = %d\r\n",AD_DMA[2]);
        HAL_TIM_Base_Start_IT(&htim3); //重新开启定时器
        
      /* USER CODE END DMA1_Channel1_IRQn 0 */
      HAL_DMA_IRQHandler(&hdma_adc1);
      /* USER CODE BEGIN DMA1_Channel1_IRQn 1 */
        //__HAL_DMA_CLEAR_FLAG(&hdma_adc1, __HAL_DMA_GET_TC_FLAG_INDEX(&hdma_adc1)); //清楚标志位
      /* USER CODE END DMA1_Channel1_IRQn 1 */
    } 

      这样子,就可以实现1S采集多少次ADC了,而不用单纯控制采样频率来控制1S的ADC采集次数了,个人觉得单纯控制采样频率比较难算。

    补充:单通ADC采集参考:https://www.cnblogs.com/xingboy/p/10018749.html

     

     补充一个 4 通道采集 DMA 模式:

      

      

      

      

      

           定义一个数组存放DMA数据

    uint16_t AD_DMA[4];

      直接在 main 函数的 while 前面开启 ADC校验跟采集

    HAL_ADCEx_Calibration_Start(&hadc1);              //AD校准
    HAL_ADC_Start_DMA(&hadc1, (uint32_t *)&AD_DMA, 8); //启用DMA的ADC转换,AD_DMA 0~3 对应ADC 0~3  

      while函数里打印DMA的值

            printf("AD0 = %d\r\n",AD_DMA[0]);
            printf("AD1 = %d\r\n",AD_DMA[1]);
            printf("AD2 = %d\r\n",AD_DMA[2]);
            printf("AD3 = %d\r\n",AD_DMA[3]);
            HAL_Delay(1000);

      打印结果如下

        

     

     

     

     

     

      

    转载于:https://www.cnblogs.com/xingboy/p/10212308.html

    展开全文
  • 本文主要对stm32 ad双通道dma模式进行了简要说明,希望对你的学习有所帮助。
  • PIO模式和DMA模式的区别

    千次阅读 2019-06-11 17:40:32
    硬盘和内存之间数据传送的两种方式:一是PIO模式,二是DNA... DMA模式下,CPU并不全程参与数据的传送工作,只需下达命令即可。DMA方式下有控制器和通道,CPU只须向DMA控制器下达指令,让DMA控制器来处理数据的传送...

            硬盘和内存之间数据传送的两种方式:一是PIO模式,二是DNA模式

            PIO模式下通过CPU来控制硬盘和内存之间的数据传输,是一种通过CPU执行I/O端口指令来进行数据的读写的数据交换模式。;

            DMA模式下,CPU并不全程参与数据的传送工作,只需下达命令即可。DMA方式下有控制器和通道,CPU只须向DMA控制器下达指令,让DMA控制器来处理数据的传送,数据传送完毕再把信息反馈给CPU,这样就很大程度上减轻了CPU资源占有率。DMA模式与PIO模式的区别就在于,DMA模式不过分依赖CPU,可以大大节省系统资源,二者在传输速度上的差异并不十分明显。DMA模式又可以分为Single-Word DMA(单字节DMA)和Multi-Word DMA(多字节DMA)两种,其中所能达到的最大传输速率也只有16.6MB/s。

            DMA需要传送数据时和程序中断来临时先处理哪一个?

            DMA 传送方式的优先级高于程序中断,两者的区别主要表现在对CPU的干扰程度不同。程序中断请求不但使CPU停下来,而且要CPU执行中断服务程序为中断请求服务,这个请求包括了对断点和现场的处理以及CPU与外设的传送,所以CPU付出了很多的代价;DMA请求仅仅使CPU暂停一下,不需要对断点和现场的处理,并且是由DMA控制外设与主存之间的数据传送,无需CPU的干预,DMA只是借用了一点CPU的时间而已。还有一个区别就是,CPU对这两个请求的响应时间不同,对程序中断请求一般都在执行完一条指令的时钟周期末尾响应,而对DMA的请求,由于考虑它的高效性,CPU在每条指令执行的各个阶段之中都可以让给DMA使用,是立即响应。 DMA主要由硬件来实现,此时高速外设和内存之间进行数据交换不通过CPU的控制,而是利用系统总线。DMA方式是I/O系统与主机交换数据的主要方式之一,另外还有程序查询方式和中断方式。

    展开全文
  • STM32 多通道ADC采集详解(DMA模式和非DMA模式

    万次阅读 多人点赞 2018-10-26 19:06:20
    ADC相关问题: 1.采集到的值如何转化计算? STM32系列芯片大都是12位只有少部分是16位的,如:F373芯片。 12位分辨率意味着我们采集电压的精度可以达到:Vref / 4096。...扫描模式用于多通道...
  • STM32F1uartDMA模式任意长度接收发送
  • 硬盘DMA模式和PIO模式

    千次阅读 2018-03-13 11:41:44
    硬盘DMA模式和PIO模式 DMA的英文拼写是“Direct Memory Access”(存储器直接访问)。这是指一种高速的数据传输操作,允许在外部设备和存储器之间直接读写数据,既不通过CPU,也不需要CPU干预。整个数 据传输操作在...
  • STM32CubeMX实现DMA模式下的AD转换
  • STM32F1uartDMA模式任意长度接收发送.rar
  • WinXP自行关闭硬盘DMA模式详解 WinXP自行关闭硬盘DMA模式详解 WinXP自行关闭硬盘DMA模式详解 WinXP自行关闭硬盘DMA模式详解
  • USART 配置为DMA模式的接收和DMA模式的发送 DMA接收模式配置介绍: DMA的接收模式就是外界对单片机的串口进行写入,由DMA总线把写入到USART->DR寄存器的字节数据搬运到数组缓冲区当中。 一般情况下需要配合着...
  • 串口模式实现有三种 1.普通模式:在主函数中接收函数 2.中断模式:产生的不影响主程序运行 3. DMA模式:与主函数互不影响,独立运行 本文记录三种DMA模式
  • 本文使用ADC转换电位器输出的电压值,并用DMA模式传输转换的结果,每8次采样转换取平均值,做一个简单的数字滤波。
  • STM32F1 DMA模式使用DAC

    2015-11-10 23:34:13
    程序采用STM32F1系列单片机,对单片机内部的DA转换进行了使用,使用了DMA模式,对CPU占用极小。
  • 如何打开硬盘DMA模式

    2009-03-18 10:53:08
    一般读取硬盘速度较慢,在电脑中隐藏了速度的DMA模式,学习如何开启DMA模式
  • STM32F103的ADC采集,DMA模式,默认全部开启
  • STM32 HAL库之DMA模式ADC

    千次阅读 2020-03-28 19:51:44
    STM32 HAL库之DMA模式ADC
  • Z-stack串口的DMA模式

    2011-12-29 14:51:31
    ZStack-CC2530-2.3.0-1.4.0版本下SampleApp工程中修改测试串口功能的文档,是关于串口两种模式中的DMA模式,这个DMA模式网络上资源比较少。
  • ADC DMA模式.rar

    2021-05-14 15:52:55
    使用DMA来配置ADC
  • PDIUSBD12 DMA 模式应用 基于协议的 DMA 操作简介
  • 2. ADSP-BF706之UART串口DMA模式 上一篇是时钟配置,我今天会进一步验证一下外部和内部时钟的稳定性,对于中断配置的话,我是在配置各个外设时顺便就配置的,所以就不单独列出来了,相关的配置会在文中提及。 今天来...
  • 硬盘的PIO模式和DMA模式

    千次阅读 2013-02-05 09:49:45
    变化,由最初的PIO模式,到DMA模式,再到Ultra DMA模式。 PIO模式  PIO的英文拼写是“Programming Input/Output Model”,PIO模式是一种通过CPU执行I/O端口指令来进行 数据的读写的数据交换模式。是最早先的硬
  • HAL库 实现DMA模式 串口1和串口2完全透传,代码简单高效,开启透传后,无需软件控制。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,160
精华内容 864
关键字:

dma模式