目录

导言

理论部分

STM32F103C8T6最小系统板

代码初始化步骤

代码部分

一、1个通道PA0

二、2个通道PA0、PA1

三、3个通道PA0、PA1、PA2

四、4个通道PA0~PA3

五、5个通道PA0~PA4

六、6个通道PA0~PA5

七、7个通道PA0~PA6

八、8个通道PA0~PA7

九、9个通道PA0~PA7,PB0

十、10个通道PA0~PA7,PB0、PB1

总结


导言

大家好

本期为大家带来

基于STM32F103C8T6的简单库函数

ADC+DMA转运通道的开启代码

理论部分

首先

得先知道单片机哪个I/O口具有ADC的功能

具体观看如图

STM32F103C8T6最小系统板

(图片来源于网络)

可以看到STMF103C8T6有10个外部的ADC资源I/O口

分别为

PA0,PA1,PA2,PA3,PA4,PA5,PA6,PA7,PB0,PB1

依次对应ADC0~ADC9的十个通道

代码初始化步骤

1.开启时钟(包括ADC1的通道时钟和GPIO口使能时钟以及DMA1时钟)

2.设置ADC分频因子(常用分频6)

3.配置GPIO(模拟输入模式)

4.配置DMA模式

5.使能DMA通道

6.配置ADC1模式

7.设置采用通道

8.使能ADC与DMA的通道

9.使能ADC

10.复位校准状态程序

11.启动ADC软件转换

代码部分

一、1个通道PA0

