新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > stm32 ADC 非DMA方式

        stm32 ADC 非DMA方式

        作者: 時間:2016-11-17 來源:網絡 收藏
        搞了一個下午和晚上,搞明白,不用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
        voidadcGPIOConfig(void)
        {
        GPIO_InitTypeDefgpioInitStruct;

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能PortA時鐘
        gpioInitStruct.GPIO_Speed=GPIO_Speed_2MHz;
        gpioInitStruct.GPIO_Pin=GPIO_Pin_4;
        gpioInitStruct.GPIO_Mode=GPIO_Mode_AIN;
        GPIO_Init(GPIOA,&gpioInitStruct);//GPIO口別弄錯
        }

        voidadcModeConfig(void)
        {
        ADC_InitTypeDefadcInitStruct;
        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時鐘

        /*EnableADC1*/
        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);
        }

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

        floatgetPowerAD(void)
        {
        uint16_tADC_ConvertedValue;
        floatADC_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);//清除轉化結束標志位

        returnADC_ConvertedValueLocal;
        }


        關鍵詞: stm32ADC非DMA方

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 津南区| 登封市| 鲁山县| 南平市| 滁州市| 房产| 富阳市| 威信县| 玉田县| 诸城市| 永州市| 大足县| 余庆县| 云阳县| 琼海市| 平邑县| 驻马店市| 龙南县| 额尔古纳市| 云林县| 甘谷县| 兴文县| 镇江市| 察隅县| 长乐市| 平罗县| 合肥市| 教育| 沾化县| 白朗县| 彰武县| 壤塘县| 阿瓦提县| 天门市| 镇坪县| 喀喇| 刚察县| 阜新| 汉沽区| 寻甸| 新和县|