STM32F3系列的ADC具有高性能与低功耗的特征,本文以STM3F301C8T6为例。
该芯片的ADC具有AHB总线,允许快速数据处理;且ADC接口转换时间与AHB总线频率,独立。说,该系列的ADC可以频率,12位准确在快速通道下可以达到0.19μs的转换时间,慢低速通道也可以达到0.21μs。低精下(如10位)转换时间0.16微秒。有自恢复以及短期时间等其他STM32系列ADC通有的功能。
钟
STM32F301x6 / 8系列具有双时钟域结构,即表示ADC是从AHB总线独立出来的,所以ADC可以由两个单独的时钟源输入:
a)ADC 可以是一个特定的频率源,命名为“ADCxy_CK(xy=12或34),与AHB独立且异步。它在RCC中配置,可以提供高达72MHz的频率(PLL输出)。要选择这个方案,ADCx_CCR1:0】必须置0。该选项具有ADC频率可以达到最大的优点,无论选择AHB是。除以一次系数进行分频:1、2、4、6、8、12、16、32 、64、128、256
b)可从ADC总线接口的ADC名称,除以一个44444444444模式下的系数。根据方案。[1:0]这种1、2模式的选择法的除法因素(1、2或4 )选择这个,ADCx_CCR 匹配的CKMODE[1:0]必须与“00”不同该选项具有智能域重同步的优点当ADC由触发和应用程序要求ADC触发且无任何特殊位性时非常特殊。
电压出口
开始ADC操作前需要进行以下操作:
使ADC能内部电压恢复器
启动必须提前或启用ADC之前,软件等待ADC电压调节器的启动时间(TADCVREG_STUB)。
时间必须通过软件实现。在最坏的工艺/温度/电源情况下TADCVREG_STUB等于10μs。
转换时间
开始和转换转换时间是配置的结束时间输入转换数据可能的逐次逼近时间:
外部触发和请求
如果EXTEN[1:转换控制位(规则转换)或JEXTEN[1:0]位(注注转换)“0b00”不同,则外部事件能够触发场合的转换。当软件ADSTART置1,转换有效;当软件将位JADSTART置1,则注入转换选择有效。
注:外部中断线11触发为事件6—EXT6
代码
adc.h
#ifndef __ADC_H
#define __ADC_H
#include 《stm32f30x.h》
#define ADC1_IN3_PORT GPIOA
#define ADC1_IN3_PIN GPIO_Pin_2
void Adc_Init(void);
#万一
adc.c
#include “adc.h”
#include “delay.h”
void Adc_Init(void)
{
/*定义结构变量*/
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;
/* 使能 ADC1 时钟 */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_ADC12,使能);
/* 配置ADC时钟*/
/*配置ADC 时钟为PLL时钟*/
RCC_ADCCLKConfig(RCC_ADC12PLLCLK_Div1);
/*配置GPIO为PA2,Pin3模拟输入*/
GPIO_InitStructure.GPIO_Pin = ADC1_IN3_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
GPIO_Init(ADC1_IN3_PORT,&GPIO_InitStructure);
/*默认初始化ADC结构体*/
ADC_StructInit(&ADC_InitStructure);
/* 校准程序 */
ADC_VoltageRegulatorCmd(ADC1,使能);
delay_us(10);
/*ADC_CalibrationMode_Single:选择单通道校准*/
ADC_SelectCalibrationMode(ADC1,ADC_CalibrationMode_Single);
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));//等待完成
//ADC_CommonInitTypeDef主要为混合ADC配置,我们只需要配置ADC为独立模式和异步目录目录
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;//独立模式
ADC_CommonInitStructure.ADC_Clock = ADC_Clock_AsynClkMode; //ADC异步时钟模式
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
ADC_CommonInitStructure.ADC_DMAMode = ADC_DMAMode_OneShot;
ADC_CommonInitStructure.ADC_TwoSamplingDelay = 0;
ADC_CommonInit(ADC1, &ADC_CommonInitStructure);
ADC_InitStructure.ADC_ContinuousConvMode = ADC_ContinuousConvMode_Disable;//连续转换失能
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; //精确为12位
//外部触发事件6,即EXTI11中断线
ADC_InitStructure.ADC_ExternalTrigConvEvent = ADC_ExternalTrigConvEvent_6;
//外部事件上升沿触发,也有下降沿,需要与EXTI
ADC_InitStructure.ADC_ExternalTrigEventEdge = ADC_ExternalTrigEventEdge_RisingEdge;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //数据右卫星
ADC_InitStructure.ADC_OverrunMode = ADC_OverrunMode_Disable;
ADC_InitStructure.ADC_AutoInjMode = ADC_AutoInjec_Disable;
ADC_InitStructure.ADC_NbrOfRegChannel = 1;//要转换的ADC通道数
ADC_Init(ADC1, &ADC_InitStructure);
/* 规则通道参数,设置指定ADC的规则通道,一个序列,采样时间:ADC1通道3,采样时间1.5个周期*/
ADC_RegularChannelConfig(ADC1,ADC_Channel_3,1,ADC_SampleTime_1Cycles5);
//使能ADC1
ADC_Cmd(ADC1,使能);
/* 等待地址 */
而(!ADC_GetFlagStatus(ADC1,ADC_FLAG_RDY));
}
exti.h
#ifndef __EXTI_H
#define __EXTI_H
#include 《stm32f30x.h》
#define TRIG_PORT GPIOB
#define TRIG_PIN GPIO_Pin_11
extern void Exti_Init(void);
#万一
exti.c
#include “exti.h”
void Exti_Init(void)
{
/* 私有变量---------------------------------------------- -----------*/
EXTI_InitTypeDef EXTI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
/* 使能 GPIOB 时钟 */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,启用);
/* 使能 SYSCFG 时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,启用);
/* 在输入非拉模式下配置 PB11 引脚 */
GPIO_InitStructure.GPIO_Pin = TRIG_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(TRIG_PORT, &GPIO_InitStructure);
/* 将 EXTI11 线连接到 PB11 引脚 */
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB,EXTI_PinSource11);
/* 配置EXTI11线路*/
EXTI_InitStructure.EXTI_Line = EXTI_Line11;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Event;//配置为事件模式发酵
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;//上升沿触发触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
:即使用外部触发,仍需先ADSTART位置1方可开启转换,可使用_Start_Start转换设置将ADC,注意事项如下图所示:
之后写的main.c测试视频,可自己一定时间给GPIOx(X = A
主文件
#include “adc.h”
#include “exti.h”
#include “delay.h”
#include “usart.h”
int main(空)
{
浮动 ADC1ConvertedValue;
延迟初始化();
Exti_Init();
Adc_Init();
usart_init();
ADC_StartConversion(ADC1);//开启ADC1转换
同时(1)
{
而(ADC_GetFlagStatus(ADCx,ADC_FLAG_EOC) == RESET);
/*参考电压为3.3V,12位精度为0xFFF*/
ADC1ConvertedValue =ADC_GetConversionValue(ADC1)*3.3/0xFFF;
}
返回0;
}
STM32F3系列的ADC具有高性能与低功耗的特征,本文以STM3F301C8T6为例。
该芯片的ADC具有AHB总线,允许快速数据处理;且ADC接口转换时间与AHB总线频率,独立。说,该系列的ADC可以频率,12位准确在快速通道下可以达到0.19μs的转换时间,慢低速通道也可以达到0.21μs。低精下(如10位)转换时间0.16微秒。有自恢复以及短期时间等其他STM32系列ADC通有的功能。
钟
STM32F301x6 / 8系列具有双时钟域结构,即表示ADC是从AHB总线独立出来的,所以ADC可以由两个单独的时钟源输入:
a)ADC 可以是一个特定的频率源,命名为“ADCxy_CK(xy=12或34),与AHB独立且异步。它在RCC中配置,可以提供高达72MHz的频率(PLL输出)。要选择这个方案,ADCx_CCR1:0】必须置0。该选项具有ADC频率可以达到最大的优点,无论选择AHB是。除以一次系数进行分频:1、2、4、6、8、12、16、32 、64、128、256
b)可从ADC总线接口的ADC名称,除以一个44444444444模式下的系数。根据方案。[1:0]这种1、2模式的选择法的除法因素(1、2或4 )选择这个,ADCx_CCR 匹配的CKMODE[1:0]必须与“00”不同该选项具有智能域重同步的优点当ADC由触发和应用程序要求ADC触发且无任何特殊位性时非常特殊。
电压出口
开始ADC操作前需要进行以下操作:
使ADC能内部电压恢复器
启动必须提前或启用ADC之前,软件等待ADC电压调节器的启动时间(TADCVREG_STUB)。
时间必须通过软件实现。在最坏的工艺/温度/电源情况下TADCVREG_STUB等于10μs。
转换时间
开始和转换转换时间是配置的结束时间输入转换数据可能的逐次逼近时间:
外部触发和请求
如果EXTEN[1:转换控制位(规则转换)或JEXTEN[1:0]位(注注转换)“0b00”不同,则外部事件能够触发场合的转换。当软件ADSTART置1,转换有效;当软件将位JADSTART置1,则注入转换选择有效。
注:外部中断线11触发为事件6—EXT6
代码
adc.h
#ifndef __ADC_H
#define __ADC_H
#include 《stm32f30x.h》
#define ADC1_IN3_PORT GPIOA
#define ADC1_IN3_PIN GPIO_Pin_2
void Adc_Init(void);
#万一
adc.c
#include “adc.h”
#include “delay.h”
void Adc_Init(void)
{
/*定义结构变量*/
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;
/* 使能 ADC1 时钟 */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_ADC12,使能);
/* 配置ADC时钟*/
/*配置ADC 时钟为PLL时钟*/
RCC_ADCCLKConfig(RCC_ADC12PLLCLK_Div1);
/*配置GPIO为PA2,Pin3模拟输入*/
GPIO_InitStructure.GPIO_Pin = ADC1_IN3_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
GPIO_Init(ADC1_IN3_PORT,&GPIO_InitStructure);
/*默认初始化ADC结构体*/
ADC_StructInit(&ADC_InitStructure);
/* 校准程序 */
ADC_VoltageRegulatorCmd(ADC1,使能);
delay_us(10);
/*ADC_CalibrationMode_Single:选择单通道校准*/
ADC_SelectCalibrationMode(ADC1,ADC_CalibrationMode_Single);
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));//等待完成
//ADC_CommonInitTypeDef主要为混合ADC配置,我们只需要配置ADC为独立模式和异步目录目录
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;//独立模式
ADC_CommonInitStructure.ADC_Clock = ADC_Clock_AsynClkMode; //ADC异步时钟模式
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
ADC_CommonInitStructure.ADC_DMAMode = ADC_DMAMode_OneShot;
ADC_CommonInitStructure.ADC_TwoSamplingDelay = 0;
ADC_CommonInit(ADC1, &ADC_CommonInitStructure);
ADC_InitStructure.ADC_ContinuousConvMode = ADC_ContinuousConvMode_Disable;//连续转换失能
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; //精确为12位
//外部触发事件6,即EXTI11中断线
ADC_InitStructure.ADC_ExternalTrigConvEvent = ADC_ExternalTrigConvEvent_6;
//外部事件上升沿触发,也有下降沿,需要与EXTI
ADC_InitStructure.ADC_ExternalTrigEventEdge = ADC_ExternalTrigEventEdge_RisingEdge;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //数据右卫星
ADC_InitStructure.ADC_OverrunMode = ADC_OverrunMode_Disable;
ADC_InitStructure.ADC_AutoInjMode = ADC_AutoInjec_Disable;
ADC_InitStructure.ADC_NbrOfRegChannel = 1;//要转换的ADC通道数
ADC_Init(ADC1, &ADC_InitStructure);
/* 规则通道参数,设置指定ADC的规则通道,一个序列,采样时间:ADC1通道3,采样时间1.5个周期*/
ADC_RegularChannelConfig(ADC1,ADC_Channel_3,1,ADC_SampleTime_1Cycles5);
//使能ADC1
ADC_Cmd(ADC1,使能);
/* 等待地址 */
而(!ADC_GetFlagStatus(ADC1,ADC_FLAG_RDY));
}
exti.h
#ifndef __EXTI_H
#define __EXTI_H
#include 《stm32f30x.h》
#define TRIG_PORT GPIOB
#define TRIG_PIN GPIO_Pin_11
extern void Exti_Init(void);
#万一
exti.c
#include “exti.h”
void Exti_Init(void)
{
/* 私有变量---------------------------------------------- -----------*/
EXTI_InitTypeDef EXTI_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
/* 使能 GPIOB 时钟 */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB,启用);
/* 使能 SYSCFG 时钟 */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,启用);
/* 在输入非拉模式下配置 PB11 引脚 */
GPIO_InitStructure.GPIO_Pin = TRIG_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(TRIG_PORT, &GPIO_InitStructure);
/* 将 EXTI11 线连接到 PB11 引脚 */
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB,EXTI_PinSource11);
/* 配置EXTI11线路*/
EXTI_InitStructure.EXTI_Line = EXTI_Line11;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Event;//配置为事件模式发酵
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;//上升沿触发触发
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
:即使用外部触发,仍需先ADSTART位置1方可开启转换,可使用_Start_Start转换设置将ADC,注意事项如下图所示:
之后写的main.c测试视频,可自己一定时间给GPIOx(X = A
主文件
#include “adc.h”
#include “exti.h”
#include “delay.h”
#include “usart.h”
int main(空)
{
浮动 ADC1ConvertedValue;
延迟初始化();
Exti_Init();
Adc_Init();
usart_init();
ADC_StartConversion(ADC1);//开启ADC1转换
同时(1)
{
而(ADC_GetFlagStatus(ADCx,ADC_FLAG_EOC) == RESET);
/*参考电压为3.3V,12位精度为0xFFF*/
ADC1ConvertedValue =ADC_GetConversionValue(ADC1)*3.3/0xFFF;
}
返回0;
}
举报