#include "adc.h"
#include "stm32f10x.h"                  // Device header__IO u16 ADC_ConvertedValue[1];//存储DMA转运数据  /* 初始化ADC */
void ADC1_Init(void)
{//放在最前面可避免版本不同的错误DMA_InitTypeDef DMA_InitStructure;ADC_InitTypeDef ADC_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);     //使能DMA1时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);  //使能ADC1时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能GPIOA时钟  //配置ADCCLK,选择6分频,这时 ADCCLK = APB2/6 = 72MHz/6 = 12MHzRCC_ADCCLKConfig(RCC_PCLK2_Div6);/* GPIO 模式配置 */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                      //GPIO设置为模拟输入GPIO_Init(GPIOA, &GPIO_InitStructure);  /* DMA channel1 模式配置 */DMA_DeInit(DMA1_Channel1);  //指定DMA通道DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;          //设置DMA外设地址DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;        //设置DMA内存地址,ADC转换结果直接放入该地址DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                 //外设为设置为数据传输的来源DMA_InitStructure.DMA_BufferSize = 1;                      //DMA通道的DMA缓存的大小DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;        //外设地址寄存器不变DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;              //内存地址寄存器递增DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;    //数据宽度为16位DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;        //数据宽度为16位DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                  //工作在循环缓存模式DMA_InitStructure.DMA_Priority = DMA_Priority_High;                //DMA通道 x拥有高优先级DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                  //DMA通道x没有设置为内存到内存传输DMA_Init(DMA1_Channel1, &DMA_InitStructure);/* 使能DMA通道 */DMA_Cmd(DMA1_Channel1, ENABLE); /* ADC1 模式配置 */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数据右对齐ADC_InitStructure.ADC_NbrOfChannel = 1;                      //顺序进行规则转换的ADC通道的数目ADC_Init(ADC1, &ADC_InitStructure);/* 设置采样通道 */ ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道0放入序列1,采样时间为55.5周期/* 使能ADC的DMA */ADC_DMACmd(ADC1, ENABLE);  /* 使能ADC1 */ADC_Cmd(ADC1, ENABLE); /* 复位指定的ADC1的校准寄存器*/   ADC_ResetCalibration(ADC1);/* 获取ADC1复位校准寄存器的状态,设置状态则等待 */while(ADC_GetResetCalibrationStatus(ADC1));/* 开始指定ADC1的校准状态 */ADC_StartCalibration(ADC1);/* 获取指定ADC1的校准程序,设置状态则等待 */while(ADC_GetCalibrationStatus(ADC1));/* 启动ADC1软件转换 */ ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}

二、2个通道PA0、PA1

#include "adc.h"
#include "stm32f10x.h"                  // Device header__IO u16 ADC_ConvertedValue[2];//存储DMA转运数据  /* 初始化ADC  */
void ADC1_Init(void)
{//放在前面DMA_InitTypeDef DMA_InitStructure;ADC_InitTypeDef ADC_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);     //使能DMA1时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);  //使能ADC1时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能GPIOA时钟  //配置ADCCLK,选择6分频,这时 ADCCLK = APB2/6 = 72MHz/6 = 12MHzRCC_ADCCLKConfig(RCC_PCLK2_Div6);/* GPIO 模式配置 */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                      //GPIO设置为模拟输入GPIO_Init(GPIOA, &GPIO_InitStructure);  /* DMA channel1 模式配置 */DMA_DeInit(DMA1_Channel1);  //指定DMA通道DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;          //设置DMA外设地址DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;        //设置DMA内存地址,ADC转换结果直接放入该地址DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                 //外设为设置为数据传输的来源DMA_InitStructure.DMA_BufferSize = 2;                      //DMA通道的DMA缓存的大小DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;        //外设地址寄存器不变DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;              //内存地址寄存器递增DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;    //数据宽度为16位DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;        //数据宽度为16位DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                  //工作在循环缓存模式DMA_InitStructure.DMA_Priority = DMA_Priority_High;                //DMA通道 x拥有高优先级DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                  //DMA通道x没有设置为内存到内存传输DMA_Init(DMA1_Channel1, &DMA_InitStructure);/* 使能DMA通道 */DMA_Cmd(DMA1_Channel1, ENABLE); /* ADC1 模式配置 */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数据右对齐ADC_InitStructure.ADC_NbrOfChannel = 2;                      //顺序进行规则转换的ADC通道的数目ADC_Init(ADC1, &ADC_InitStructure);/* 设置采样通道 */ ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道0放入序列1,采样时间为55.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道1放入序列2,采样时间为55.5周期/* 使能ADC的DMA */ADC_DMACmd(ADC1, ENABLE);  /* 使能ADC1 */ADC_Cmd(ADC1, ENABLE); /* 复位指定的ADC1的校准寄存器*/   ADC_ResetCalibration(ADC1);/* 获取ADC1复位校准寄存器的状态,设置状态则等待 */while(ADC_GetResetCalibrationStatus(ADC1));/* 开始指定ADC1的校准状态 */ADC_StartCalibration(ADC1);/* 获取指定ADC1的校准程序,设置状态则等待 */while(ADC_GetCalibrationStatus(ADC1));/* 启动ADC1软件转换 */ ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}

三、3个通道PA0、PA1、PA2


#include "adc.h"
#include "stm32f10x.h"                  // Device header__IO u16 ADC_ConvertedValue[3];//存储DMA转运数据  /* 初始化ADC  */
void ADC1_Init(void)
{//放在前面DMA_InitTypeDef DMA_InitStructure;ADC_InitTypeDef ADC_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);     //使能DMA1时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);  //使能ADC1时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能GPIOA时钟  //配置ADCCLK,选择6分频,这时 ADCCLK = APB2/6 = 72MHz/6 = 12MHzRCC_ADCCLKConfig(RCC_PCLK2_Div6);/* GPIO 模式配置 */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                      //GPIO设置为模拟输入GPIO_Init(GPIOA, &GPIO_InitStructure);  /* DMA channel1 模式配置 */DMA_DeInit(DMA1_Channel1);  //指定DMA通道DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;          //设置DMA外设地址DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;        //设置DMA内存地址,ADC转换结果直接放入该地址DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                 //外设为设置为数据传输的来源DMA_InitStructure.DMA_BufferSize = 3;                      //DMA通道的DMA缓存的大小DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;        //外设地址寄存器不变DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;              //内存地址寄存器递增DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;    //数据宽度为16位DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;        //数据宽度为16位DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                  //工作在循环缓存模式DMA_InitStructure.DMA_Priority = DMA_Priority_High;                //DMA通道 x拥有高优先级DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                  //DMA通道x没有设置为内存到内存传输DMA_Init(DMA1_Channel1, &DMA_InitStructure);/* 使能DMA通道 */DMA_Cmd(DMA1_Channel1, ENABLE); /* ADC1 模式配置 */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数据右对齐ADC_InitStructure.ADC_NbrOfChannel = 3;                      //顺序进行规则转换的ADC通道的数目ADC_Init(ADC1, &ADC_InitStructure);/* 设置采样通道 */ ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道0放入序列1,采样时间为55.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道1放入序列2,采样时间为55.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道2放入序列3,采样时间为55.5周期/* 使能ADC的DMA */ADC_DMACmd(ADC1, ENABLE);  /* 使能ADC1 */ADC_Cmd(ADC1, ENABLE); /* 复位指定的ADC1的校准寄存器*/   ADC_ResetCalibration(ADC1);/* 获取ADC1复位校准寄存器的状态,设置状态则等待 */while(ADC_GetResetCalibrationStatus(ADC1));/* 开始指定ADC1的校准状态 */ADC_StartCalibration(ADC1);/* 获取指定ADC1的校准程序,设置状态则等待 */while(ADC_GetCalibrationStatus(ADC1));/* 启动ADC1软件转换 */ ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}

四、4个通道PA0~PA3


#include "adc.h"
#include "stm32f10x.h"                  // Device header__IO u16 ADC_ConvertedValue[4];//存储DMA转运数据  /* 初始化ADC  */
void ADC1_Init(void)
{//放在前面DMA_InitTypeDef DMA_InitStructure;ADC_InitTypeDef ADC_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);     //使能DMA1时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);  //使能ADC1时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能GPIOA时钟  //配置ADCCLK,选择6分频,这时 ADCCLK = APB2/6 = 72MHz/6 = 12MHzRCC_ADCCLKConfig(RCC_PCLK2_Div6);/* GPIO 模式配置 */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                      //GPIO设置为模拟输入GPIO_Init(GPIOA, &GPIO_InitStructure);  /* DMA channel1 模式配置 */DMA_DeInit(DMA1_Channel1);  //指定DMA通道DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;          //设置DMA外设地址DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;        //设置DMA内存地址,ADC转换结果直接放入该地址DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                 //外设为设置为数据传输的来源DMA_InitStructure.DMA_BufferSize = 4;                      //DMA通道的DMA缓存的大小DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;        //外设地址寄存器不变DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;              //内存地址寄存器递增DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;    //数据宽度为16位DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;        //数据宽度为16位DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                  //工作在循环缓存模式DMA_InitStructure.DMA_Priority = DMA_Priority_High;                //DMA通道 x拥有高优先级DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                  //DMA通道x没有设置为内存到内存传输DMA_Init(DMA1_Channel1, &DMA_InitStructure);/* 使能DMA通道 */DMA_Cmd(DMA1_Channel1, ENABLE); /* ADC1 模式配置 */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数据右对齐ADC_InitStructure.ADC_NbrOfChannel = 4;                      //顺序进行规则转换的ADC通道的数目ADC_Init(ADC1, &ADC_InitStructure);/* 设置采样通道 */ ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道0放入序列1,采样时间为55.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道1放入序列2,采样时间为55.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道2放入序列3,采样时间为55.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道3放入序列4,采样时间为55.5周期/* 使能ADC的DMA */ADC_DMACmd(ADC1, ENABLE);  /* 使能ADC1 */ADC_Cmd(ADC1, ENABLE); /* 复位指定的ADC1的校准寄存器*/   ADC_ResetCalibration(ADC1);/* 获取ADC1复位校准寄存器的状态,设置状态则等待 */while(ADC_GetResetCalibrationStatus(ADC1));/* 开始指定ADC1的校准状态 */ADC_StartCalibration(ADC1);/* 获取指定ADC1的校准程序,设置状态则等待 */while(ADC_GetCalibrationStatus(ADC1));/* 启动ADC1软件转换 */ ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}

五、5个通道PA0~PA4


#include "adc.h"
#include "stm32f10x.h"                  // Device header__IO u16 ADC_ConvertedValue[5];//存储DMA转运数据  /* 初始化ADC  */
void ADC1_Init(void)
{//放在前面DMA_InitTypeDef DMA_InitStructure;ADC_InitTypeDef ADC_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);     //使能DMA1时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);  //使能ADC1时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能GPIOA时钟  //配置ADCCLK,选择6分频,这时 ADCCLK = APB2/6 = 72MHz/6 = 12MHzRCC_ADCCLKConfig(RCC_PCLK2_Div6);/* GPIO 模式配置 */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |GPIO_Pin_4;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                      //GPIO设置为模拟输入GPIO_Init(GPIOA, &GPIO_InitStructure);  /* DMA channel1 模式配置 */DMA_DeInit(DMA1_Channel1);  //指定DMA通道DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;          //设置DMA外设地址DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;        //设置DMA内存地址,ADC转换结果直接放入该地址DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                 //外设为设置为数据传输的来源DMA_InitStructure.DMA_BufferSize = 5;                      //DMA通道的DMA缓存的大小DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;        //外设地址寄存器不变DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;              //内存地址寄存器递增DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;    //数据宽度为16位DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;        //数据宽度为16位DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                  //工作在循环缓存模式DMA_InitStructure.DMA_Priority = DMA_Priority_High;                //DMA通道 x拥有高优先级DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                  //DMA通道x没有设置为内存到内存传输DMA_Init(DMA1_Channel1, &DMA_InitStructure);/* 使能DMA通道 */DMA_Cmd(DMA1_Channel1, ENABLE); /* ADC1 模式配置 */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数据右对齐ADC_InitStructure.ADC_NbrOfChannel = 5;                      //顺序进行规则转换的ADC通道的数目ADC_Init(ADC1, &ADC_InitStructure);/* 设置采样通道 */ ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道0放入序列1,采样时间为55.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道1放入序列2,采样时间为55.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道2放入序列3,采样时间为55.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道3放入序列4,采样时间为55.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 5, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道4放入序列5,采样时间为55.5周期/* 使能ADC的DMA */ADC_DMACmd(ADC1, ENABLE);  /* 使能ADC1 */ADC_Cmd(ADC1, ENABLE); /* 复位指定的ADC1的校准寄存器*/   ADC_ResetCalibration(ADC1);/* 获取ADC1复位校准寄存器的状态,设置状态则等待 */while(ADC_GetResetCalibrationStatus(ADC1));/* 开始指定ADC1的校准状态 */ADC_StartCalibration(ADC1);/* 获取指定ADC1的校准程序,设置状态则等待 */while(ADC_GetCalibrationStatus(ADC1));/* 启动ADC1软件转换 */ ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}

六、6个通道PA0~PA5


#include "adc.h"
#include "stm32f10x.h"                  // Device header__IO u16 ADC_ConvertedValue[6];//存储DMA转运数据  /* 初始化ADC  */
void ADC1_Init(void)
{//放在前面DMA_InitTypeDef DMA_InitStructure;ADC_InitTypeDef ADC_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);     //使能DMA1时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);  //使能ADC1时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能GPIOA时钟  //配置ADCCLK,选择6分频,这时 ADCCLK = APB2/6 = 72MHz/6 = 12MHzRCC_ADCCLKConfig(RCC_PCLK2_Div6);/* GPIO 模式配置 */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |GPIO_Pin_4 | GPIO_Pin_5 ;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                      //GPIO设置为模拟输入GPIO_Init(GPIOA, &GPIO_InitStructure);  /* DMA channel1 模式配置 */DMA_DeInit(DMA1_Channel1);  //指定DMA通道DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;          //设置DMA外设地址DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;        //设置DMA内存地址,ADC转换结果直接放入该地址DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                 //外设为设置为数据传输的来源DMA_InitStructure.DMA_BufferSize = 6;                      //DMA通道的DMA缓存的大小DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;        //外设地址寄存器不变DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;              //内存地址寄存器递增DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;    //数据宽度为16位DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;        //数据宽度为16位DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                  //工作在循环缓存模式DMA_InitStructure.DMA_Priority = DMA_Priority_High;                //DMA通道 x拥有高优先级DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                  //DMA通道x没有设置为内存到内存传输DMA_Init(DMA1_Channel1, &DMA_InitStructure);/* 使能DMA通道 */DMA_Cmd(DMA1_Channel1, ENABLE); /* ADC1 模式配置 */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数据右对齐ADC_InitStructure.ADC_NbrOfChannel = 6;                      //顺序进行规则转换的ADC通道的数目ADC_Init(ADC1, &ADC_InitStructure);/* 设置采样通道 */ ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道0放入序列1,采样时间为55.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道1放入序列2,采样时间为55.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道2放入序列3,采样时间为55.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道3放入序列4,采样时间为55.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 5, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道4放入序列5,采样时间为55.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 6, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道5放入序列6,采样时间为55.5周期/* 使能ADC的DMA */ADC_DMACmd(ADC1, ENABLE);  /* 使能ADC1 */ADC_Cmd(ADC1, ENABLE); /* 复位指定的ADC1的校准寄存器*/   ADC_ResetCalibration(ADC1);/* 获取ADC1复位校准寄存器的状态,设置状态则等待 */while(ADC_GetResetCalibrationStatus(ADC1));/* 开始指定ADC1的校准状态 */ADC_StartCalibration(ADC1);/* 获取指定ADC1的校准程序,设置状态则等待 */while(ADC_GetCalibrationStatus(ADC1));/* 启动ADC1软件转换 */ ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}

七、7个通道PA0~PA6


#include "adc.h"
#include "stm32f10x.h"                  // Device header__IO u16 ADC_ConvertedValue[7];//存储DMA转运数据  /* 初始化ADC  */
void ADC1_Init(void)
{//放在前面DMA_InitTypeDef DMA_InitStructure;ADC_InitTypeDef ADC_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);     //使能DMA1时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);  //使能ADC1时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能GPIOA时钟  //配置ADCCLK,选择6分频,这时 ADCCLK = APB2/6 = 72MHz/6 = 12MHzRCC_ADCCLKConfig(RCC_PCLK2_Div6);/* GPIO 模式配置 */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 ;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                      //GPIO设置为模拟输入GPIO_Init(GPIOA, &GPIO_InitStructure);  /* DMA channel1 模式配置 */DMA_DeInit(DMA1_Channel1);  //指定DMA通道DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;          //设置DMA外设地址DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;        //设置DMA内存地址,ADC转换结果直接放入该地址DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                 //外设为设置为数据传输的来源DMA_InitStructure.DMA_BufferSize = 7;                      //DMA通道的DMA缓存的大小DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;        //外设地址寄存器不变DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;              //内存地址寄存器递增DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;    //数据宽度为16位DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;        //数据宽度为16位DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                  //工作在循环缓存模式DMA_InitStructure.DMA_Priority = DMA_Priority_High;                //DMA通道 x拥有高优先级DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                  //DMA通道x没有设置为内存到内存传输DMA_Init(DMA1_Channel1, &DMA_InitStructure);/* 使能DMA通道 */DMA_Cmd(DMA1_Channel1, ENABLE); /* ADC1 模式配置 */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数据右对齐ADC_InitStructure.ADC_NbrOfChannel = 7;                      //顺序进行规则转换的ADC通道的数目ADC_Init(ADC1, &ADC_InitStructure);/* 设置采样通道 */ ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道0放入序列1,采样时间为55.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道1放入序列2,采样时间为55.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道2放入序列3,采样时间为55.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道3放入序列4,采样时间为55.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 5, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道4放入序列5,采样时间为55.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 6, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道5放入序列6,采样时间为55.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 7, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道6放入序列7,采样时间为55.5周期/* 使能ADC的DMA */ADC_DMACmd(ADC1, ENABLE);  /* 使能ADC1 */ADC_Cmd(ADC1, ENABLE); /* 复位指定的ADC1的校准寄存器*/   ADC_ResetCalibration(ADC1);/* 获取ADC1复位校准寄存器的状态,设置状态则等待 */while(ADC_GetResetCalibrationStatus(ADC1));/* 开始指定ADC1的校准状态 */ADC_StartCalibration(ADC1);/* 获取指定ADC1的校准程序,设置状态则等待 */while(ADC_GetCalibrationStatus(ADC1));/* 启动ADC1软件转换 */ ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}

八、8个通道PA0~PA7


#include "adc.h"
#include "stm32f10x.h"                  // Device header__IO u16 ADC_ConvertedValue[8];//存储DMA转运数据  /* 初始化ADC  */
void ADC1_Init(void)
{//放在前面DMA_InitTypeDef DMA_InitStructure;ADC_InitTypeDef ADC_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);     //使能DMA1时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);  //使能ADC1时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能GPIOA时钟  //配置ADCCLK,选择6分频,这时 ADCCLK = APB2/6 = 72MHz/6 = 12MHzRCC_ADCCLKConfig(RCC_PCLK2_Div6);/* GPIO 模式配置 */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 ;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                      //GPIO设置为模拟输入GPIO_Init(GPIOA, &GPIO_InitStructure);  /* DMA channel1 模式配置 */DMA_DeInit(DMA1_Channel1);  //指定DMA通道DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;          //设置DMA外设地址DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;        //设置DMA内存地址,ADC转换结果直接放入该地址DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                 //外设为设置为数据传输的来源DMA_InitStructure.DMA_BufferSize = 8;                      //DMA通道的DMA缓存的大小DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;        //外设地址寄存器不变DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;              //内存地址寄存器递增DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;    //数据宽度为16位DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;        //数据宽度为16位DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                  //工作在循环缓存模式DMA_InitStructure.DMA_Priority = DMA_Priority_High;                //DMA通道 x拥有高优先级DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                  //DMA通道x没有设置为内存到内存传输DMA_Init(DMA1_Channel1, &DMA_InitStructure);/* 使能DMA通道 */DMA_Cmd(DMA1_Channel1, ENABLE); /* ADC1 模式配置 */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数据右对齐ADC_InitStructure.ADC_NbrOfChannel = 8;                      //顺序进行规则转换的ADC通道的数目ADC_Init(ADC1, &ADC_InitStructure);/* 设置采样通道 */ ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道0放入序列1,采样时间为55.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道1放入序列2,采样时间为55.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道2放入序列3,采样时间为55.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道3放入序列4,采样时间为55.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 5, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道4放入序列5,采样时间为55.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 6, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道5放入序列6,采样时间为55.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 7, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道6放入序列7,采样时间为55.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 8, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道7放入序列8,采样时间为55.5周期/* 使能ADC的DMA */ADC_DMACmd(ADC1, ENABLE);  /* 使能ADC1 */ADC_Cmd(ADC1, ENABLE); /* 复位指定的ADC1的校准寄存器*/   ADC_ResetCalibration(ADC1);/* 获取ADC1复位校准寄存器的状态,设置状态则等待 */while(ADC_GetResetCalibrationStatus(ADC1));/* 开始指定ADC1的校准状态 */ADC_StartCalibration(ADC1);/* 获取指定ADC1的校准程序,设置状态则等待 */while(ADC_GetCalibrationStatus(ADC1));/* 启动ADC1软件转换 */ ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}

九、9个通道PA0~PA7,PB0


#include "adc.h"
#include "stm32f10x.h"                  // Device header__IO u16 ADC_ConvertedValue[9];//存储DMA转运数据  /* 初始化ADC  */
void ADC1_Init(void)
{//放在前面DMA_InitTypeDef DMA_InitStructure;ADC_InitTypeDef ADC_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);     //使能DMA1时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);  //使能ADC1时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能GPIOA时钟  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  //使能GPIOB时钟//配置ADCCLK,选择6分频,这时 ADCCLK = APB2/6 = 72MHz/6 = 12MHzRCC_ADCCLKConfig(RCC_PCLK2_Div6);/* GPIO 模式配置 */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 ;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                      //GPIO设置为模拟输入GPIO_Init(GPIOA, &GPIO_InitStructure);  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 ;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                      //GPIO设置为模拟输入GPIO_Init(GPIOB, &GPIO_InitStructure);/* DMA channel1 模式配置 */DMA_DeInit(DMA1_Channel1);  //指定DMA通道DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;          //设置DMA外设地址DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;        //设置DMA内存地址,ADC转换结果直接放入该地址DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                 //外设为设置为数据传输的来源DMA_InitStructure.DMA_BufferSize = 9;                      //DMA通道的DMA缓存的大小DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;        //外设地址寄存器不变DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;              //内存地址寄存器递增DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;    //数据宽度为16位DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;        //数据宽度为16位DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                  //工作在循环缓存模式DMA_InitStructure.DMA_Priority = DMA_Priority_High;                //DMA通道 x拥有高优先级DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                  //DMA通道x没有设置为内存到内存传输DMA_Init(DMA1_Channel1, &DMA_InitStructure);/* 使能DMA通道 */DMA_Cmd(DMA1_Channel1, ENABLE); /* ADC1 模式配置 */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数据右对齐ADC_InitStructure.ADC_NbrOfChannel = 9;                      //顺序进行规则转换的ADC通道的数目ADC_Init(ADC1, &ADC_InitStructure);/* 设置采样通道 */ ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道0放入序列1,采样时间为55.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道1放入序列2,采样时间为55.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道2放入序列3,采样时间为55.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道3放入序列4,采样时间为55.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 5, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道4放入序列5,采样时间为55.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 6, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道5放入序列6,采样时间为55.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 7, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道6放入序列7,采样时间为55.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 8, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道7放入序列8,采样时间为55.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 9, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道8放入序列9,采样时间为55.5周期/* 使能ADC的DMA */ADC_DMACmd(ADC1, ENABLE);  /* 使能ADC1 */ADC_Cmd(ADC1, ENABLE); /* 复位指定的ADC1的校准寄存器*/   ADC_ResetCalibration(ADC1);/* 获取ADC1复位校准寄存器的状态,设置状态则等待 */while(ADC_GetResetCalibrationStatus(ADC1));/* 开始指定ADC1的校准状态 */ADC_StartCalibration(ADC1);/* 获取指定ADC1的校准程序,设置状态则等待 */while(ADC_GetCalibrationStatus(ADC1));/* 启动ADC1软件转换 */ ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}

十、10个通道PA0~PA7,PB0、PB1


#include "adc.h"
#include "stm32f10x.h"                  // Device header__IO u16 ADC_ConvertedValue[10];//存储DMA转运数据  /* 初始化ADC  */
void ADC1_Init(void)
{//放在前面DMA_InitTypeDef DMA_InitStructure;ADC_InitTypeDef ADC_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);     //使能DMA1时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);  //使能ADC1时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能GPIOA时钟  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);  //使能GPIOB时钟//配置ADCCLK,选择6分频,这时 ADCCLK = APB2/6 = 72MHz/6 = 12MHzRCC_ADCCLKConfig(RCC_PCLK2_Div6);/* GPIO 模式配置 */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 ;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                      //GPIO设置为模拟输入GPIO_Init(GPIOA, &GPIO_InitStructure);  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                      //GPIO设置为模拟输入GPIO_Init(GPIOB, &GPIO_InitStructure);/* DMA channel1 模式配置 */DMA_DeInit(DMA1_Channel1);  //指定DMA通道DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;          //设置DMA外设地址DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedValue;        //设置DMA内存地址,ADC转换结果直接放入该地址DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                 //外设为设置为数据传输的来源DMA_InitStructure.DMA_BufferSize = 10;                      //DMA通道的DMA缓存的大小DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;        //外设地址寄存器不变DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;              //内存地址寄存器递增DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;    //数据宽度为16位DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;        //数据宽度为16位DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                  //工作在循环缓存模式DMA_InitStructure.DMA_Priority = DMA_Priority_High;                //DMA通道 x拥有高优先级DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                  //DMA通道x没有设置为内存到内存传输DMA_Init(DMA1_Channel1, &DMA_InitStructure);/* 使能DMA通道 */DMA_Cmd(DMA1_Channel1, ENABLE); /* ADC1 模式配置 */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数据右对齐ADC_InitStructure.ADC_NbrOfChannel = 10;                      //顺序进行规则转换的ADC通道的数目ADC_Init(ADC1, &ADC_InitStructure);/* 设置采样通道 */ ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道0放入序列1,采样时间为55.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道1放入序列2,采样时间为55.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道2放入序列3,采样时间为55.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道3放入序列4,采样时间为55.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 5, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道4放入序列5,采样时间为55.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 6, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道5放入序列6,采样时间为55.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_6, 7, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道6放入序列7,采样时间为55.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 8, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道7放入序列8,采样时间为55.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_8, 9, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道8放入序列9,采样时间为55.5周期ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 10, ADC_SampleTime_55Cycles5); //选择规则组的注入通道.将通道9放入序列10,采样时间为55.5周期/* 使能ADC的DMA */ADC_DMACmd(ADC1, ENABLE);  /* 使能ADC1 */ADC_Cmd(ADC1, ENABLE); /* 复位指定的ADC1的校准寄存器*/   ADC_ResetCalibration(ADC1);/* 获取ADC1复位校准寄存器的状态,设置状态则等待 */while(ADC_GetResetCalibrationStatus(ADC1));/* 开始指定ADC1的校准状态 */ADC_StartCalibration(ADC1);/* 获取指定ADC1的校准程序,设置状态则等待 */while(ADC_GetCalibrationStatus(ADC1));/* 启动ADC1软件转换 */ ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}

总结

对于通道序列的组合还有很多种

代码是灵活的

希望大家都可以用部分死的代码灵活组成新的代码

这是我在学习过程中的一点体会

对于不足,欢迎指正

[基础代码仓库]基于STM32C8T6的库函数ADC模拟+DMA多通道转运代码相关推荐

  1. FPGA零基础学习:基于FPGA的二进制转BCD设计(附代码)

    FPGA零基础学习:基于FPGA的二进制转BCD设计(附代码) 本系列将带来FPGA的系统性学习,从最基本的数字电路基础开始,最详细操作步骤,最直白的言语描述,手把手的"傻瓜式"讲 ...

  2. 玩转树莓派---详解树莓派的系统烧录,基础使用及基于树莓派制作手势控制的小车(附详细代码及演示效果)

    目录 一.写在前面 二.系统实现: Author:qyan.li Date:2022.6.10 Topic:详解树莓派的使用及基于树莓派制作手势控制的小车 Reference:如何给树莓派安装操作系统 ...

  3. 还在自建代码仓库?阿里云 云效 的这款企业级代码管理工具免费、还香!

    代码托管产品是软件研发过程中的必备工具,不少企业在进行代码托管工具选型的时候会选择开源工具自建,然而,开源版本的代码管理工具往往只是提供了基础的代码仓储能力,无法满足企业在安全性.代码质量.权限管控等 ...

  4. createprocess失败代码2_DevOPS | 基于sonarqube、jenkins和gitlab的持续集成代码检查

    在持续集成过程中,针对代码的静态检查一般有两个时间点:一是提交代码的时候.二是提交merge request的时候,如果代码检查不通过,则可以直接拒绝此次代码提交或者合并.下面我们介绍下在常见的dev ...

  5. 基于YOLOv5的手势识别系统(含手势识别数据集+训练代码)

    基于YOLOv5的手势识别系统(含手势识别数据集+训练代码) 目录 基于YOLOv5的手势识别系统(含手势识别数据集+训练代码) 1. 前言 2. 手势识别的方法 (1)基于多目标检测的手势识别方法 ...

  6. Windows下Git使用记录--03 Git GUI与金山快盘组建私人代码仓库进行项目开发

    使用github进行开发的过程中会有一个问题,那就是github不能提供私人的代码仓库,也就是别人完全可以看到你的代码.如果不想别人看到自己的代码,那就得付费购买github的高级服务,或者通过金山快 ...

  7. 同步机无传感滑膜观测器模型加代码 仿真模型+代码(基于28035

    同步机无传感滑膜观测器模型加代码 仿真模型+代码(基于28035),典型的smo+pll方案 代码为实际应用代码,非一般玩票代码可比(非ti例程): 少数文件中文注释 ID:6950062162100 ...

  8. [Git] 裸代码仓库和镜像代码仓库全解

    1.Git init和clone命令对bare和mirror参数的支持 git命令 –bare参数 –mirror参数 git init 支持 不支持 git clone 支持 支持 2.裸代码仓库与 ...

  9. 基于不同STM32库函数的代码性能对比

    前言 ST已经推出了三种库函数,以方便客户快速开发STM32系列MCU.从最早的标准外设驱动库,到后来的Cube HAL,再到Cube LL以及直接操作寄存器.这几种库的代码效率到底如何呢?本文将针对 ...

最新文章

  1. Neutron L2Populate
  2. 求正多边形的面积JAVA_第六章第三十六题(几何:正多边形的面积)(Geometry: area of a regular polygon)...
  3. python123 app下载_Python 逆向抓取 APP 数据
  4. MonoBehaviour.FixedUpdate 固定更新
  5. 基于 IdentityServer3 实现 OAuth 2.0 授权服务【密码模式(Resource Owner Password Credentials)】...
  6. thinkPHP仿QQ飞车手游模拟抽奖源码
  7. CIF进口货物流程图_广州进口报关公司阿根廷红酒上海进口清关成本选择聚海
  8. WordPress本地运行,PhpStudy中MySQL无法启动,数据库无法连接?
  9. php4.0中文手册,服务 — CodeIgniter 4.0.0 中文手册|用户手册|用户指南|中文文档
  10. linux进程(线程间)间通信-eventfd
  11. 计算机科学导论大一论文,《计算机科学导论论文.doc
  12. 富士施乐3065扫描教程_富士施乐怎么设置扫描到PC
  13. C语言中求大于M10个最大素数,全国计算机二级C语言上机题库—南开100题
  14. 保存书店每日交易记录程序设计
  15. 1024 程序员节,拿个勋章
  16. 什么叫做项目孵化_什么是创业孵化园,孵化基地的五大要素有哪些?
  17. Zabbix自动发现和自动注册
  18. 春款童装产品做短视频营销应该怎么做?短视频营销策略分析
  19. A Game of Thrones(23)
  20. ubuntu16.04下ORB_SLAM2的配置

热门文章

  1. POWER BI里如何累计求和(一)
  2. CCNA(十五)思科ACL、NAT配置命令
  3. iOS9.x-10.x可以实现永久越狱啦
  4. oracle数据库所在主机内存耗尽
  5. linux bt测试命令,Android命令行测试BT,WIFI,Sensor工作状态
  6. php在线投稿审稿系统,化学试剂在线投稿审稿系统
  7. Java学习第一周(2.20~2.24)
  8. 他是阿里年头最久的越南小二,从中供铁军学到地推秘诀
  9. 在树莓派(Linux)上使用FTDI的usb转串口芯片ft232两种驱动方式(VCP和D2xx)
  10. 通过JDBC-ODBC连接SQL Server数据库