移动网站建设模板,网站快速收录,爬虫搜索引擎,网站开发环境包括什么配置ADC功能时#xff0c;GPIO引脚弄错了#xff0c;P1写成P2#xff0c;但还是配置成功#xff0c;能得到电压数据。
首先一步步排查#xff1a;
既然引脚弄错了#xff0c;那引脚改为正确的引脚#xff0c;能得到数据通过第一步判断#xff0c;GPIO配置似乎是不起作…配置ADC功能时GPIO引脚弄错了P1写成P2但还是配置成功能得到电压数据。
首先一步步排查
既然引脚弄错了那引脚改为正确的引脚能得到数据通过第一步判断GPIO配置似乎是不起作用的那么将GPIO初始化全部注释掉直接进入ADC初始化也是能得到输据。 保证引脚正确改ADC通道能得到电压数据但是数据不正确是其它的引脚的电压数据改了ADC通道对应的引脚自然也发生了变化。
那么经过这么逐一验证后此时有个猜想这意味着在不进行任何GPIO配置的情况下ADC可能仍然能够从这些引脚读取数据。但是查了官方例程以及别人写的代码都是需要进行GPIO配置
官方历程 ADC_DMA
static void ADC_Config(void)
{ADC_InitTypeDef ADC_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;/* ADC1 DeInit */ ADC_DeInit(ADC1);/* GPIOC Periph clock enable */RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);/* ADC1 Periph clock enable */RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);/* Configure ADC Channel11 and channel10 as analog input */
#ifdef USE_STM320518_EVALGPIO_InitStructure.GPIO_Pin GPIO_Pin_1 ;
#elseGPIO_InitStructure.GPIO_Pin GPIO_Pin_0 ;
#endif /* USE_STM320518_EVAL */GPIO_InitStructure.GPIO_Mode GPIO_Mode_AN;GPIO_InitStructure.GPIO_PuPd GPIO_PuPd_NOPULL ;GPIO_Init(GPIOC, GPIO_InitStructure);/* Initialize ADC structure */ADC_StructInit(ADC_InitStructure);/* Configure the ADC1 in continuous mode withe a resolution equal to 12 bits */ADC_InitStructure.ADC_Resolution ADC_Resolution_12b;ADC_InitStructure.ADC_ContinuousConvMode ENABLE; ADC_InitStructure.ADC_ExternalTrigConvEdge ADC_ExternalTrigConvEdge_None;ADC_InitStructure.ADC_DataAlign ADC_DataAlign_Right;ADC_InitStructure.ADC_ScanDirection ADC_ScanDirection_Backward;ADC_Init(ADC1, ADC_InitStructure); /* Convert the ADC1 Channel11 and channel10 with 55.5 Cycles as sampling time */
#ifdef USE_STM320518_EVALADC_ChannelConfig(ADC1, ADC_Channel_11 , ADC_SampleTime_55_5Cycles);
#elseADC_ChannelConfig(ADC1, ADC_Channel_10 , ADC_SampleTime_55_5Cycles);
#endif /* USE_STM320518_EVAL */ /* Convert the ADC1 temperature sensor with 55.5 Cycles as sampling time */ ADC_ChannelConfig(ADC1, ADC_Channel_TempSensor , ADC_SampleTime_55_5Cycles); ADC_TempSensorCmd(ENABLE);/* Convert the ADC1 Vref with 55.5 Cycles as sampling time */ ADC_ChannelConfig(ADC1, ADC_Channel_Vrefint , ADC_SampleTime_55_5Cycles); ADC_VrefintCmd(ENABLE);/* Convert the ADC1 Vbat with 55.5 Cycles as sampling time */ ADC_ChannelConfig(ADC1, ADC_Channel_Vbat , ADC_SampleTime_55_5Cycles); ADC_VbatCmd(ENABLE);/* ADC Calibration */ADC_GetCalibrationFactor(ADC1);/* ADC DMA request in circular mode */ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);/* Enable ADC_DMA */ADC_DMACmd(ADC1, ENABLE); /* Enable the ADC peripheral */ADC_Cmd(ADC1, ENABLE); /* Wait the ADRDY flag */while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADRDY)); /* ADC1 regular Software Start Conv */ ADC_StartOfConversion(ADC1);
}尽管我没有初始化GPIO却发现ADC仍然能够使用。这让我想起GPIO有某种默认的初始状态。然后查找手册发现手册中写了在复位期间及复位刚刚完成后复用功能尚未激活I/O 端口被配置为输入浮空模式。 原来如此了解到I/O端口在复位后被配置为输入浮空模式这让我想到在配置ADC时或许可以不将GPIO专门设置为模拟输入模式而是保持其默认状态。然而我们在学习过程中常被告诫在设置输入模式时应避免使用浮空模式因为它可能会导致不稳定的电平状态。那么让我们回顾一下GPIO的不同输入模式以便更好地理解为什么浮空模式通常不被推荐 浮空输入与上下拉输入的框图与特征
此时输出缓冲被禁用图中的施密特触发器被启用IO脚的数据被采样到数据输入寄存器可被读取。上/下拉电阻根据需要可以被打开或禁用。当上下拉电阻同时被禁用时即为浮空输入模式。
对于STM32芯片复位后GPIO默认为浮空输入状态。对于不使用的GPIO不建议让GPIO处于浮空输入模式。当它没有外接信号时那个施密特触发器往往在随机地做电平翻转跳变从而带来噪声并增加芯片的功耗。同时浮空脚对外部噪声或干扰敏感对过ESD也极为不利。
GPIO的Analog模式(GPIO_AN)的功能框图如下
这个Analog模式的GPIO状态跟上面的带可配置上下拉输入的GPIO状态主要有两个明显差别
那个施密特触发器被关闭了该触发器输出恒为0.内部的上下拉电阻被关闭了。
这个施密特触发器被关闭了GPIO的数字输入功能被取消。如果此时读取输入数据寄存器的值结果恒为0.由于关闭了施密特触发器上面提到的因它而起的电平跳变噪声和相应的额外功耗就没有了。
换句话说当GPIO状态由浮空或上下拉输入状态改为Analog状态时既消除了因为施密特触发器带来的噪声同时又因它的关闭而降低了芯片动态功耗。
另外配置在GPIO_Analog状态的GPIO属于高阻态这点也有利于保持模拟信号的真实性。
GPIO可能被配置为某些模拟外设的复用脚比如ADC,DAC的复用功能脚等但也完全可能不做任何模拟外设的复用脚只是配置在Analog模式而已。比方对于那些不用的管脚我们都可以将其配置为GPIO_Analog状态。做过STM32芯片低功耗应用的人可能会在ST官方例程里发现过在进低功耗模式之前对不用外设的对应GPIO都配置为Analog状态了。 简单来说 在GPIO输入模式下不同的输入方式会影响GPIO引脚的电信号特性具体的区别如下:
模拟输入模拟输入是指将模拟信号连接到GPI0引脚上这种输入方式需要使用ADC(模数转换器)将模拟信号转换为数字信号进行处理。浮空输入浮空输入是指GPIO引脚未连接到任何外部电路此时引脚处于高阻态电平状态不确定。这种方式下GPIO引脚可能因为干扰信号的存在而产生误触发因此应尽量避免使用。下拉输入下拉输入是指将GPIO引脚通过一个下拉电阳连接到地当外部电路未连接时GPIO引脚被下拉到低电平。这种方式下当外部电路未连接时引脚会保持低电平避免误触发。上拉输入上拉输入是指将GPI0引脚通过一个上拉电阻连接到3.3V电源当外部电路未连接时GPIO引脚被上拉到高电平。这种方式下当外部电路未连接时引脚会保持高电平避免误触发。
需要注意的是下拉输入和上拉输入一般用于数字信号的输入而模拟输入则用于模拟信号的输入。同时在使用上拉输入和下拉输入时需要选择合适的电阻值以确保输入信号稳定。
总结ADC配置时还是要注意将引脚的GPIO配置成模拟输入否则容易因为干扰信号的存在而产生误触发。