0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

CKS32F107xx系列ADC采样DMA的原理和配置方法

中科芯MCU 来源:中科芯MCU 2024-06-29 10:37 次阅读

采样DMA的原理和配置方法

因为ADC规则组数据寄存器ADC_DR只有一个,如果使用多通道转换,那转换的数据就全部都挤在ADC_DR里面了,前一个时间点转换的通道数据,就会被下一个时间点的另外一个通道转换的数据覆盖掉,所以当通道转换完成后就应该把数据取走,或者开启DMA模式,把数据传输到内存里面,不然就会造成数据的覆盖。多通道ADC采集一般使用DMA进行数据传输,该方法更加高效方便。

注:只有ADC1拥有DMA功能。由ADC2转化的数据可以通过双ADC模式,利用ADC1的 DMA功能传输。

DMA间接

直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。两个DMA控制器有12个通道(DMA1有7个通道,DMA2有5个通道),每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。ADC1使用的是DMA1的通道1。

DMA初始化结构体详解

DMA_InitTypeDef初始化结构体结构体用于设置DMA的工作参数,其具体的定义如下:

typedef struct

{

uint32_t DMA_PeripheralBaseAddr;

uint32_t DMA_MemoryBaseAddr;

uint32_t DMA_DIR;

uint32_t DMA_BufferSize;

uint32_t DMA_PeripheralInc;

uint32_t DMA_MemoryInc;

uint32_t DMA_PeripheralDataSize;

uint32_t DMA_MemoryDataSize;

uint32_t DMA_Mode;

uint32_t DMA_Priority;

uint32_t DMA_M2M;

}DMA_InitTypeDef;

1) DMA_PeripheralBaseAddr:外设地址,设定DMA_CPAR寄存器的值;一般设置为外设的数据寄存器地址,如果是存储器到存储器模式则设置为其中一个存储器地址。我么是把ADC采集到的数据通过DMA传输到存储器上,则外设地址为ADC的数据寄存器。

2) DMA_Memory0BaseAddr:存储器地址,设定DMA_CMAR寄存器值;一般设置为我们自定义的用来存放ADC数据的数组地址。

3) DMA_DIR:传输方向选择,可选外设到存储器、存储器到外设。它设定 DMA_CCR寄存器的DIR[1:0]位的值。这里并没有存储器到存储器的方向选择,当使用存储器到存储器时,只需要把其中一个存储器当作外设使用即可。本章选择为外设到存储器。

4) DMA_BufferSize:设定待传输数据数目,初始化设定DMA_CNDTR寄存器的值,其大小等于我们定义的存储ADC数据的数组大小。

5)DMA_PeripheralInc:如果配置为 DMA_PeripheralInc_Enable,使能外设地址自动递增功能,它设定DMA_CCR寄存器的PINC位的值;因为ADC转换的数据都存放在一个数据寄存器中,则外设地址不变。

6) DMA_MemoryInc:如果配置为 DMA_MemoryInc_Enable,使能存储器地址自动递增功能,它设定DMA_CCR寄存器的MINC位的值;因为我们自定义的数组用来存放两个数据,所以要使能存储器地址自动递增功能。

7) DMA_PeripheralDataSize:外设数据宽度,可选字节(8位)、半字(16位) 和字(32位),它设定DMA_CCR寄存器的PSIZE[1:0]位的值。

8) DMA_MemoryDataSize:存储器数据宽度,可选字节(8位)、半字(16位) 和字(32位),它设定DMA_CCR寄存器的MSIZE[1:0]位的值。外设和存储器单位均为两个字节。

9) DMA_Mode:DMA传输模式选择,可选一次传输或者循环传输,它设定 DMA_CCR寄存器的CIRC位的值。例程我们的ADC采集是持续循环进行的,所以使用循环传输模式。当启动了循环模式,数据传输的数目变为0时,将会自动地被恢复成配置通道时设置的初值,DMA操作将会继续进行。

ADC的工作参数配置

// 只使用一个ADC,属于单模式

ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;

// 扫描模式

ADC_InitStructure.ADC_ScanConvMode = ENABLE ;

// 连续转换模式

ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;

// 不用外部触发转换,软件开启即可

ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;

// 转换结果右对齐

ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;

// 转换通道个数

ADC_InitStructure.ADC_NbrOfChannel = 2;

// 初始化ADC

ADC_Init(ADC1, &ADC_InitStructure);

// 配置ADC时钟N狿CLK2的8分频,即9MHz

RCC_ADCCLKConfig(RCC_PCLK2_Div8);

// 配置ADC 通道的转换顺序和采样时间

ADC_RegularChannelConfig(ADC1, ADC_CHANNEL1, 1, ADC_SampleTime_55Cycles5);

ADC_RegularChannelConfig(ADC1, ADC_CHANNEL2, 2, ADC_SampleTime_55Cycles5);

// 使能ADC DMA 请求

ADC_DMACmd(ADC1, ENABLE);

// 开启ADC ,并开始转换

ADC_Cmd(ADC1, ENABLE);

// 初始化ADC 校准寄存器

ADC_ResetCalibration(ADC1);

// 等待校准寄存器初始化完成

while(ADC_GetResetCalibrationStatus(ADC1));

// ADC开始校准

ADC_StartCalibration(ADC1);

// 等待校准完成

while(ADC_GetCalibrationStatus(ADC1));

// 由于没有采用外部触发,所以使用软件触发ADC转换

ADC_SoftwareStartConvCmd(ADC1, ENABLE);

