这是一个关于在不使用DMA功能的情况下,读取ADC值的问题。《STM32库开发实战指南》和光盘的ADC例程里面,都是用到DMA功能。但是我想知道在没有使用DMA功能的情况下怎样去读取ADC值,我一共有2个不明白的地方。下面是我写的一段代码:
这是ADC.C文件的程序代码
#include "stm32f10x_conf.h"
#define ADC1_DR_Address ((u32)0x40012400+0x4c)
__IO uint16_t ADC_ConvertedValue;
void ADC_Config()
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_ADC1,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;
GPIO_Init(GPIOC,&GPIO_InitStructure);
ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//独立ADC模式
ADC_InitStructure.ADC_ScanConvMode=DISABLE; //禁止扫描模式
ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;//开启连续转换模式
ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//不使用外部中断触发
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//数据右对齐
ADC_InitStructure.ADC_NbrOfChannel=1;//要转换通道数1
ADC_Init(ADC1,&ADC_InitStructure);
RCC_ADCCLKConfig(RCC_PCLK2_DiARM);//配置ADC时钟,为PCLK2的8分频
ADC_RegularChannelConfig(ADC1,ADC_Channel_11,1,ADC_SampleTime_55Cycles5);//配置ADC1通道11为55.5采集周期
ADC_Cmd(ADC1,ENABLE);
ADC_ResetCalibration(ADC1);//复位校准
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);//ADC校准
while(ADC_GetCalibrationStatus(ADC1));
ADC_SoftwareStartConvCmd(ADC1,ENABLE);//使用软件触发
}
问题1:
对于这段代码有几个疑问,程序ADC_SoftwareStartConvCmd(ADC1,ENABLE);是使用软件触发的意思,这个触发是怎么控制的,是需要写某个寄存器,还是说ADC配置成连续转换模式(即ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;)后,就表示ADC转换已经处于软件触发了?如果是软件触发,是不是通过写代码使能或暂停ADC转换,具体是写哪些代码?
问题二:
在不使用DMA的情况下,就像我上面编的那一段代码,要怎样才能获取到ADC的值,我看到有一个
uint16_t ADC_GetConversionValue(ADC_TypeDef* ADCx) 这样的程序。这个程序的返回值是不是就是ADC转换回来的值?
我试过写了一下的代码:
__IO uint16_t ADC_ConvertedValue;
ADC_ConvertedValue=ADC_GetConversionValue(ADC1);
但是ADC_ConvertedValue的值一直是0x0000
我想要的效果是:在不使用DMA功能的情况下,通过软件控制ADC转换一次读一次数值。
需要指导…… |