GD32F130 ADC死在了校验函数

[复制链接]
2448|10
 楼主| cug_niubosong 发表于 2017-4-25 09:49 | 显示全部楼层 |阅读模式
本帖最后由 cug_niubosong 于 2017-4-25 09:54 编辑

{
    GPIO_InitPara  GPIO_InitStructure;
    ADC_InitPara   ADC_InitStructure;

    RCC_AHBPeriphClock_Enable(RCC_AHBPERIPH_GPIOB, ENABLE);
   
    GPIO_InitStructure.GPIO_Pin = GPIO_PIN_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_MODE_AN;
    GPIO_InitStructure.GPIO_OType = GPIO_OTYPE_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PUPD_NOPULL;
    GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

    RCC_APB2PeriphClock_Enable( RCC_APB2PERIPH_ADC1, ENABLE);

    ADC_InitStructure.ADC_Mode_Scan = DISABLE;
    ADC_InitStructure.ADC_Mode_Continuous = DISABLE;
    ADC_InitStructure.ADC_Trig_External = ADC_EXTERNAL_TRIGGER_MODE_NONE;
    ADC_InitStructure.ADC_Data_Align = ADC_DATAALIGN_RIGHT;
    ADC_InitStructure.ADC_Channel_Number = 1;
    ADC_Init(&ADC_InitStructure);

    ADC_RegularChannel_Config(ADC_CHANNEL_8,1,ADC_SAMPLETIME_55POINT5);
   
    ADC_Enable(ENABLE);
   
    ADC_Calibration();
}

void ADC_Calibration(void)
{
    /* Reset the selected ADC1 calibration registers */
    ADC1->CTLR2 |= CTLR2_RSTCLB_SET;
    /*Check the RSTCLB bit state */
    while(ADC1->CTLR2 & CTLR2_RSTCLB_SET);
    /* Enable ADC1 calibration process */
    ADC1->CTLR2 |= CTLR2_CLB_SET;
    /* Check the CLB bit state */
    while((ADC1->CTLR2 & CTLR2_CLB_SET) != (u16)RESET);
}
 楼主| cug_niubosong 发表于 2017-4-25 09:51 | 显示全部楼层
也就是置位 CTLR2 寄存器的 RSECLB位,即初始化ADC校验后,一直没有初始化成功,不知道为什么。
 楼主| cug_niubosong 发表于 2017-4-25 09:53 | 显示全部楼层
再有就是把ADC校验初始化的的那两句删除
ADC1->CTLR2 |= CTLR2_RSTCLB_SET;
while(ADC1->CTLR2 & CTLR2_RSTCLB_SET);
直接开始ADC校验
也会一直死在while((ADC1->CTLR2 & CTLR2_CLB_SET) != (u16)RESET);
也就是校验一直过不去

 楼主| cug_niubosong 发表于 2017-4-25 11:21 | 显示全部楼层
加了句ADC时钟函数
    RCC_APB2PeriphClock_Enable( RCC_APB2PERIPH_ADC1, ENABLE);
    RCC_ADCCLKConfig(RCC_ADCCLK_APB2_DIV2);
说明
/**
  * @brief  Configure the ADC clock (ADCCLK).
  * @param  RCC_ADCCLK: specify the ADC clock source. This clock is derived
  *         from the HSI14 or APB2 clock.
  *   This parameter can be one of the following values:
  *     @arg RCC_ADCCLK_HSI14: ADC clock = HSI14 (14MHz)
  *     @arg RCC_ADCCLK_APB2_DIV2: ADC clock = APB2/2
  *     @arg RCC_ADCCLK_APB2_DIV4: ADC clock = APB2/4
  *     @arg RCC_ADCCLK_APB2_DIV6: ADC clock = APB2/6
  *     @arg RCC_ADCCLK_APB2_DIV8: ADC clock = APB2/8      
  * @retval None
  */
void RCC_ADCCLKConfig(uint32_t RCC_ADCCLK)
{
    /* Clear ADCPS bit */
    RCC->GCFGR &= ~RCC_GCFGR_ADCPS;
    /* Set ADCPS bits according to RCC_APB2 value */
    RCC->GCFGR |= RCC_ADCCLK & 0xFFFF;
    /* Clear ADCSEL bit */
    RCC->GCFGR3 &= ~RCC_GCFGR3_ADCSEL;
    /* Set ADCSEL bits according to RCC_ADCCLK value */
    RCC->GCFGR3 |= RCC_ADCCLK >> GCFGR3_HSI14ADC_OFFSET;  
}
tongbu2015 发表于 2017-4-27 22:30 | 显示全部楼层
逻辑上存在问题的吧,,校验通不过的就重新取值校验的啦
tongbu2015 发表于 2017-4-27 22:30 | 显示全部楼层
不过也得有个校验最大次数的限制的,不让你会一直循环在这里面的。
wzw2134 发表于 2017-4-28 17:03 | 显示全部楼层
GD的MCU需要通过代码把ADC时钟限制在14M之内
baimiaocun2015 发表于 2017-4-29 09:51 | 显示全部楼层
意思是死在上边的红色部分?这个地方必须是硬件给清除置位的
vibra2016 发表于 2017-4-29 13:09 | 显示全部楼层
这个具体的是死在了那一环节的?
smilingangel 发表于 2017-4-30 12:03 | 显示全部楼层
这方面的一般都检查下硬件设计的
tongbu2015 发表于 2017-5-7 16:20 | 显示全部楼层
cug_niubosong 发表于 2017-4-25 09:53
再有就是把ADC校验初始化的的那两句删除
ADC1->CTLR2 |= CTLR2_RSTCLB_SET;
while(ADC1->CTLR2 & CTLR2_RST ...

这不是校验不过去吧,,是硬件上就诶达到这个条件的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

16

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部