问答

汇集网友智慧,解决技术难题

21ic问答首页 - stm32g474 ADC 一直卡在校准

STM32 ADC

stm32g474 ADC 一直卡在校准

shuyinhengxie2025-08-04
        RCC->AHB2ENR |= RCC_AHB2ENR_ADC12EN;        /* ADC12 CLK ENABLE */
        RCC->AHB2ENR |= RCC_AHB2ENR_ADC345EN;        /* ADC345 CLK ENABLE */

        ADC12_COMMON->CCR &= ~(ADC_CCR_PRESC);
        ADC12_COMMON->CCR |= (2 << ADC_CCR_PRESC_Pos);  // 4分频

        ADC345_COMMON->CCR &= ~(ADC_CCR_PRESC);
        ADC345_COMMON->CCR |= (2 << ADC_CCR_PRESC_Pos); // 4分频


        RCC->AHB2ENR |= RCC_AHB2ENR_GPIOAEN;  // 使能GPIOA时钟
        RCC->AHB2ENR |= RCC_AHB2ENR_GPIOBEN;  // 使能GPIOB时钟
        RCC->AHB2ENR |= RCC_AHB2ENR_GPIOCEN;  // 使能GPIOC时钟
        RCC->AHB2ENR |= RCC_AHB2ENR_GPIOEEN;  // 使能GPIOE时钟

        GPIOA->MODER |= GPIO_MODER_MODE0 | GPIO_MODER_MODE1 | GPIO_MODER_MODE2 |
                           GPIO_MODER_MODE3;

        GPIOC->MODER |= GPIO_MODER_MODE0 | GPIO_MODER_MODE1 | GPIO_MODER_MODE2 |
                           GPIO_MODER_MODE3;

        GPIOA->PUPDR &= ~(GPIO_PUPDR_PUPDR0 | GPIO_PUPDR_PUPDR1 | GPIO_PUPDR_PUPDR2 | GPIO_PUPDR_PUPDR3);
        GPIOC->PUPDR &= ~(GPIO_PUPDR_PUPDR0 | GPIO_PUPDR_PUPDR1 | GPIO_PUPDR_PUPDR2 | GPIO_PUPDR_PUPDR3);

        ADC1->CR &= ~ADC_CR_DEEPPWD;        /* Disable deep power-down mode */


        ADC1->CR &= ~ADC_CR_ADVREGEN;
        ADC1->CR |= ADC_CR_ADVREGEN;        /*Enabling ADC voltage regulator*/
        HAL_Delay(10);

        ADC1->CFGR = 0;    //初始化ADC 配置寄存器
        ADC1->CFGR         |= ADC_CFGR_OVRMOD           //过载模式许新数据覆盖旧数据
                                | ADC_CFGR_CONT                                // 连续采样
                                | ADC_CFGR_DMAEN        //DMA 使能
                                | ADC_CFGR_DMACFG
                                ;

        ADC1->CFGR2 |= ((0x5<<ADC_CFGR2_OVSR_Pos)        //oversampling: 0:x2, 1:x4, 2:x8, 3:x16, 4:x32, 5:x64, 6:x128, 7:x256
                                | (0x5<<ADC_CFGR2_OVSS_Pos)                //shift: 0:no, 1:1-bit, 2:2-bit, 3:3-bit,..., 8:8-bit
                                | ADC_CFGR2_ROVSE                                        //oversampling enable for regular mode
                                | ADC_CFGR2_BULB                                        //BULB mode enable (precharge)
                                );

    // 规定通道顺序 SQR1先行-- 规定之前先要确定多少位 ADC_SQR1_L_Pos
    ADC1->SQR1 = 0;
    ADC1->SQR2 = 0;
    ADC1->SQR1         |= ((0x7<<ADC_SQR1_L_Pos)            // 8个转换序列 (L[3:0] = 7)
                | (0x6<<ADC_SQR1_SQ1_Pos)                  // 序列1: 通道6 (PC0: Io_Sense_M1)
                | (0x7<<ADC_SQR1_SQ2_Pos)                  // 序列2: 通道7
                | (0x8<<ADC_SQR1_SQ3_Pos)                  // 序列3: 通道8
                | (0x9<<ADC_SQR1_SQ4_Pos));         // 序列4: 通道9

    ADC1->SQR2         |= ((0x1<<ADC_SQR2_SQ5_Pos)          // 序列5: 通道1 (注意:SQ4_Pos对应序列5)
                | (0x2<<ADC_SQR2_SQ6_Pos)                  // 序列6: 通道2
                | (0x3<<ADC_SQR2_SQ7_Pos)                  // 序列7: 通道3
                | (0x4<<ADC_SQR2_SQ8_Pos));         // 序列8: 通道4

        ADC1->SMPR1 |= ((0x05 << ADC_SMPR1_SMP1_Pos) |  // 通道1:640.5周期
                       (0x05 << ADC_SMPR1_SMP2_Pos) |  // 通道2:640.5周期
                       (0x05 << ADC_SMPR1_SMP3_Pos) |
                                   (0x05 << ADC_SMPR1_SMP4_Pos) |
                                   (0x05 << ADC_SMPR1_SMP6_Pos) |
                                   (0x05 << ADC_SMPR1_SMP7_Pos) |
                                   (0x05 << ADC_SMPR1_SMP8_Pos) |
                                   (0x05 << ADC_SMPR1_SMP9_Pos)) ;

        init_err_ocur = AdcCalibProcess(ADC1);

uint16_t AdcCalibProcess(ADC_TypeDef *hadc)
{

        uint32_t lTickStart = 0U;
        uint16_t wIni_error = NO;
        /*Calibration for ADC*/
        hadc->CR &= (~ADC_CR_ADCALDIF);        /*Select calibration mode single ended*/
        hadc->CR |= ADC_CR_ADCAL;                        /*Start ADC calibration*/
        lTickStart = HAL_GetTick();                                        /*Get current Tick value*/
        while(HAL_IS_BIT_SET(hadc->CR, ADC_CR_ADCAL))/*Wait for calibration completion*/
    {
                if((HAL_GetTick() - lTickStart) > 2U)        /*Calibration timeout occur*/
                {
                        wIni_error = YES;
                        return wIni_error;
                }
        }
        return wIni_error;
}






回答 +关注 1
47人浏览 0人回答问题 分享 举报
0 个回答

您需要登录后才可以回复 登录 | 注册