OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3860|回复: 7

STM32F072 ADC

[复制链接]

12

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2013-12-17
在线时间
36 小时
发表于 2016-7-28 16:33:07 | 显示全部楼层 |阅读模式
10金钱
目前项目用到STM32F072的ADC1通道的0和1路,可是不能转换,不知道是不是我配置哪里有问题,希望用过这个芯片的指教下:void RCC_Configuration(void)
{
     uint16 i_u16Count = 0xFFFF;
//    memcpy((void*)0x20000000, (void*)0x08004000, 0x100);
//    SYSCFG_MemoryRemapConfig(SYSCFG_MemoryRemap_SRAM);
    SystemInit();
    RCC_LSICmd(ENABLE);
    /* Wait till LSI is ready */
    do
    {
        i_u16Count--;
    }while((RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET)&&(i_u16Count>0));  
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_ADC1
                            | RCC_APB2Periph_SYSCFG, ENABLE );
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 | RCC_APB1Periph_CAN
                            | RCC_APB1Periph_DAC | RCC_APB1Periph_PWR, ENABLE );
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA | RCC_AHBPeriph_GPIOB
                         | RCC_AHBPeriph_DMA1, ENABLE);

}
void GPIO_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;

    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AN;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
    GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}
void DMA_Configuration(void)
{
    DMA_InitTypeDef DMA_InitStructure;

    /* DMA1 channel1 configuration ----------------------------------------------*/
    DMA_DeInit(DMA1_Channel1);
    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t) &(ADC1->DR);
    DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&m_u16ADC_DMAData;
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
    DMA_InitStructure.DMA_BufferSize = MAX_READ_NUM*2;
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
    DMA_InitStructure.DMA_Priority = DMA_Priority_High;
    DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
    DMA_Init(DMA1_Channel1, &DMA_InitStructure);

    /* Enable DMA1 channel1 */
//    DMA_Cmd(DMA1_Channel1, ENABLE);
}


void ADC_Configuration(void)
{
    uint16 i_u16Count = 0xFFFF;
        ADC_InitTypeDef ADC_InitStructure;
    ADC_DeInit(ADC1);
    ADC_StructInit(&ADC_InitStructure);

//        /* ADCCLK = PCLK2/4 */
        RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);   //36

    ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
    ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;
    ADC_Init(ADC1, &ADC_InitStructure);
    ADC_ChannelConfig(ADC1, ADC_Channel_0 , ADC_SampleTime_239_5Cycles);
    ADC_ChannelConfig(ADC1, ADC_Channel_1 , ADC_SampleTime_239_5Cycles);
       
    ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);
        ADC_DMACmd(ADC1, ENABLE);
        ADC_Cmd(ADC1, ENABLE);   
    /* Wait the ADRDY flag */
    do
    {
        i_u16Count--;
    }while((!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN))&&(i_u16Count>0));   
    ADC_GetCalibrationFactor(ADC1);
    /* ADC1 Start Conversion */
    ADC_StartOfConversion(ADC1);
    DMA_Cmd(DMA1_Channel1, ENABLE);
}



m_u16ADC_DMAData里的数据始终为0,我如果用
ADC_StartOfConversion(ADC1);
while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
i_u16Count=ADC_GetConversionValue(ADC1);

这样去读的话直接就死在while循环里了,大家看看是不是我有什么地方没配置准确啊。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2013-12-17
在线时间
36 小时
 楼主| 发表于 2016-7-28 16:35:24 | 显示全部楼层
我测量了进入ADC的电压为1.4V
回复

使用道具 举报

12

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2013-12-17
在线时间
36 小时
 楼主| 发表于 2016-7-29 06:57:40 来自手机 | 显示全部楼层
没人碰到过这个问题吗
回复

使用道具 举报

12

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2013-12-17
在线时间
36 小时
 楼主| 发表于 2016-7-29 07:02:00 来自手机 | 显示全部楼层
103的ADC DMA多路均可实现
回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-7-29 10:23:14 | 显示全部楼层
你把DMA关了,看看可以不
回复

使用道具 举报

12

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2013-12-17
在线时间
36 小时
 楼主| 发表于 2016-7-29 10:41:31 | 显示全部楼层
DMA关了用查询的方式读取就死在while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);现在我试了下USART1也是不成功,好像都跟APB2有关,不知道哪里有问题,
  RCC->CR |= ((uint32_t)RCC_CR_HSEON);

  /* Wait till HSE is ready and if Time out is reached exit */
  do
  {
    HSEStatus = RCC->CR & RCC_CR_HSERDY;
    StartUpCounter++;  
  } while((HSEStatus == 0) && (StartUpCounter != HSE_STARTUP_TIMEOUT));

  if ((RCC->CR & RCC_CR_HSERDY) != RESET)
  {
    HSEStatus = (uint32_t)0x01;
  }
  else
  {
    HSEStatus = (uint32_t)0x00;
  }  

  if (HSEStatus == (uint32_t)0x01)
  {
    /* Enable Prefetch Buffer and set Flash Latency */
    FLASH->ACR = FLASH_ACR_PRFTBE | FLASH_ACR_LATENCY;

    /* HCLK = SYSCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_HPRE_DIV1;
      
    /* PCLK = HCLK */
    RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE_DIV1;

    /* PLL configuration */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
    RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_PREDIV1 | RCC_CFGR_PLLXTPRE_PREDIV1 | RCC_CFGR_PLLMULL6);
            
    /* Enable PLL */
    RCC->CR |= RCC_CR_PLLON;

    /* Wait till PLL is ready */
    do
    {
        i_Count--;          //>1ms(>200us)
    }while(((RCC->CR & RCC_CR_PLLRDY) == 0) && (i_Count > 0));
    /* Select PLL as system clock source */
    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_SW));
    RCC->CFGR |= (uint32_t)RCC_CFGR_SW_PLL;   

    /* Wait till PLL is used as system clock source */
    i_Count = 0x4000;
    do
    {
        i_Count--;          //>1ms(>200us)
    }while((((RCC->CFGR & (uint32_t)RCC_CFGR_SWS) != (uint32_t)RCC_CFGR_SWS_PLL)) && (i_Count > 0));
  }
  else
  { /* If HSE fails to start-up, the application will have wrong clock
         configuration. User can add here some code to deal with this error */
  }  
这个程序里应该已经开了APB2的外设时钟了啊
回复

使用道具 举报

12

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2013-12-17
在线时间
36 小时
 楼主| 发表于 2016-7-29 10:44:26 | 显示全部楼层
APB1上的都能用,TIM2,DAC都没问题,AHB上GPIOB的LED灯也没问题
回复

使用道具 举报

12

主题

44

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2013-12-17
在线时间
36 小时
 楼主| 发表于 2016-7-29 11:03:48 | 显示全部楼层
APB2上加了个TIM15定时器,可以正常使用,说明APB2时钟是有的,真不知道哪里问题了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 02:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表