DMA简介
ADC简介

单通道采集
简介:ADC采集数据通过DMA通道发送到内存
.c文件

#include "adc.h"
uint16_t ADC_ConvertedValue;   //ADC通道1或通道3数据16位
void GPIO_Config(void)
{   RCC_APB2PeriphClockCmd(ADC_GPIO_RCC,  ENABLE);GPIO_InitTypeDef   GPIO_InitStruct;GPIO_InitStruct.GPIO_Pin = ADC_GPIO_PIN ;GPIO_InitStruct.GPIO_Mode = ADC_GPIO_MODE ;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init(ADC_GPIO_PORT , &GPIO_InitStruct);
}void DMA_Config(void)
{RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);DMA_DeInit(DMA1_Channel_x);   DMA_InitTypeDef DMA_InitStructure; DMA_InitStructure.DMA_PeripheralBaseAddr =  (uint32_t) (&(ADC_x->DR));   // DMA 外设基地址DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue; ;             // 内存基地址DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                        //外设作为数据的来源DMA_InitStructure.DMA_BufferSize = 1; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;         //外设地址不递增DMA_InitStructure.DMA_MemoryInc =DMA_MemoryInc_Disable ;            //内存地址也不变DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;  //数据宽度16位  ADC输出16位数据DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;  //数据宽度16位  ADC输出16位数据DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;             //工作在循环DMA_InitStructure.DMA_Priority = DMA_Priority_High;        //高优先级DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel_x, &DMA_InitStructure); DMA_Cmd(DMA1_Channel_x,ENABLE);  //使能MAS6}
void ADC_Config(void)
{GPIO_Config();DMA_Config();RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);ADC_DeInit(ADC_x);   //初始化ADC_InitTypeDef ADC_InitStructure; ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;   //工作在独立模式ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(ADC_x, &ADC_InitStructure); RCC_ADCCLKConfig(RCC_PCLK2_Div8);    //设置时钟ADC_RegularChannelConfig(ADC_x, ADC_Channel_12, 1, ADC_SampleTime_55Cycles5);   //设置指定 ADC 的规则组通道ADC_DMACmd(ADC_x,ENABLE);    //使能DMA __ADCADC_Cmd(ADC_x,ENABLE);ADC_ResetCalibration(ADC_x);   // 初始化ADC 校准寄存器  while(ADC_GetResetCalibrationStatus(ADC_x));   // 等待校准寄存器初始化完成ADC_StartCalibration(ADC_x);while(ADC_GetCalibrationStatus(ADC_x));ADC_SoftwareStartConvCmd(ADC_x,ENABLE);   //软件使能}

.h文件

#ifndef _ADC_H_
#define _ADC_H_#include "stm32f10x.h"#define ADC_GPIO_RCC     RCC_APB2Periph_GPIOC
#define ADC_GPIO_PORT    GPIOC
#define ADC_GPIO_PIN     GPIO_Pin_2          //ADC通道12
#define ADC_GPIO_MODE    GPIO_Mode_AIN       //模拟输入#define DMA1_Channel_x    DMA1_Channel1      //DMA1通道1 对应ADC1
#define  ADC_x                 ADC1
void ADC_Config(void);
#endif

main .c

#include "main.h"
extern uint16_t ADC_ConvertedValue;
int main()
{float ADC_ConvertedValueLocal;Usart1_Init(115200);printf("测试开始\r\n");ADC_Config();  //ADC初始化
while(1)
{**加粗样式**
ADC_ConvertedValueLocal =(float) ADC_ConvertedValue/4096*3.3; // 读取转换的AD值printf("\r\n The current AD value = 0x%04X \r\n", ADC_ConvertedValue); printf("\r\n The current AD value = %f V \r\n",ADC_ConvertedValueLocal); Delay_ms(1000);
}
}

多通道采集
简介:同时采集多个IO口的ADC模拟输出值。通过DMA发送到内存
.c文件

