[基础代码仓库]基于STM32C8T6的库函数ADC模拟+DMA多通道转运代码
目录
导言
理论部分
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多通道转运代码相关推荐
- FPGA零基础学习:基于FPGA的二进制转BCD设计(附代码)
FPGA零基础学习:基于FPGA的二进制转BCD设计(附代码) 本系列将带来FPGA的系统性学习,从最基本的数字电路基础开始,最详细操作步骤,最直白的言语描述,手把手的"傻瓜式"讲 ...
- 玩转树莓派---详解树莓派的系统烧录,基础使用及基于树莓派制作手势控制的小车(附详细代码及演示效果)
目录 一.写在前面 二.系统实现: Author:qyan.li Date:2022.6.10 Topic:详解树莓派的使用及基于树莓派制作手势控制的小车 Reference:如何给树莓派安装操作系统 ...
- 还在自建代码仓库?阿里云 云效 的这款企业级代码管理工具免费、还香!
代码托管产品是软件研发过程中的必备工具,不少企业在进行代码托管工具选型的时候会选择开源工具自建,然而,开源版本的代码管理工具往往只是提供了基础的代码仓储能力,无法满足企业在安全性.代码质量.权限管控等 ...
- createprocess失败代码2_DevOPS | 基于sonarqube、jenkins和gitlab的持续集成代码检查
在持续集成过程中,针对代码的静态检查一般有两个时间点:一是提交代码的时候.二是提交merge request的时候,如果代码检查不通过,则可以直接拒绝此次代码提交或者合并.下面我们介绍下在常见的dev ...
- 基于YOLOv5的手势识别系统(含手势识别数据集+训练代码)
基于YOLOv5的手势识别系统(含手势识别数据集+训练代码) 目录 基于YOLOv5的手势识别系统(含手势识别数据集+训练代码) 1. 前言 2. 手势识别的方法 (1)基于多目标检测的手势识别方法 ...
- Windows下Git使用记录--03 Git GUI与金山快盘组建私人代码仓库进行项目开发
使用github进行开发的过程中会有一个问题,那就是github不能提供私人的代码仓库,也就是别人完全可以看到你的代码.如果不想别人看到自己的代码,那就得付费购买github的高级服务,或者通过金山快 ...
- 同步机无传感滑膜观测器模型加代码 仿真模型+代码(基于28035
同步机无传感滑膜观测器模型加代码 仿真模型+代码(基于28035),典型的smo+pll方案 代码为实际应用代码,非一般玩票代码可比(非ti例程): 少数文件中文注释 ID:6950062162100 ...
- [Git] 裸代码仓库和镜像代码仓库全解
1.Git init和clone命令对bare和mirror参数的支持 git命令 –bare参数 –mirror参数 git init 支持 不支持 git clone 支持 支持 2.裸代码仓库与 ...
- 基于不同STM32库函数的代码性能对比
前言 ST已经推出了三种库函数,以方便客户快速开发STM32系列MCU.从最早的标准外设驱动库,到后来的Cube HAL,再到Cube LL以及直接操作寄存器.这几种库的代码效率到底如何呢?本文将针对 ...
最新文章
- Neutron L2Populate
- 求正多边形的面积JAVA_第六章第三十六题(几何:正多边形的面积)(Geometry: area of a regular polygon)...
- python123 app下载_Python 逆向抓取 APP 数据
- MonoBehaviour.FixedUpdate 固定更新
- 基于 IdentityServer3 实现 OAuth 2.0 授权服务【密码模式(Resource Owner Password Credentials)】...
- thinkPHP仿QQ飞车手游模拟抽奖源码
- CIF进口货物流程图_广州进口报关公司阿根廷红酒上海进口清关成本选择聚海
- WordPress本地运行,PhpStudy中MySQL无法启动,数据库无法连接?
- php4.0中文手册,服务 — CodeIgniter 4.0.0 中文手册|用户手册|用户指南|中文文档
- linux进程(线程间)间通信-eventfd
- 计算机科学导论大一论文,《计算机科学导论论文.doc
- 富士施乐3065扫描教程_富士施乐怎么设置扫描到PC
- C语言中求大于M10个最大素数,全国计算机二级C语言上机题库—南开100题
- 保存书店每日交易记录程序设计
- 1024 程序员节,拿个勋章
- 什么叫做项目孵化_什么是创业孵化园,孵化基地的五大要素有哪些?
- Zabbix自动发现和自动注册
- 春款童装产品做短视频营销应该怎么做?短视频营销策略分析
- A Game of Thrones(23)
- ubuntu16.04下ORB_SLAM2的配置
热门文章
- POWER BI里如何累计求和(一)
- CCNA(十五)思科ACL、NAT配置命令
- iOS9.x-10.x可以实现永久越狱啦
- oracle数据库所在主机内存耗尽
- linux bt测试命令,Android命令行测试BT,WIFI,Sensor工作状态
- php在线投稿审稿系统,化学试剂在线投稿审稿系统
- Java学习第一周(2.20~2.24)
- 他是阿里年头最久的越南小二,从中供铁军学到地推秘诀
- 在树莓派(Linux)上使用FTDI的usb转串口芯片ft232两种驱动方式(VCP和D2xx)
- 通过JDBC-ODBC连接SQL Server数据库