打印
[STM32F0]

调试STM32F051ADC DMA方式时出现问题

[复制链接]
3117|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 missing01 于 2014-3-30 08:13 编辑

//#include <stm32f0xx_lib.h>
#include <stdint.h>
#include <system_stm32f0xx.h>
#include <stm32f0xx_gpio.h>
#include <Main.h>
#include "systick.h"
#include "LCD32.h"
#include "font.h"

#define ADC1_DR_Address                0x40012440
volatile uint16_t RegularConvData_Tab;  //ÓÃÓÚ´¢´æ´ÓADC¶Áµ½µÄÖµ
void LedInit()
{
        
        GPIO_InitTypeDef gpiostudy;
        
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB ,ENABLE);//ʹÄÜAHBÍâÉèGPIOBʱÖÓ
        gpiostudy.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6
        |GPIO_Pin_7;
        gpiostudy.GPIO_Mode=GPIO_Mode_OUT;
        gpiostudy.GPIO_Speed=GPIO_Speed_50MHz;
        gpiostudy.GPIO_PuPd=GPIO_PuPd_NOPULL;
        gpiostudy.GPIO_OType = GPIO_OType_PP;
        GPIO_Init(GPIOB,&gpiostudy);  

        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC ,ENABLE);//ʹÄÜAHBÍâÉèGPIOCʱÖÓ
        gpiostudy.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6
        |GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14;
        gpiostudy.GPIO_Mode=GPIO_Mode_OUT;
        gpiostudy.GPIO_Speed=GPIO_Speed_50MHz;
        gpiostudy.GPIO_PuPd=GPIO_PuPd_NOPULL;
        gpiostudy.GPIO_OType = GPIO_OType_PP;   
        GPIO_Init(GPIOC,&gpiostudy);  
        
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA ,ENABLE);//ʹÄÜAHBÍâÉèGPIOAʱÖÓ
        gpiostudy.GPIO_Pin=GPIO_Pin_11;
        gpiostudy.GPIO_Mode=GPIO_Mode_OUT;
        gpiostudy.GPIO_Speed=GPIO_Speed_50MHz;
        gpiostudy.GPIO_PuPd=GPIO_PuPd_NOPULL;
        gpiostudy.GPIO_OType = GPIO_OType_PP;
        GPIO_Init(GPIOA,&gpiostudy);
}

/********************************************************************************
º¯ÊýÃû£ºADC_DMA_Config
¹¦ÄÜ£ºADC DMA³õʼ»¯£¬ADCͨµÀÑ¡Ôñ
*******************************************************************************/
void   ADC_DMA_Config()
{
        ADC_InitTypeDef     ADC_InitStruct;
  DMA_InitTypeDef     DMA_InitStruct;
        GPIO_InitTypeDef    GPIO_InitStruct;
        
        
        /* Enable  GPIOA clock */
        //  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
  /* ADC1 Periph clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
  /* DMA1 clock enable */
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 , ENABLE);
         /* Configure PA.0  as analog input */

        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AN;
        GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL ;
  GPIO_Init(GPIOA, &GPIO_InitStruct);                                 // PA0,ÊäÈëʱ²»ÓÃÉèÖÃËÙÂÊ
        
        
          /* DMA1 Channel1 Config */
  DMA_DeInit(DMA1_Channel1);
  DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_Address;  //ÉèÖÃÍâÉè»ùµØÖ·
  DMA_InitStruct.DMA_MemoryBaseAddr = (uint32_t)&RegularConvData_Tab;
  DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC;
  DMA_InitStruct.DMA_BufferSize =4;
  DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  DMA_InitStruct.DMA_Mode = DMA_Mode_Circular;
  DMA_InitStruct.DMA_Priority = DMA_Priority_High;
  DMA_InitStruct.DMA_M2M = DMA_M2M_Disable;
  DMA_Init(DMA1_Channel1, &DMA_InitStruct);
        
        //   /* ADC DMA request in circular mode */
  ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);
          /* DMA1 Channel1 enable */
  DMA_Cmd(DMA1_Channel1, ENABLE);
        
        //   /* ADC DMA request in circular mode */
  ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);
        
        /* Initialize ADC structure */
  ADC_StructInit(&ADC_InitStruct);
        
         ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b;
  ADC_InitStruct.ADC_ContinuousConvMode = ENABLE;
  ADC_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStruct.ADC_ScanDirection = ADC_ScanDirection_Backward;
  ADC_Init(ADC1, &ADC_InitStruct);
        
        //   /* Convert the ADC1 temperature sensor  with 55.5 Cycles as sampling time */
//   ADC_ChannelConfig(ADC1, ADC_Channel_TempSensor , ADC_SampleTime_55_5Cycles);  
//   ADC_TempSensorCmd(ENABLE);
  
  /* Convert the ADC1 Vref  with 55.5 Cycles as sampling time */
  ADC_ChannelConfig(ADC1, ADC_Channel_1  , ADC_SampleTime_55_5Cycles);
  // ADC_VrefintCmd(ENABLE);
  
  /* ADC Calibration */
  ADC_GetCalibrationFactor(ADC1);
   ADC_DMACmd(ADC1, ENABLE);
         
         
  /* Enable ADC1 */
  ADC_Cmd(ADC1, ENABLE);     
  
  /* Wait the ADCEN falg */
  while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));
  
  /* ADC1 regular Software Start Conv */
  ADC_StartOfConversion(ADC1);  //加上这个函数,LCD显示出问题,不加这个函数,LCD显示正常
}






