求助STM8L15xstm8l adc 多通道道连续转换模式问题

stm8s 的ad多通道连续扫描是怎么样设置的? - 其他 - 意法半导体STM32/STM8技术社区
后使用快捷导航没有帐号?
查看: 7719|回复: 4
stm8s 的ad多通道连续扫描是怎么样设置的?
主题帖子积分
新手上路, 积分 120, 距离下一级还需 -70 积分
新手上路, 积分 120, 距离下一级还需 -70 积分
stm8s 的ad多通道连续扫描是怎么样设置的?那位知道有相关文章说明?
主题帖子积分
新手上路, 积分 411, 距离下一级还需 -361 积分
新手上路, 积分 411, 距离下一级还需 -361 积分
RE:stm8s 的ad多通道连续扫描是怎么样设置的?
其实可以在数据手册中找到的,只是不在在同一个地方集中出现,我没看过SYM8的,只知道STM32的,他的是连续模式转换的通道是由ADC_SQR指定的。如果SCAN=1,则开始连续转换后,转换的通道是按照ADC_SQR序列循环步进。
如果SCAN=0,则开始连续转换后,只是转换ADC_SQR中的第一通道。
CONT=0,SCAN=0 单次转换模式(Single conversion mode)
CONT=1,SCAN=0 连续转换模式(Continuous conversion mode)
CONT=0,SCAN=1 扫描转换模式(Scan mode):所有ADC_SQR序列通道转换一次后停止。
CONT=1,SCAN=1 扫描转换模式(Scan mode):所有ADC_SQR序列通道转换一次后,再从第一个通道循环。
不知道对你有帮助不?
主题帖子积分
新手上路, 积分 120, 距离下一级还需 -70 积分
新手上路, 积分 120, 距离下一级还需 -70 积分
回复:stm8s 的ad多通道连续扫描是怎么样设置的?
stm32跟stm8是不一样的,设置方式也不同,
主题帖子积分
新手上路, 积分 411, 距离下一级还需 -361 积分
新手上路, 积分 411, 距离下一级还需 -361 积分
RE:stm8s 的ad多通道连续扫描是怎么样设置的?
哦,那就帮不了你了哦!
主题帖子积分
新手上路, 积分 5, 距离下一级还需 45 积分
新手上路, 积分 5, 距离下一级还需 45 积分
回复:stm8s 的ad多通道连续扫描是怎么样设置的?
回复第 2 楼 于 10:10:16发表:
其实可以在数据手册中找到的,只是不在在同一个地方集中出现,我没看过SYM8的,只知道STM32的,他的是连续模式转换的通道是由ADC_SQR指定的。如果SCAN=1,则开始连续转换后,转换的通道是按照ADC_SQR序列循环步进。
如果SCAN=0,则开始连续转换后,只是转换ADC_SQR中的第一通道。
CONT=0,SCAN=0 单次转换模式(Single conversion mode)
CONT=1,SCAN=0 连续转换模式(Continuous conversion mode)
CONT=0,SCAN=1 扫描转换模式(Scan mode):所有ADC_SQR序列通道转换一次后停止。
CONT=1,SCAN=1 扫描转换模式(Scan mode):所有ADC_SQR序列通道转换一次后,再从第一个通道循环。
不知道对你有帮助不?
CONT=1,SCAN=1 扫描转换模式(Scan mode):所有ADC_SQR序列通道转换一次后,再从第一个通道循环,
我这样设置的,但是程序一直扫描转换AIN0
站长推荐 /1
2016年度 STM32全国巡回研讨会将于日至23日于全国12城市举办,届时将为您呈现STM32最新的产品线和系统解决方案
>>>>报名参加
Tel: 3-8056
备案号: 苏ICP备号-2
Powered by查看: 1311|回复: 0
STM32F4 ADC多通道转换DMA传输
& & & & 本文件主要是实现ADC底层驱动的实现
/* 包含主要头文件 */
#include &adc.h&
/* 定义存储ADC转换结果的内存 */
uint16_t ADC_Val[4];
& & & & 串口1初始化函数
& & & & 参数:无
& & & & 返回值:无
& & & & 波特率:115200
& & & & 停止位:1
& & & & 奇偶校验:无
& & & & 数据位:8
void USART1_Configuration(void)
& & & & /* 定义串口初始化结构体 */
& & & & USART_InitTypeDef& & & & USART_InitS
& & & & /* 开启USART1和GPIOA 的时钟 */
& & & & RCC-&APB2ENR|=RCC_APB2Periph_USART1;
& & & & RCC-&AHB1ENR|=RCC_AHB1Periph_GPIOA;
& & & & /* GPIOA9/A10 复用模式 */
& & & & GPIOA-&MODER|=GPIO_Mode_AF&&2*9|GPIO_Mode_AF&&2*10;
& & & & /* GPIOA9/A10 复用到USART1--TX/RX */
& & & & GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1);
& & & & GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1);
& & & & /* 配置USART结构体 */
& & & & USART_InitStructure.USART_BaudRate=115200; /* 波特率设置为115200Hz,每秒钟传输115200个二进制位 */
& & & & USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_N /* 硬件流失能 */
& & & & USART_InitStructure.USART_Mode=USART_Mode_Tx; /* 设置为发送模式 */
& & & & USART_InitStructure.USART_Parity=USART_Parity_No; /* 不使用奇偶校验 */
& & & & USART_InitStructure.USART_StopBits=USART_StopBits_1;/* 停止位设置为1位 */
& & & & USART_InitStructure.USART_WordLength=USART_WordLength_8b; /* 数据位设置为8位 */
& & & & /* 初始化USART1 */
& & & & USART_Init(USART1,&USART_InitStructure);
& & & & /* 开启USART1 */
& & & & USART_Cmd(USART1,ENABLE);
& & & & 重映射printf
& & & & 参数:待传输字符,文件指针
& & & & 返回值:传输完成测字符串
int fputc( int ch , FILE *f )
& & & & /* 给USART1-&DR 赋值就可以发送 */
& & & & USART1-&DR=
& & & & /* 等到发送完成 */
& & & & while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
& & & & /* 返回发送完成的字符 */
& & & & TIM2初始化函数
& & & & 参数:无
& & & & 返回值:无
& & & & 实现定时1s
& & & & 输出溢出事件
void TIM2_Configuration(void)
& & & & /* 定义TIM初始化结构体 */
& & & & TIM_TimeBaseInitTypeDef& & & & TIM_TimeBaseS
& & & & /* 开启TIM2的时钟 */
& & & & RCC-&APB1ENR|=RCC_APB1Periph_TIM2;
& & & & /* 配置TIM结构体 */
& & & & TIM_TimeBaseStructure.TIM_ClockDivision=0; /* 时钟不分割 */
& & & & TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; /* 向上计数模式 */
& & & & TIM_TimeBaseStructure.TIM_Period=9999; /* 进过9999+1个脉冲就会溢出 */
& & & & TIM_TimeBaseStructure.TIM_Prescaler=8399; /* 时钟分频值为8399+1 */
& & & & TIM_TimeBaseStructure.TIM_RepetitionCounter=0; /* 重复计数器设置为 0 */
& & & & /* 初始化TIM_TimeBase */
& & & & TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
& & & & /* 启动定时器 */
& & & & TIM_Cmd(TIM2,ENABLE);
& & & & /* 输出TIM2溢出事件 */
& & & & TIM_SelectOutputTrigger(TIM2,TIM_TRGOSource_Update);
& & & & DMA--&&ADC_Memory初始化函数
& & & & 参数:无
& & & & 返回值:无
void DMA_ADC_Configuration(void)
& & & & /* 定义DMA初始化结构体 */
& & & & DMA_InitTypeDef& & & & DMA_InitS
& & & & /* 开启DMA时钟 */
& & & & RCC-&AHB1ENR|=RCC_AHB1Periph_DMA2;
& & & & /* 配置DMA结构体 */
& & & & DMA_InitStructure.DMA_Channel = DMA_Channel_2; /* ADC3 在DMA2_Stream0 的通道2 上 */
& & & & DMA_InitStructure.DMA_PeripheralBaseAddr =((uint32_t)&ADC3-&DR); /* 外设地址 */
& & & & DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)ADC_V /* 内存地址 */
& & & & DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToM /* 从外设到内存传输 */
& & & & DMA_InitStructure.DMA_BufferSize =4; /* 传输数据量为4 */
& & & & DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_D/* 外设地址不变 */
& & & & DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_E /* 内存地址自增 */
& & & & DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfW /* 传输单位为16位 */
& & & & DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfW /* 传输单位为16位 */
& & & & DMA_InitStructure.DMA_Mode = DMA_Mode_C /* 循环传输模式 */
& & & & DMA_InitStructure.DMA_Priority = DMA_Priority_H /* 高优先级 */
& & & & DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_D /* 不使用FIFO */
& & & & DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfF /* 不使用FIFO */
& & & & DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_S /* 存储器突发单次传输 */
& & & & DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_S /* 外设突发单次传输 */
& & & & /* 初始化DMA2_Stream0 */
& & & & DMA_Init(DMA2_Stream0, &DMA_InitStructure);
& & & & /* 启动DMA */
& & & & DMA_Cmd(DMA2_Stream0, ENABLE);
& & & & ADCC3 配置
& & & & 参数:无
& & & & 返回值:无
void ADC3_Configuration(void)
& & & & /* 定义ADC控制结构体 */
& & & & ADC_InitTypeDef& & & & ADC_InitS
& & & & ADC_CommonInitTypeDef ADC_CommonInitS
& & & & /* 开启ADC时钟 */
& & & & RCC-&APB2ENR|=RCC_APB2Periph_ADC3;
& & & & /* 开启GPIOF时钟 */
& & & & RCC-&AHB1ENR|=RCC_AHB1Periph_GPIOF;
& & & & /* 初始化GPIOF7/8/9/10 */
& & & & GPIOF-&MODER|=GPIO_Mode_AIN&&2*7|GPIO_Mode_AIN&&2*8|GPIO_Mode_AIN&&2*9|GPIO_Mode_AIN&&2*10;
& & & & /* 初始化所有ADC结构体 */
& & & & ADC_CommonInitStructure.ADC_DMAAccessMode=ADC_DMAAccessMode_1; /* 使用DMA 模式1 */
& & & & ADC_CommonInitStructure.ADC_Mode=ADC_Mode_I /* ADC独立模式 */
& & & & ADC_CommonInitStructure.ADC_Prescaler=ADC_Prescaler_Div2; /* 分频值为2 */
& & & & ADC_CommonInitStructure.ADC_TwoSamplingDelay=ADC_TwoSamplingDelay_5C /* 转换速度为5个周期 */
& & & & /* 初始化所有ADC */
& & & & ADC_CommonInit(&ADC_CommonInitStructure);
& & & & /* 初始化所有ADC3结构体 */
& & & & ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; /* 12位精度 */
& & & & ADC_InitStructure.ADC_ScanConvMode = ENABLE; /* 指定的通道扫描使能 */
& & & & ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; /* 启用连续扫描 */
& & & & ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_N /* 不使用外部促发 */
& & & & ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1; /* 外部触发源 定时器1的PWM输出通道1 */
& & & & ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_R /* 转换数据右对齐 */
& & & & ADC_InitStructure.ADC_NbrOfConversion =4; /* 转换的次数 */
& & & & /* 初始化ADC3 */
& & & & ADC_Init(ADC3, &ADC_InitStructure);
& & & & /* 初始化各个通道 */
& & & & ADC_RegularChannelConfig(ADC3, ADC_Channel_5, 1, ADC_SampleTime_3Cycles); /* 第5通道的转换速度第1 */
& & & & ADC_RegularChannelConfig(ADC3, ADC_Channel_6, 2, ADC_SampleTime_3Cycles); /* 第6通道的转换速度第2 */
& & & & ADC_RegularChannelConfig(ADC3, ADC_Channel_7, 3, ADC_SampleTime_3Cycles); /* 第7通道的转换速度第3 */
& & & & ADC_RegularChannelConfig(ADC3, ADC_Channel_8, 4, ADC_SampleTime_3Cycles); /* 第8通道的转换速度第4 */
& & & & /* 使能ADC3 DMA的请求 */
& & & & ADC_DMARequestAfterLastTransferCmd(ADC3, ENABLE);
& & & & /* Enable ADC3 DMA */
& & & & ADC_DMACmd(ADC3, ENABLE);
& & & & /* Enable ADC3 */
& & & & ADC_Cmd(ADC3, ENABLE);
& & & & & & & & ADC_SoftwareStartConv(ADC3);/* 软件启动ADC3转换 */
& & & & & & & & Delay(1000000);
& & & & & & & & while(RESET == DMA_GetFlagStatus(DMA2_Stream0,DMA_FLAG_TCIF0)); /* 等待转换完成 */
& & & & & & & & printf(&v1=%d\tv2=%d\tv3=%d\tv4=%d\n&,ADC_Val[0],ADC_Val[1],ADC_Val[2],ADC_Val[3]);
Powered by[转载]如何使用STM8S单片机的多通道AD转换
&经过一个多星期的调试,终于成功!先回顾一下知识点,精彩讲解在代码中!
STM8S单片机的A/D结构简介:
&& 具有ADC1
ADC2(部分型号没有ADC2)最多提供16个转换通道,A/D转换的各个通道可以执行单次和连续的转换模式。
1.电压0到V
2.在64和80引脚封装的有独立的Vref,其他的封装形式Vref连接在Vdda
3.续转换形式;
4.时间14个时钟周期;
5.10位转换精度;
6.产生转换结束中断;
ADC1结构图
编程中注意的知识点:
过置位ADC_CR1寄存器的
ADON位来开启ADC。当首次置位ADON位时,ADC从低功耗模式唤醒。为了启动转换必须第二次使用写指令来置ADC_CR1寄存器的ADON
位。在转换结束时ADC会保持在上电状态,用户只需要置位ADON位一次来启动下一次的转换。
如果长时间没有使用ADC,推荐将ADC模块切换到低功耗模式来降低功耗,这可以通过清零 ADON
位来实现。ADC模块上电后,所选通道对应的I/O口输出模块是被禁用的。因此推荐在ADC上电之前要选择合适的ADC转换通道。
如果单次模式在单次转换模式中,ADC仅在由ADC_CSR寄存器的CH[3:0]选定的通道上完成一次转换。该模式是在当CONT位为0时通过置位ADC_CR1寄存器的ADON位来启动的。
一旦转换完成,转换后的数据存储在ADC_DR寄存器中,EOC(转换结束)标志被置EOCIE 被置位将产生一个中断。
代码如下:
#include "adc.h"
&u16& TempADC;
void ADC_Config(void)&
&&& ADC_CR1
|= 0x01;&&&
//开始启动初始化必须启动一次
&&&&&&&&&&&&&&&&&&&&&&&
//第一次写1,ADC从低功耗唤醒,第二次写1,启动ADC转换
&& //ADC_CR1 |= 0x20;
//使能转换结束中断,本例中采用的查询方式。
uint16_t Get_ADCCH_Value(ADC1_Channel_TypeDef ADC_Channel)
ADC1_Init(ADC1_CONVERSIONMODE_CONTINUOUS,ADC_Channel,
ADC1_PRESSEL_FCPU_D2,
ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_ALL,
//你也可以用操作寄存器的方式代码如下,但未验证。
0x00;&&&&&&&&&&&&
// A/D结果数据左对齐
CLK_PCKENR2 |=
0x08;&&&&&&&
// 使能fMASTER与ADC的连接
ADC_CR1 = 0x00;// ADC时钟=主时钟/2=8MHz,单次转换模式
0x01;&&&&&&&&&&&&
// 选择通道2
ADC_TDRL =
0x01;&&&&&&&&&&&
// 禁止施密特触发功能&
ADC_TDRH = 0x01;
ADC_CR1 = 0x03; //2分频,连续转换,启动ADC
ADC_CR2 = 0x31; //外部事件保留,数据右对齐,禁止扫描模式,
ADC_CSR|= 0x01; //选择通道1
&ADC1_ConversionConfig(ADC1_CONVERSIONMODE_CONTINUOUS,
ADC_Channel,ADC1_ALIGN_RIGHT);
ADC_CR1 |=
0x01;&&&&&
//开始启动转换
while(!(ADC_CSR &
0x80));&& //等待转换结束
&&& return
ADC1_GetConversionValue(); //返回ADC结果
//这个初始化代码很重要,不能省,每次切换通道都要初始化一次!
在main函数中直接调用即可:
& TempADC=Get_ADCCH_Value(ADC1_CHANNEL_1);
//获取AD转化值
& WetADC=Get_ADCCH_Value(ADC1_CHANNEL_3;
//获取AD转化值
&到此结束!开始你的代码快乐之旅吧~~~~
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。stm32 单通道ADC配置和单ADC多通道转换配置 - 开源中国社区
当前访客身份:游客 [
当前位置:
发布于 日 17时,
stm32&单通道ADC配置和单ADC多通道转换配置描述blog:http://my.oschina.net/u/2255341/blog/502869
代码片段(2)
adc.c&~&7KB&&&&
#include "adc.h"
#define ADC1_DR_Address
((uint32_t)0xx4c)
volatile uint16_t ADC_ConvertedV
如果你想改变通道,如果这个通道还在ADC1上,那么只需改写两处:
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_55Cycles5);
* 函数名:ADC1_GPIO_Config
:使能ADC1和DMA1的时钟,初始化PC.00
:内部调用
static void ADC1_GPIO_Config(void)
GPIO_InitTypeDef GPIO_InitS
/* Enable DMA clock */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
/* Enable ADC1 and GPIOC clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | RCC_APB2Periph_GPIOC, ENABLE);
/* Configure PC.01
as analog input */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOC, &GPIO_InitStructure);
// PC1,输入时不用设置速率
/* 函数名:ADC1_Mode_Config
:配置ADC1的工作模式为MDA模式
:内部调用
static void ADC1_Mode_Config(void)
DMA_InitTypeDef DMA_InitS
ADC_InitTypeDef ADC_InitS
/* DMA channel1 configuration */
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_A
DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADC_ConvertedV//内存地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = 1;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_D//外设地址固定
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_D
//内存地址固定
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfW //半字
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfW
DMA_InitStructure.DMA_Mode = DMA_Mode_C
//循环传输
DMA_InitStructure.DMA_Priority = DMA_Priority_H
DMA_InitStructure.DMA_M2M = DMA_M2M_D
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
/* Enable DMA channel1 */
DMA_Cmd(DMA1_Channel1, ENABLE);
/* ADC1 configuration */
ADC_InitStructure.ADC_Mode = ADC_Mode_I //独立ADC模式
ADC_InitStructure.ADC_ScanConvMode = DISABLE ;
//禁止扫描模式,扫描模式用于多通道采集
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //开启连续转换模式,即不停地进行ADC转换
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_N //不使用外部触发转换
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_R
//采集数据右对齐
ADC_InitStructure.ADC_NbrOfChannel = 1;
//要转换的通道数目1
ADC_Init(ADC1, &ADC_InitStructure);
/*配置ADC时钟,为PCLK2的8分频,即9MHz*/
RCC_ADCCLKConfig(RCC_PCLK2_Div8);
/*配置ADC1的通道10为55. 5个采样周期,序列为1 */
ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_55Cycles5);
/* Enable ADC1 DMA */
ADC_DMACmd(ADC1, ENABLE);
/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);
/*复位校准寄存器 */
ADC_ResetCalibration(ADC1);
/*等待校准寄存器复位完成 */
while(ADC_GetResetCalibrationStatus(ADC1));
/* ADC校准 */
ADC_StartCalibration(ADC1);
/* 等待校准完成*/
while(ADC_GetCalibrationStatus(ADC1));
/* 由于没有采用外部触发,所以使用软件触发ADC转换 */
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
* 函数名:ADC1_Init
:外部调用
void ADC1_Init(void) //采样周期为 (1.0/9000000)*(55.5+12.5)=7.5555us
ADC1_GPIO_Config();
ADC1_Mode_Config();
uint16_t ADC1_ConvertedValues[5];
void ADC1S_Init(void)//转换周期 (1/*(12.5+28.5)=3.41us
3.41*5=17.5us
ADC_InitTypeDef ADC_InitS
//ADC初始化结构体
DMA_InitTypeDef DMA_InitS
//DMA初始化结构体
GPIO_InitTypeDef
GPIO_InitS
//GPIO初始化结构体
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
//PLL主时钟(若为72MHz)6分频,作为ADC时钟(12MHz,最大为14MHz)
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);
//使能DMA1时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1
| RCC_APB2Periph_AFIO, ENABLE);
//使能ADC1时钟,和引脚复用时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//使能GPIOA时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4;
//初始化引脚0,1,2,3,4
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
//模拟输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//50MHz引脚输出
GPIO_Init(GPIOA, &GPIO_InitStructure);
//初始化GPIOA
ADC_InitStructure.ADC_Mode = ADC_Mode_I
//ADC工作在独立模式
ADC_InitStructure.ADC_ScanConvMode = ENABLE;
//开启扫描模式
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
//连续转换
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_N//外部触发转换开关关闭
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_R//数据对齐方式,右对齐
ADC_InitStructure.ADC_NbrOfChannel = 5;
//开启5个转换通道
ADC_Init(ADC1, &ADC_InitStructure);
//初始化ADC1
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_28Cycles5);//配置ADC1通道0,转换顺序为第1顺位,采样时间28.5个周期
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_28Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_2, 3, ADC_SampleTime_28Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_3, 4, ADC_SampleTime_28Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 5, ADC_SampleTime_28Cycles5);
ADC_DMACmd(ADC1, ENABLE);
//开启ADC1的DMA通道
ADC_Cmd(ADC1, ENABLE);
//开启ADC1
ADC_ResetCalibration(ADC1);
//复位ADC1的校准寄存器
while(ADC_GetResetCalibrationStatus(ADC1));
//等待复位完成
ADC_StartCalibration(ADC1);
//开始指定ADC1的校准状态
while(ADC_GetCalibrationStatus(ADC1));
//获取状态,若为设置状态则等待
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
//开启ADC1(激活软件触发开始转换)
DMA_DeInit(DMA1_Channel1);
//将DMA的通道1寄存器重设为缺省值
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_A//DMA外设ADC基地址
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC1_ConvertedV //DMA内存基地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
//内存作为数据传输的目的地
DMA_InitStructure.DMA_BufferSize = 5;
//DMA通道的DMA缓存的大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_D//外设地址寄存器不变
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_E //内存地址寄存器递增
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfW//数据宽度为16位
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfW//数据宽度为16位
DMA_InitStructure.DMA_Mode = DMA_Mode_C
//工作在循环缓存模式
DMA_InitStructure.DMA_Priority = DMA_Priority_H
//DMA通道1拥有高优先级
DMA_InitStructure.DMA_M2M = DMA_M2M_D
//DMA通道x没有设置为内存到内存传输
DMA_Init(DMA1_Channel1, &DMA_InitStructure);
//初始化DMA的通道
DMA_Cmd(DMA1_Channel1, ENABLE);
//启动DMA通道
adc.h&~&115B&&&&
#ifndef _ADC_H_
#define _ADC_H_
#include "stm32f10x.h"
void ADC1_Init(void);
void ADC1S_Init(void);
开源中国-程序员在线工具:
相关的代码(99)
开源从代码分享开始
kangxin1234的其它代码STM32 ADC多通道转换实例_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
STM32 ADC多通道转换实例
上传于||文档简介
&&用​A​D​C​连​续​采​集1​路​模​拟​信​号​,​并​由​D​M​A​传​输​到​内​存​。​A​D​C​配​置​为​扫​描​并​且​连​续​转​换​模​式​,​A​D​C​的​时​钟​配​置​为2​M​H​Z​。​在​每​次​转​换​结​束​后​,​由​D​M​A​循​环​将​转​换​的​数​据​传​输​到​内​存​中​。​A​D​C​可​以​连​续​采​集​N​次​求​平​均​值​。​最​后​通​过​串​口​传​输​出​最​后​转​换​的​结​果​。
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
下载文档到电脑,查找使用更方便
还剩4页未读,继续阅读
你可能喜欢

我要回帖

更多关于 stm8l adc 的文章

 

随机推荐