STM32 ADC DMA 中断模式多通道读取ADC转换值

因为做一个电机控制项目,其中需要用到用PWM触发ADC,读取ADC的转换值。

这里有两个关键问题:

第一,如何使PWM触发ADC转换?

第二,如何在ADC多通道扫描模式下,读取各个channel的adc转换值?

第三,如何使用DMA读取多通道ADC转换值?

第一个问题,首先需要将ADC设置成外部触发转换,第二需要选择触发是发生在Timer的上升沿还是下降沿。程序如下:

    adc.ADC_Resolution = ADC_Resolution_12b;
    adc.ADC_ScanConvMode =ENABLE;     //¶àͨµÀת»»
    adc.ADC_ContinuousConvMode = ENABLE;   //Á¬Ðøת»»
    adc.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising;
    adc.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T8_CC1;
    adc.ADC_DataAlign = ADC_DataAlign_Right;  //ÓÒ¶ÔÆ뷽ʽ
    adc.ADC_NbrOfConversion = 2;
    ADC_Init(ADC1,&adc);
    ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_56Cycles);
    ADC_RegularChannelConfig(ADC1,ADC_Channel_2,2,ADC_SampleTime_56Cycles);
    ADC_Cmd(ADC1,ENABLE);
      //ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE);   //ÉèÖô¥·¢ADCÖжϵÄÖжÏÔ´
    ADC_DMACmd(ADC1, ENABLE);
    ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);

第二个问题,如果是使用ADC1的多个通道进行转换,那么使用DMA,使每个通道转换成功的数据存入响应的内存位置中,会是一个很好的选择,DMA选择外设到内存,外设地址不增加,内存地址增加。

第三个问题,DMA的拓扑图如下,记得使用对应的DMA请求,需要设置好对应的DMAy、streamx和channelz,否则没法触发DMA中断。

这里使用的是ADCDMA请求,选择了DMA2 stream0 channel0。 对应的DMA配置程序如下

//配置
        DMA_DeInit(DMA2_Stream0);
    dma.DMA_Channel= DMA_Channel_0;   //
    dma.DMA_PeripheralBaseAddr = (uint32_t)&(ADC1->DR);
    dma.DMA_Memory0BaseAddr = (uint32_t)ad_buffer;
    dma.DMA_DIR = DMA_DIR_PeripheralToMemory;
    dma.DMA_BufferSize = 2;
    dma.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    dma.DMA_MemoryInc = DMA_MemoryInc_Enable;
    dma.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//DMA_PeripheralDataSize_Byte;
    dma.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//DMA_MemoryDataSize_Byte;
    dma.DMA_Mode = DMA_Mode_Circular;
    dma.DMA_Priority = DMA_Priority_High;
    dma.DMA_FIFOMode = DMA_FIFOMode_Disable;
    dma.DMA_FIFOThreshold = DMA_FIFOThreshold_1QuarterFull;
    dma.DMA_MemoryBurst = DMA_Mode_Normal;
    dma.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
    DMA_Init(DMA2_Stream0,&dma);

    DMA_ITConfig(DMA2_Stream0,DMA_IT_TC,ENABLE);
    DMA_Cmd(DMA2_Stream0,ENABLE);
时间: 2024-12-17 18:28:41

STM32 ADC DMA 中断模式多通道读取ADC转换值的相关文章

关于Stm32定时器+ADC+DMA进行AD采样的实现

Stm32的ADC有DMA功能这都毋庸置疑,也是我们用的最多的!然而,如果我们要对一个信号(比如脉搏信号)进行定时采样(也就是隔一段时间,比如说2ms),有三种方法: 1.使用定时器中断每隔一定时间进行ADC转换,这样每次都必须读ADC的数据寄存器,非常浪费时间! 2.把ADC设置成连续转换模式,同时对应的DMA通道开启循环模式,这样ADC就一直在进行数据采集然后通过DMA把数据搬运至内存.但是这样做的话还得加一个定时中断,用来定时读取内存中的数据! 3.使用ADC的定时器触发ADC转换的功能,

stm32之TIM+ADC+DMA采集50HZ交流信号

