OpenEdv-开源电子网

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

DMA采取ADC的数据为0不知道是哪里原因

[复制链接]

1

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
55
金钱
55
注册时间
2021-9-8
在线时间
7 小时
发表于 2022-1-17 11:35:44 | 显示全部楼层 |阅读模式
ADC.c中

ADC_HandleTypeDef ADC1_Handler;//ADC3õê¼»ˉ¾ä±ú

ADC_ChannelConfTypeDef ADC1_ChanConf;//í¨μàμľä±ú

DMA_HandleTypeDef  ADC1TxDMA_Handler;      //DMA¾ä±ú

//ADC_MultiModeTypeDef  ADC1_ModeTypeDef;
u16 adc_buf[15];
//3õê¼»ˉADC
//ch: ADC_channels
//í¨μàÖμ 0~16è¡Öμ·¶Î§Îa£oADC_CHANNEL_0~ADC_CHANNEL_16
//sum£o¼¸¸öDòáD£¨í¨μࣩ
void MY_ADC_Init(u8 sum)
{
//                        ADC1_ModeTypeDef.Mode=ADC_MODE_INDEPENDENT;
//                ADC1_ModeTypeDef.TwoSamplingDelay=ADC_TWOSAMPLINGDELAY_5CYCLES;
//                ADC1_ModeTypeDef.DMAAccessMode=ADC_DMAACCESSMODE_DISABLED;
//               
//                HAL_ADCEx_MultiModeConfigChannel(&ADC1_Handler,&ADC1_ModeTypeDef);
                __HAL_RCC_DMA2_CLK_ENABLE(); //ê1ÄüDMA2μÄê±Öó
            //Tx DMAÅäÖÃ
    ADC1TxDMA_Handler.Instance=DMA2_Stream0;                            //êy¾Yá÷Ñ¡Ôñ
    ADC1TxDMA_Handler.Init.Channel=DMA_CHANNEL_0;                                //í¨μàÑ¡Ôñ
    ADC1TxDMA_Handler.Init.Direction=DMA_PERIPH_TO_MEMORY;             //íaéèμ½′æ′¢Æ÷
    ADC1TxDMA_Handler.Init.PeriphInc=DMA_PINC_DISABLE;                 //íaéè·ÇÔöá¿Ä£ê½
    ADC1TxDMA_Handler.Init.MemInc=DMA_MINC_ENABLE;                     //′æ′¢Æ÷Ôöá¿Ä£ê½
    ADC1TxDMA_Handler.Init.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD;    //íaéèêy¾Y3¤¶è:°ë×Ö16λ
    ADC1TxDMA_Handler.Init.MemDataAlignment=DMA_MDATAALIGN_HALFWORD;       //′æ′¢Æ÷êy¾Y3¤¶è:8λ
    ADC1TxDMA_Handler.Init.Mode=DMA_NORMAL;                            //íaéèá÷¿ØÄ£ê½(Õy3£Ä£ê½)
    ADC1TxDMA_Handler.Init.Priority=DMA_PRIORITY_MEDIUM;               //ÖDμèóÅÏ輶
    ADC1TxDMA_Handler.Init.FIFOMode=DMA_FIFOMODE_DISABLE;              
    ADC1TxDMA_Handler.Init.FIFOThreshold=DMA_FIFO_THRESHOLD_HALFFULL ;      
    ADC1TxDMA_Handler.Init.MemBurst=DMA_MBURST_SINGLE;                 //′æ′¢Æ÷í»·¢μ¥′Î′«êä
    ADC1TxDMA_Handler.Init.PeriphBurst=DMA_PBURST_SINGLE;              //íaéèí»·¢μ¥′Î′«êä
               
       
    HAL_DMA_DeInit(&ADC1TxDMA_Handler);   
    HAL_DMA_Init(&ADC1TxDMA_Handler);
    __HAL_LINKDMA(&ADC1_Handler,DMA_Handle,ADC1TxDMA_Handler);    //½«DMAóëUSART1áaÏμÆeà′(·¢ËíDMA)
/* NVIC configuration for DMA transfer complete interrupt */
HAL_NVIC_SetPriority(DMA2_Stream0_IRQn, 1, 0); //??????????
HAL_NVIC_EnableIRQ(DMA2_Stream0_IRQn); //??DMA?????


    ADC1_Handler.Instance=ADC1;
    ADC1_Handler.Init.ClockPrescaler=ADC_CLOCK_SYNC_PCLK_DIV4;  //4·ÖÆ죬ADCCLK=PCLK2/4=108/4=27MHZ
    ADC1_Handler.Init.Resolution=ADC_RESOLUTION_12B;            //12λÄ£ê½
    ADC1_Handler.Init.DataAlign=ADC_DATAALIGN_RIGHT;            //óò¶ÔÆë
    ADC1_Handler.Init.ScanConvMode=ENABLE;                             //é¨ÃèÄ£ê½
    ADC1_Handler.Init.EOCSelection=ADC_EOC_SINGLE_CONV;                                                   //1رÕEOCÖD¶Ï
    ADC1_Handler.Init.ContinuousConvMode=ENABLE;                      //á¬Dø×a»»
    ADC1_Handler.Init.NbrOfConversion=sum;                      //2¸ö×a»»Ôú1æÔòDòáDÖD ¼¸¸öêǼ¸
    ADC1_Handler.Init.DiscontinuousConvMode=DISABLE;            //½ûÖ12»á¬Dø2éÑùÄ£ê½
    ADC1_Handler.Init.NbrOfDiscConversion=0;                    //2»á¬Dø2éÑùí¨μàêyÎa0
    ADC1_Handler.Init.ExternalTrigConv=ADC_SOFTWARE_START;      //èí¼t′¥·¢
    ADC1_Handler.Init.ExternalTrigConvEdge=ADC_EXTERNALTRIGCONVEDGE_NONE;//ê1óÃèí¼t′¥·¢
    ADC1_Handler.Init.DMAContinuousRequests=ENABLE;            //1رÕDMAÇëÇó
    HAL_ADC_Init(&ADC1_Handler);                                //3õê¼»ˉ     
               
                ADC1_ChanConf.Channel=ADC_CHANNEL_0;                                   //í¨μà
    ADC1_ChanConf.Rank=1;                                       //2¸öDòáD   ¼¸¸öêǼ¸
    ADC1_ChanConf.SamplingTime=ADC_SAMPLETIME_480CYCLES;        //2éÑùê±¼ä
    ADC1_ChanConf.Offset=0;                 
    HAL_ADC_ConfigChannel(&ADC1_Handler,&ADC1_ChanConf);        //í¨μàÅäÖÃ

                ADC1_ChanConf.Channel=ADC_CHANNEL_5;                                   //í¨μà
    ADC1_ChanConf.Rank=2;                                       //2¸öDòáD   ¼¸¸öêǼ¸
    ADC1_ChanConf.SamplingTime=ADC_SAMPLETIME_480CYCLES;        //2éÑùê±¼ä
    ADC1_ChanConf.Offset=0;                 
    HAL_ADC_ConfigChannel(&ADC1_Handler,&ADC1_ChanConf);        //í¨μàÅäÖÃ

                ADC1_ChanConf.Channel=ADC_CHANNEL_TEMPSENSOR;                                   //í¨μà
    ADC1_ChanConf.Rank=3;                                       //2¸öDòáD   ¼¸¸öêǼ¸
    ADC1_ChanConf.SamplingTime=ADC_SAMPLETIME_480CYCLES;        //2éÑùê±¼ä
    ADC1_ChanConf.Offset=0;                 
    HAL_ADC_ConfigChannel(&ADC1_Handler,&ADC1_ChanConf);        //í¨μàÅäÖÃ
    HAL_ADC_Start_DMA(&ADC1_Handler,(uint32_t*)adc_buf,15);      //¿aÆôADC  ¾ä±ú£¬′æ′¢Æ÷μÄμØÖ·£¬3¤¶è
//    HAL_ADC_PollForConversion(&ADC1_Handler,10);                //ÂÖÑˉ×a»»  μè′y×a»»íê3é



}