#include "adc.h"
uint16_t ADC_ConvertedValue[channel_number];   //ADC通道1或通道3数据16位
void GPIO_Config(void)
{   RCC_APB2PeriphClockCmd(ADC_GPIO_RCC,  ENABLE);GPIO_InitTypeDef   GPIO_InitStruct;GPIO_InitStruct.GPIO_Pin = ADC_GPIO_PIN0|ADC_GPIO_PIN1|ADC_GPIO_PIN2|ADC_GPIO_PIN3|ADC_GPIO_PIN4|ADC_GPIO_PIN5 ;GPIO_InitStruct.GPIO_Mode = ADC_GPIO_MODE ;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init(ADC_GPIO_PORT , &GPIO_InitStruct);
}void DMA_Config(void)
{RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);DMA_DeInit(DMA1_Channel_x);   DMA_InitTypeDef DMA_InitStructure; DMA_InitStructure.DMA_PeripheralBaseAddr =  (uint32_t) (&(ADC_x->DR));   // DMA 外设基地址DMA_InitStructure.DMA_MemoryBaseAddr = (u32)ADC_ConvertedValue;             // 内存基地址DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                       //外设作为数据的来源DMA_InitStructure.DMA_BufferSize = channel_number; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;         //外设地址不递增DMA_InitStructure.DMA_MemoryInc =DMA_MemoryInc_Enable ;            //内存地址递增DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;  //数据宽度16位  ADC输出16位数据DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;  //数据宽度16位  ADC输出16位数据DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;             //工作在循环DMA_InitStructure.DMA_Priority = DMA_Priority_High;        //高优先级DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(DMA1_Channel_x, &DMA_InitStructure); DMA_Cmd(DMA1_Channel_x,ENABLE);  //使能MA6}
void ADC_Config(void)
{GPIO_Config();DMA_Config();RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);ADC_DeInit(ADC_x);   //初始化ADC_InitTypeDef ADC_InitStructure; 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 = channel_number;   //规则转换的 ADC 通道的数目ADC_Init(ADC_x, &ADC_InitStructure); RCC_ADCCLKConfig(RCC_PCLK2_Div8);    //设置时钟ADC_RegularChannelConfig(ADC_x, ADC_Channel_10, 1, ADC_SampleTime_55Cycles5);   //设置指定 ADC 的规则组通道ADC_RegularChannelConfig(ADC_x, ADC_Channel_11, 2, ADC_SampleTime_55Cycles5);ADC_RegularChannelConfig(ADC_x, ADC_Channel_12, 3, ADC_SampleTime_55Cycles5);ADC_RegularChannelConfig(ADC_x, ADC_Channel_13, 4, ADC_SampleTime_55Cycles5);ADC_RegularChannelConfig(ADC_x, ADC_Channel_14, 5, ADC_SampleTime_55Cycles5);ADC_RegularChannelConfig(ADC_x, ADC_Channel_15, 6, ADC_SampleTime_55Cycles5);ADC_DMACmd(ADC_x,ENABLE);    //使能DMA __ADCADC_Cmd(ADC_x,ENABLE);ADC_ResetCalibration(ADC_x);    // 初始化ADC 校准寄存器  while(ADC_GetResetCalibrationStatus(ADC_x));   // 等待校准寄存器初始化完成ADC_StartCalibration(ADC_x);while(ADC_GetCalibrationStatus(ADC_x));ADC_SoftwareStartConvCmd(ADC_x,ENABLE);   //软件使能}

.h文件

#ifndef _ADC_H_
#define _ADC_H_#include "stm32f10x.h"#define ADC_GPIO_RCC     RCC_APB2Periph_GPIOC
#define ADC_GPIO_PORT    GPIOC#define ADC_GPIO_PIN0     GPIO_Pin_0          //ADC通道10
#define ADC_GPIO_PIN1     GPIO_Pin_1          //ADC通道11
#define ADC_GPIO_PIN2     GPIO_Pin_2          //ADC通道12
#define ADC_GPIO_PIN3     GPIO_Pin_3          //ADC通道13
#define ADC_GPIO_PIN4     GPIO_Pin_4          //ADC通道14
#define ADC_GPIO_PIN5     GPIO_Pin_5          //ADC通道15
#define ADC_GPIO_MODE     GPIO_Mode_AIN       //模拟输入#define DMA1_Channel_x    DMA1_Channel1      //DMA1通道1 对应ADC1
#define  ADC_x            ADC1
#define channel_number     6
void ADC_Config(void);
#endif

main.c

