21ic问答首页 - stm32g474 ADC 一直卡在校准
stm32g474 ADC 一直卡在校准
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;
}
您需要登录后才可以回复 登录 | 注册