main中
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "lcd.h"
#include "sdram.h"
#include "adc.h"
#include "dma.h"
/************************************************
ALIENTEK °¢2¨ÂTSTM32F7¿a·¢°å êμÑé21
Äú2¿Î¶è′«¸DÆ÷êμÑé-HAL¿aoˉêy°æ
¼¼êõÖ§3Ö£owww.openedv.com
ìÔ±|μêÆì£ohttp://eboard.taobao.com
1Øע΢DÅ1«Öúƽì¨Î¢DÅoÅ£o"ÕyμãÔ-×ó"£¬Ãa·Ñ»ñè¡STM32×êáÏ¡£
1ãÖYêDDÇòíμç×ó¿Æ¼¼óDÏT1«Ë¾  
×÷ÕߣoÕyμãÔ-×ó @ALIENTEK
************************************************/

//extern ADC_HandleTypeDef ADC1_Handler;//ADC¾ä±ú

extern  u16 adc_buf[15];
float com[3];
float adc_bufmoni[3]= {0};

int main(void)
{
                 u16 adcx;

    short temp;
    Cache_Enable();                 //′ò¿aL1-Cache
    HAL_Init();                                        //3õê¼»ˉHAL¿a
    Stm32_Clock_Init(432,25,2,9);   //éèÖÃê±Öó,216Mhz
    delay_init(216);                //Ñóê±3õê¼»ˉ
                uart_init(115200);                        //′®¿ú3õê¼»ˉ
    LED_Init();                     //3õê¼»ˉLED
    KEY_Init();                     //3õê¼»ˉ°′¼ü
    SDRAM_Init();                   //3õê¼»ˉSDRAM
    LCD_Init();                     //LCD3õê¼»ˉ
          MY_ADC_Init(3);                  //3õê¼»ˉADC1í¨μà5//sum£o¼¸¸öDòáD£¨í¨μࣩ
//            HAL_ADC_Start_DMA(&ADC1_Handler,(uint32_t*)adc_buf,15);      //¿aÆôADC  ¾ä±ú£¬′æ′¢Æ÷μÄμØÖ·£¬3¤¶è

                        MYDMA_Config(DMA2_Stream0,DMA_CHANNEL_0);
               
          POINT_COLOR=RED;

        LCD_ShowString(30,190,200,16,16,"ATOM@ALIENTEK");
        LCD_ShowString(30,210,200,16,16,"2016/7/12");          
        POINT_COLOR=BLUE;//éèÖÃ×ÖìåÎaà¶é«
        LCD_ShowString(30,230,200,16,16,"ADC1_CH5_VAL:");             
        LCD_ShowString(30,250,200,16,16,"ADC1_CH5_VOL:0.000V");        //ÏèÔú1춨λÖÃÏÔê¾D¡êyμã            
       
        POINT_COLOR=RED;
        LCD_ShowString(30,50,200,16,16,"Apollo STM32F4/F7");       
        LCD_ShowString(30,70,200,16,16,"Temperature TEST");
        LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
        LCD_ShowString(30,110,200,16,16,"2015/12/27");          
        POINT_COLOR=BLUE;//éèÖÃ×ÖìåÎaà¶é«      
        LCD_ShowString(30,140,200,16,16,"TEMPERATE: 00.00C");//ÏèÔú1춨λÖÃÏÔê¾D¡êyμã                
// HAL_ADC_Start(&ADC1_Handler);                               //¿aÆôADC
  while(1)
        {
                        adc_bufmoni[0] = (float)adc_buf[0]/4096*(float)3.3;
                        adc_bufmoni[1] = (float)adc_buf[1]/4096*(float)3.3;
                        adc_bufmoni[2] = (float)adc_buf[2]*(3.3/4096);                //μçÑ1Öμ
//                        adc_bufmoni[2] = (adc_bufmoni[2]-0.76)/0.0025 + 25; //×a»»ÎaζèÖμ
//                        adc_bufmoni[2]=adc_bufmoni[2]*=100;                                        //à©′ó100±¶.
               
                adcx = adc_bufmoni[0];               
                LCD_ShowxNum(134,190,adcx,1,16,0);
                adc_bufmoni[0]-=adcx;
                adc_bufmoni[0]*=1000;
                LCD_ShowxNum(150,190,adc_bufmoni[0],3,16,0X80);
               
                adcx = adc_bufmoni[1];
                LCD_ShowxNum(134,210,adcx,1,16,0);
                adc_bufmoni[1]-=adcx;
                adc_bufmoni[1]*=1000;
                LCD_ShowxNum(150,210,adc_bufmoni[1],3,16,0X80);
               



//                        adcx=Get_Adc_Average(ADC_CHANNEL_5,1,10);//»ñè¡í¨μà5μÄ×a»»Ö죬¼¸¸öDòáD£¨í¨μࣩ£¬20′Îè¡Æ½¾ù
//                        LCD_ShowxNum(134,230,adcx,4,16,0);    //ÏÔê¾ADCC2éÑùoóμÄÔ-ê¼Öμ
//                        com[0]=(float)adcx*(3.3/4096);          //»ñ衼ÆËãoóμÄ′øD¡êyμÄêμ¼êμçÑ1Ö죬±èèç3.1111
//                        adcx=com[0];                            //¸3ÖμÕûêy2¿·Ö¸øadcx±äá¿£¬òòÎaadcxÎau16ÕûDÎ
//                        LCD_ShowxNum(134,250,adcx,1,16,0);    //ÏÔê¾μçÑ1ÖμμÄÕûêy2¿·Ö£¬3.1111μÄ»°£¬Õaàï¾íêÇÏÔê¾3
//                        com[0]-=adcx;                           //°ÑòѾ-ÏÔê¾μÄÕûêy2¿·Öè¥μô£¬áôÏÂD¡êy2¿·Ö£¬±èèç3.1111-3=0.1111
//                        com[0]*=1000;                           //D¡êy2¿·Ö3ËòÔ1000£¬àyèç£o0.1111¾í×a»»Îa111.1£¬Ïàμ±óú±£áôèyλD¡êy¡£
//                        LCD_ShowxNum(150,250,com[0],3,16,0X80); //ÏÔê¾D¡êy2¿·Ö£¨Ç°Ãæ×a»»ÎaáËÕûDÎÏÔê¾£©£¬ÕaàïÏÔê¾μľíêÇ111.

//                        adcx=Get_Adc_Average(ADC_CHANNEL_0,1,10);//»ñè¡í¨μà5μÄ×a»»Ö죬¼¸¸öDòáD£¨í¨μࣩ£¬20′Îè¡Æ½¾ù
//                        LCD_ShowxNum(134,280,adcx,4,16,0);    //ÏÔê¾ADCC2éÑùoóμÄÔ-ê¼Öμ
//                        com[1]=(float)adcx*(3.3/4096);          //»ñ衼ÆËãoóμÄ′øD¡êyμÄêμ¼êμçÑ1Ö죬±èèç3.1111
//                        adcx=com[1];                            //¸3ÖμÕûêy2¿·Ö¸øadcx±äá¿£¬òòÎaadcxÎau16ÕûDÎ
//                        LCD_ShowxNum(134,300,adcx,1,16,0);    //ÏÔê¾μçÑ1ÖμμÄÕûêy2¿·Ö£¬3.1111μÄ»°£¬Õaàï¾íêÇÏÔê¾3
//                        com[1]-=adcx;                           //°ÑòѾ-ÏÔê¾μÄÕûêy2¿·Öè¥μô£¬áôÏÂD¡êy2¿·Ö£¬±èèç3.1111-3=0.1111
//                        com[1]*=1000;                           //D¡êy2¿·Ö3ËòÔ1000£¬àyèç£o0.1111¾í×a»»Îa111.1£¬Ïàμ±óú±£áôèyλD¡êy¡£
//                        LCD_ShowxNum(150,300,com[1],3,16,0X80); //ÏÔê¾D¡êy2¿·Ö£¨Ç°Ãæ×a»»ÎaáËÕûDÎÏÔê¾£©£¬ÕaàïÏÔê¾μľíêÇ111.
//                       
                       
                               
//                        temp=Get_Temprate(1);        //μÃμ½Î¶èÖμ //sum£o¼¸¸öDòáD£¨í¨μࣩ
                        if(temp<0)
                        {
                                temp=-temp;
                                LCD_ShowString(30+10*8,140,16,16,16,"-");            //&#207;&#212;ê&#190;&#184;oo&#197;
                        }else LCD_ShowString(30+10*8,140,16,16,16," ");        //&#206;T·&#251;o&#197;       
                        LCD_ShowxNum(30+11*8,140,temp/100,2,16,0);                //&#207;&#212;ê&#190;&#213;&#251;êy2&#191;·&#214;
                        LCD_ShowxNum(30+14*8,140,temp%100,2,16,0);                //&#207;&#212;ê&#190;D&#161;êy2&#191;·&#214;
                         
//                        LED0_Toggle;
//                        delay_ms(250);       
        }
}


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

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 05:57

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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