#include "main.h"
extern uint16_t ADC_ConvertedValue[channel_number];int main()
{u8 i;float ADC_ConvertedValueLocal[channel_number];Usart1_Init(115200);printf("测试开始\r\n");ADC_Config();  //ADC初始化while(1)
{for(i=0;i<channel_number;i++){ADC_ConvertedValueLocal[i] =(float) ADC_ConvertedValue[i]/4096*3.3; // 读取转换的AD值}for(i=0 ;i<channel_number;i++)
{printf(" The %d channel current AD value = 0x%04X \r\n",i, ADC_ConvertedValue[i]); printf(" The %d channel current AD value = %f V \r\n",i,ADC_ConvertedValueLocal[i]); printf("\r\n\r\n");
}   Delay_ms(1000);
}
}

STM32F103_ADC-DMA通道采集相关推荐

  1. STM32F4 ADC+DMA单通道采集

    背景:对锂电池电压进行采集,由于电池电压为12V,已经提前对12V进行分压,保证ADC采集电压的范围为0~3.3V.对电池电压的采集不用太过频繁,循环模式下的ADC+DMA对一直采集电压浪费资源.于是 ...

  2. stm32l151 ADC通过DMA通道定时采样电池电量

      最近在使用stm32l151开发一个项目,我的项目需求是ADC采集电池电量,通过DMA通道传送出来.然而我并不是得到了电池电量数据后就立马连续输出,而是通过tim4定时器每1s访问一次采样得到的电 ...

  3. STM32——多通道ADC的DMA方式采集方法

    前言: 最近在调试STM32F205芯片ADC多通道DMA方式采集数据,总结下STM32多通道ADC的DMA方式采集的使用方法. 硬件平台:STM32F205 软件平台:keil v5 函数库:标准库 ...

  4. 用ADC0809实现八通道采集

    ADC0809完成八通道采集 1.ADC0809的概述 1.1芯片特点 1.2引脚介绍 1.3工作过程 2.使用原理图仿真 2.1实验仿真概述 2.2原理图 3.解析原理图 3.1晶振和复位模块 3. ...

  5. ku115上实现adc12dj3200 配置,jesd204b接口,单通道采集模式

    ku115上实现adc12dj3200 配置,jesd204b接口,单通道采集模式,204b设置为8lane,6G采样率,ad和时钟芯片配置代码,完整一套vivado2017.4工程 编号:34300 ...

  6. FPGA udp纯逻辑编写,Xilinx ise14.7平台,工程验证千兆无丢包 加200k128通道采集

    FPGA udp纯逻辑编写,Xilinx ise14.7平台,工程验证千兆无丢包 加200k128通道采集 ID:221000630637522274gaoisgod

  7. 模数转换器ADS1118 四通道采集电压 stm32f103

    模数转换器ADS1118 四通道采集电压 stm32f103 寄存器配置 uint16_t cha0_count=0xD08B;//0xC08B 0xD08B 0xE08B 0xF08B uint16 ...

  8. stm32f103c8t6 AD DMA连续采集8个通道

    AD采集不住,需要在开始采集之前进行校准,校准函数如下: HAL_ADCEx_Calibration_Start(); 时钟设置如下 AD基本8个通道设置 AD DMA 设置 回调函数重写 uint1 ...

  9. 基于DMA通道的连续ADC扫描读取

    ADC ADC即是模数转换器,将电压信号转换为数字信号. 以stm32f407为例,其拥有18个12位ADC转换通道,其中16个外部通道以及俩个内部通道. ADC有单次,连续,扫描或间断模式执行转换, ...

最新文章

  1. 【转载】Asp.Net 全生命周期
  2. linux怎么创建用户教程,在Linux中如何手动创建一个用户
  3. leetcode-26. Remove Duplicates from Sorted Array
  4. 覆盖网络 Flannel 0.7
  5. 运行程序时java后面跟的是文件名对吗_运行程序时java命令后面跟的是文件名。...
  6. 行先知 为您的办公室管理提供方便
  7. 《Adobe Photoshop CS6中文版经典教程》—第1课1.4节在Photoshop中还原操作
  8. JavaScript图片幻灯片显示效果
  9. php递归实现层级树状展开,PHP递归实现层级树状展开,php递归层级树状_PHP教程...
  10. @程序员,你的 996,可能是给公司无能的管理背锅
  11. Daily Report 2012.11.2 刘宇翔
  12. Flash/Flex学习笔记(50):3D线条与填充
  13. CNCF:Kubernetes 已“跨越鸿沟”,逆袭成为主流
  14. 无法打开网上邻居计算机,win7网上邻居在哪 无法访问怎么办【图文】
  15. 【转】performSelector延时调用导致的内存泄露
  16. 关于3dmax模型导入到u3d中时,坐标会旋转的问题
  17. 三菱FX5U系列PLC内置模拟量使用方法和输入输出信号接线
  18. png格式图片 转 icns格式图标
  19. sja1000 CAN驱动学习、调试记录(基于PeliCan Mode)
  20. 查看mysql数据库引擎

热门文章

  1. python 获取麦克风声音_如何使用python和ffmpeg或simi读取实时麦克风音频音量
  2. php自动打印小票_服装店专用小票机自带进销存
  3. MySQL 日期时间类型
  4. java实现数据库主键的更新_Java获取数据库自增主键表中插入数据的ID
  5. mysql convertgrp_Mysql中几种sql的常见用法
  6. flask Form表单数据传递与取值
  7. Markdown 添加emoji
  8. 向量距离汇总(连续值与离散值),Latex与Python实现
  9. flutter-dart
  10. C++ 洛谷 P2704 [NOI2001]炮兵阵地