因为只是使用一个 ADC,所以模式配置为独立模式;例程中使用了ADC1的两个通道进行采集,因此需要开启扫描模式,当一个通道转换结束时,同一组的下一个通道将被自动转换;例程实现不间断的对外部模拟数据进行采集,因此使能连续转换模式。ADC的转换采用软件触发的方式,因此不使用外部触发转换信号。转换结果右对齐;转换通道数为2;因为是两个通道进行采集,所以调用ADC_RegularChannelConfig()函数设置每个通道的转换顺序和采样时间。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    31

    文章

    5308

    浏览量

    119975
  • 存储器
    +关注

    关注

    38

    文章

    7447

    浏览量

    163579
  • adc
    adc
    +关注

    关注

    98

    文章

    6429

    浏览量

    544033
  • dma
    dma
    +关注

    关注

    3

    文章

    559

    浏览量

    100411

原文标题:MCU微课堂|CKS32F107xx系列 ADC(二)

文章出处:【微信号:中科芯MCU,微信公众号:中科芯MCU】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    MCU微课堂|CKS32F4xx系列产品时钟配置

    ,并且高时钟频率将导致功耗增加、抗电磁干扰能力变弱,因此,CKS32F4xx系列产品内部具备多个时钟源。本文将对CKS32F4xx系列产品时钟组成进行分析,并讲解该系统单片机的时钟的
    发表于 12-12 10:17 805次阅读

    CKS32F4xx系列ETH通信详解

    CKS32F4xx系列芯片自带以太网模块,该模块包括带专用DMA控制器的MAC 802.3(介质访问控制)控制器
    的头像 发表于 11-10 11:13 953次阅读
    <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b>ETH通信详解

    基于CKS32F4xx系列的MCU互补PWM方案

    互补输出实际跟比较输出章节一样使用的是定时器的功能,所以相关的函数设置同样在库函数文件CKS32f4xx_tim.h和CKS32f4xx_tim.c文件中。 1)开启TIM1和GPIO时钟,配置PA7、PA8选择复用功能GPIO
    发表于 12-02 10:13 587次阅读
    基于<b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b>的MCU互补PWM方案

    CKS32F4xx系列产品串口DMA传输

    在上一讲,我们讲过CKS32F4xx系列的6个串口都支持DMA传输。因此本节我们对CKS32F4xx系列
    的头像 发表于 04-10 11:18 1004次阅读

    CKS32F4xx系列DAC功能

    CKS32F4xx系列DAC功能
    的头像 发表于 11-06 16:56 815次阅读
    <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b>DAC功能

    CKS32F4xx系列ADC多通道DMA电压采集

    CKS32F4xx系列ADC多通道DMA电压采集
    的头像 发表于 11-06 16:53 1065次阅读

    CKS32F4xx系列ADC单通道电压采集

    CKS32F4xx系列ADC单通道电压采集
    的头像 发表于 11-06 16:54 945次阅读
    <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b><b class='flag-5'>ADC</b>单通道电压采集

    CKS32F4xx系列产品Timer的基本使用方法-定时器脉冲计数

    CKS32F4xx系列产品Timer的基本使用方法-定时器脉冲计数
    的头像 发表于 11-09 17:38 1012次阅读
    <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b>产品Timer的基本使用<b class='flag-5'>方法</b>-定时器脉冲计数

    CKS32F4xx系列产品Timer的基本使用方法-比较输出

    CKS32F4xx系列产品Timer的基本使用方法-比较输出
    的头像 发表于 11-09 17:39 811次阅读
    <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b>产品Timer的基本使用<b class='flag-5'>方法</b>-比较输出

    CKS32F4xx系列产品Timer的基本使用方法-定时操作

    CKS32F4xx系列产品Timer的基本使用方法-定时操作
    的头像 发表于 11-09 17:41 575次阅读
    <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b>产品Timer的基本使用<b class='flag-5'>方法</b>-定时操作

    MCU微课堂 | CKS32F4xx系列产品GPIO口配置

    MCU微课堂 | CKS32F4xx系列产品GPIO口配置
    的头像 发表于 10-24 15:14 741次阅读
    MCU微课堂 | <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b>产品GPIO口<b class='flag-5'>配置</b>

    CKS32F107xx系列时钟系统具体配置方法讲解

    上一章节对CKS32F107xx系列时钟做了整体介绍,本章节以使用HSI内部高速时钟为例对时钟具体配置方法进行讲解。
    的头像 发表于 05-28 10:05 514次阅读
    <b class='flag-5'>CKS32F107xx</b><b class='flag-5'>系列</b>时钟系统具体<b class='flag-5'>配置</b><b class='flag-5'>方法</b>讲解

    CKS32F107xx系列MCU中ADC介绍

    CKS32F107xx系列产品提供2个12位的模拟/数字转换器(ADC),每个ADC共用多达16个外部通道,各通道的A/D转换可以单次、连续、扫描或间断模式执行。
    的头像 发表于 06-22 11:04 613次阅读

    CKS32F107xx系列MCU的双重ADC模式

    独立模式的ADC采集需要在一个通道采集并且转换完成后才会进行下一个通道的采集。而双重ADC的机制就是使用两个ADC同时采样一个或者多个通道。双重AD
    的头像 发表于 07-22 09:19 401次阅读
    <b class='flag-5'>CKS32F107xx</b><b class='flag-5'>系列</b>MCU的双重<b class='flag-5'>ADC</b>模式

    CKS32F107xx系列MCU的GPIO内部硬件结构和工作模式

    16个引脚,如型号为CKS2F107VET6型号的芯片有GPIOA、GPIOB、GPIOC至GPIOE共5组GPIO,芯片一共100个引脚,其中GPIO就占了一大部分,所有的GPIO引脚都有基本的输入输出功能。
    的头像 发表于 07-22 09:23 601次阅读
    <b class='flag-5'>CKS32F107xx</b><b class='flag-5'>系列</b>MCU的GPIO内部硬件结构和工作模式