打印

GD32F130 ADC死在了校验函数

[复制链接]
2115|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;  
}

使用特权

评论回复
5
tongbu2015| | 2017-4-27 22:30 | 只看该作者
逻辑上存在问题的吧,,校验通不过的就重新取值校验的啦

使用特权

评论回复
6
tongbu2015| | 2017-4-27 22:30 | 只看该作者
不过也得有个校验最大次数的限制的,不让你会一直循环在这里面的。

使用特权

评论回复
7
wzw2134| | 2017-4-28 17:03 | 只看该作者
GD的MCU需要通过代码把ADC时钟限制在14M之内

使用特权

评论回复
8
baimiaocun2015| | 2017-4-29 09:51 | 只看该作者
意思是死在上边的红色部分?这个地方必须是硬件给清除置位的

使用特权

评论回复
9
vibra2016| | 2017-4-29 13:09 | 只看该作者
这个具体的是死在了那一环节的?

使用特权

评论回复
10
smilingangel| | 2017-4-30 12:03 | 只看该作者
这方面的一般都检查下硬件设计的

使用特权

评论回复
11
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

粉丝