http://cache.baiducontent.com/c?m=9d78d513d98207f04fece47f0d01d7174a02d1743ca6c76409c3e03984145b563710f4bb56644b5bc7823c390ef50f1aa8e737012a1e65f2dedf883d80f9c57478de6323706bd71c4dce5ff58b11769737902cefaa18ecb9e732e5adc5d3a95744ca245f3cdfae&p=8b2a975

STM32 F4 ADC DMA Temperature Sensor

STM32 F4 ADC DMA Temperature Sensor Goal: detecting temperature variations using a temperature sensor, ADC with DMA and TIM3 as a trigger (ADC sampling frequency = TIM3 trigger frequency). Note: Using TIM3 as a trigger is suited for monitoring temper

STM32之DMA+ADC

借用小甲鱼的经典:各位互联网的广大网友们.大家早上中午晚上好..(打下小广告,因为小甲鱼的视频真的很不错).每次看小甲鱼的视频自学都是比较轻松愉快的..我在想,如果小甲鱼出STM32的视频,我会一集不漏的听的.哈.好了..学习到了STM32的DMA模块..琢磨了一下中文参考手册,官方是这样描述的: 直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输.无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作. 是的,无需CPU干预,可以想

BeagleBone Black板第九课:测试读取ADC数据

BBB板第九课:测试读取ADC数据 之前我们初步学习了GPIO的使用方法,接下来认识下BBB板上ADC数据的读取操作,因为用BBB板做外部控制,接收外部传感器的一些模拟数据,模数转换ADC是需要用到的.所以在这里我也测试一下这BBB板的ADC简单功能,以后有深入学习到知识再进行补充. ADC资源引脚,P9_32至P9_40共九个引脚,其中P9_32为电源正极,P9_34为共地,其他七个对应七个ADC输入脚,因为有一个Ain_7估计是内部使用了,所以我们只使用Ain_0至Ain_6这七个ADC.

STM32外设DMA使用总结

STM32外设DMA使用总结: 1.根据需要选择DAM模式: (1)循环模式-DMA_Mode =  DMA_Mode_Circular (2)正常模式-DMA_Mode =  DMA_Mode_Normal 2.对于DMA1的Chanel3,对应外设为USART3的RX 试想:如果串口接收中断和DAM中断同时打开,CPU如何相应? (1)中断优先级不同:这好说,支持嵌套中断(NVIC)的Cortex-M3自然优先服务中断优先级高的 (2)中断优先级相同:处理原则,先来先处理:若同时到来,中断号

STM32之外部中断控制

一.STM32外部中断 1.STM32外部中断结构图 如上图所示: 主要包括四个环节,GPIO.AFIO.EXTI.NVIC. 2.STM32外部中断软件配置步骤 ① 配置NVIC控制器 ② 使能GPIO和AFIO时钟 ③ 配置GPIO (复用功能的输入输出配置) ④ 配置AFIO (选定要配置为EXTI的I/O口线) ⑤  EXTI控制器的配置 配置寄存器就好像是我们在更改STM32的硬件电路,让它们处于一种新的工作状态--外部中断模式. 二.STM32外部中断软件配置细节 以PA0引脚的外部

串口通信DMA中断

这是以前学32的时候写的,那时候学了32之后感觉32真是太强大了,比51强的没影.关于dma网上有许多的资料,亲们搜搜,这里只贴代码了,其实我也想详详细细地叙述一番,但是自己本身打字就慢,还有好多事情要做!代码是我亲自都在板子上测试过的,,当然粘贴/复制过去可能也不会尽如人意,知识这东西总是有许多道不清说不明的东西在里头,往往总是不经一番彻骨寒,哪得梅花扑鼻香.推荐一本书吧!这是野火出的.(是为了凑够150个字,否则不让提交) 这本书自从在图书馆借来就从来没有再放回去,总是在续借.像是在打广告了

编写一个stm32 svc关中断函数

做到了让stm32触发svc中断并传递进去参数然后切换到handler模式并修改特殊寄存器的值,从而达到关中断,但是其实这个程序直接就是特权级,故不进入handler模式也可以修改特殊寄存器...... 如下为调用写的开关中断函数: 新建了一个文件asm.c,所有我写的汇编函数都在里面: 前两个是关中断和开中断函数,主要做的事将参数传入R8并触发svc中断. Svc中断中则调用第三个set_i()函数. 当触发了中断之后,M3内核进入handler模式,利用R8中的数据,修改特殊寄存器BASEP