int main()
{
                 
        SystemInit();
//        ADC_DMA_Config();
        //GPIO_DeInit(GPIOB);
//        GPIO_DeInit(GPIOC);
        LedInit();
//        Uart_NVICInit();
//        SysTick_Config(SysTick_CLKSource_HCLK);   //sistickʱÖÓԴΪAHB ʱÖÓ
        GPIO_ResetBits(GPIOA,GPIO_Pin_11);//µÆÁÁ
        Systick_NVICInit();
        
//        Delay(2000);
        
        BACK_COLOR=BLACK;
POINT_COLOR=WHITE;
        
        Lcd_Init();
        
//        
/*        GPIO_SetBits(GPIOA,GPIO_Pin_11);//µÆÃðÁ
        Delay(2000);
        LCD_Clear(RED);  
        GPIO_ResetBits(GPIOA,GPIO_Pin_11);//µÆÁÁ
         Delay(3000);
         LCD_Clear(GREEN);
         Delay(3000);
LCD_WR_DATA8(0x0f,0x0f);
         */
//        
        //
//        LCD_DrawPoint_big(100,100);
//        LCD_DrawPoint(100,100);
//LCD_Fill(0,0,120,120,BLUE);
//LCD_DrawLine(0,0,150,150);
//        LCD_DrawRectangle(100,100,200,200);
//Draw_Circle(100,100,100);
//LCD_ShowNum(100,100,102,3);//ʧ°Ü
//        LCD_ShowChar(10,10,'a',0);//ʧ°Ü
                LCD_Clear(BLACK);
        LCD_ShowString(55,30,"ADC-DMA TEST");
        
//        showhanzi(100,100,0);
//        showhanzi(135,100,1);
        //showhanzi(170,100,2);
//showimage();
        while(1)
         {               
                GPIO_ResetBits(GPIOA,GPIO_Pin_11);
                 Delay(1000);  //1s
                 GPIO_SetBits(GPIOA,GPIO_Pin_11);
                 Delay(2000);  //1s¡
                 
                // ADC_ConvertedValueLocal= RegularConvData_Tab;
                         Delay(1000);  //1s
                        LCD_ShowString(20,60,"adc  value:");
                        LCD_ShowNum(100,60,RegularConvData_Tab,4);
                // ADC1->CR&=(~(1<<2))|(~(1<<0));
                 // ADC1->CR|=(1<<2);
                 
         }
}

好-1756165766IMG_20140330_075019.jpg (46.27 KB )

好-1756165766IMG_20140330_075019.jpg

cha-1475664923IMG_20140330_080908.jpg (45.54 KB )

cha-1475664923IMG_20140330_080908.jpg
沙发
missing01|  楼主 | 2014-3-30 08:19 | 只看该作者
本帖最后由 missing01 于 2014-3-30 08:20 编辑

加上ADC_StartOfConversion(ADC1);  这个函数后  LCD几乎就是什么都看不见了一片模糊。/**
  * @brief  Start Conversion for the selected ADC channels.
  * @NOTE   In continuous mode, ADSTART is not cleared by hardware with the
  *         assertion of EOSEQ because the sequence is automatic relaunched
  * @param  ADCx: where x can be 1 to select the ADC1 peripheral.
  * @retval None
  */
void ADC_StartOfConversion(ADC_TypeDef* ADCx)
{
  /* Check the parameters */
  assert_param(IS_ADC_ALL_PERIPH(ADCx));
  
  ADCx->CR |= (uint32_t)ADC_CR_ADSTART;
        //        ADCx->CR|=(1<<2);
}
  这个是这个函数的源码,就两句话。  真正让屏变模糊的就是第二句话。让ADC启动。    只要不让ADC启动,LCD显示正常。LCD显示不正常的情况下,我看了一下ADC的值,差不多是准确转换。  但是这个就是一句对ADC寄存器的操作。我不明白为啥为影响到**作LCD的那部分呢??一般这种情况是什么原因造成的呢?求高手指点一下。

使用特权

评论回复
板凳
missing01|  楼主 | 2014-3-31 08:49 | 只看该作者
可能是哪方面的问题呢??

使用特权

评论回复
地板
missing01|  楼主 | 2014-4-1 09:11 | 只看该作者
可能的原因有什么呢?自己实在无思路了

使用特权

评论回复
5
missing01|  楼主 | 2014-4-2 11:19 | 只看该作者
??

使用特权

评论回复
6
missing01|  楼主 | 2014-4-2 11:24 | 只看该作者
我的LCD  数据口用了GPIOC  和GPIOB的低八位。控制脚用也没有用到AD采样用的PA1 。不知道为啥启动AD的操作会影响LCD的显示呢??

使用特权

评论回复
7
pfliudq| | 2014-4-2 22:07 | 只看该作者
检查一下寄存器的配置。

使用特权

评论回复
8
Wayner| | 2015-8-11 21:10 | 只看该作者
是时钟问题吧?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

115

帖子

2

粉丝