×
单片机 > 单片机程序设计 > 详情

stm32 ADC 非DMA方式

发布时间:2020-05-18 发布时间:
|
搞了一个下午和晚上,搞明白,不用DMA的话,每次采集都要使能一下ADC,不然就一直转化不了。。
 

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
 
void adcGPIOConfig(void)
{
    GPIO_InitTypeDef gpioInitStruct;
    
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能Port A 时钟
    gpioInitStruct.GPIO_Speed = GPIO_Speed_2MHz;
    gpioInitStruct.GPIO_Pin = GPIO_Pin_4;
    gpioInitStruct.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_Init(GPIOA, &gpioInitStruct);                                      //GPIO口别弄错
}

void adcModeConfig(void)
{
    ADC_InitTypeDef adcInitStruct;
    adcInitStruct.ADC_Mode = ADC_Mode_Independent;
    adcInitStruct.ADC_ScanConvMode = DISABLE;
    adcInitStruct.ADC_ContinuousConvMode = DISABLE;//
    adcInitStruct.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    adcInitStruct.ADC_DataAlign = ADC_DataAlign_Right;
    adcInitStruct.ADC_NbrOfChannel = 1;
    ADC_Init(ADC1,&adcInitStruct);
    
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);        //使能ADC1时钟
    
    /* Enable ADC1 */
    ADC_Cmd(ADC1, ENABLE);
    
    /*复位校准寄存器 */   
    ADC_ResetCalibration(ADC1);
    /*等待校准寄存器复位完成 */
    while(ADC_GetResetCalibrationStatus(ADC1));
    
    /* ADC校准 */
    ADC_StartCalibration(ADC1);
    /* 等待校准完成 */
    while(ADC_GetCalibrationStatus(ADC1));
    
    ADC_TempSensorVrefintCmd(ENABLE);
    
    /* 由于没有采用外部触发,所以使用软件触发ADC转换 */ 
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);
}

void adcInit(void)
{
    adcGPIOConfig();
    adcModeConfig();
}

float getPowerAD(void)
{
    uint16_t ADC_ConvertedValue;
    float ADC_ConvertedValueLocal;
    
    ADC_Cmd(ADC1, ENABLE);
    
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);     //使能指定的ADC1的软件转换启动功能 
    
    ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 1, ADC_SampleTime_239Cycles5);    
    
    while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束  

    ADC_ConvertedValue = ADC_GetConversionValue(ADC1);    //返回最近一次ADC1规则组的转换结果  
    
    ADC_ConvertedValueLocal =(float) ADC_ConvertedValue/4096*3.3; // 读取转换的AD值
    
    ADC_ClearFlag(ADC1, ADC_FLAG_EOC);          //清除转化结束标志位
    
    return ADC_ConvertedValueLocal;
}
 


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
浅谈AVR中定时器几种工作模式